标签: htmlunit

HtmlUnit的稳定性和快速性

我正在从selenium-1升级到selenium-2并试用新的HtmlUnit驱动程序.我已经尝试了一些基本的测试(打开一个页面,get_text,..)似乎

  1. 非常慢(我认为chrome/FF远程驱动程序比它快)
  2. 非常不稳定(使用HTMLUNIT和HTMLUNITWITHJS打开yahoo.com都会导致错误)

我很高兴听到你对它的印象.我希望你会发现我错了(我可以没有(1)速度但(2)稳定性至关重要)?是否有HtmlUnit与selenium驱动程序的速度比较?

selenium webdriver selenium-rc htmlunit selenium-webdriver

7
推荐指数
1
解决办法
6111
查看次数

如何使用HTML-Unit截取屏幕截图?

我来自德国,请原谅我的一些不好的句子.

我编写了一个基于Web的应用程序,我不想在代码的一部分中对页面进行屏幕截图.

我正在使用HTML-Unit,所以我想知道如何使用它,如果我需要在整个项目中更改它,那将是不好的.

期待一个答案,真诚地,一位客人

screenshot htmlunit

7
推荐指数
1
解决办法
8082
查看次数

HTMLUNIT getformbyname,网站中未指定表单名称

我正在尝试使用HTMLUNIT在网站上找到一个按钮我遵循本教程http://htmlunit.sourceforge.net/gettingStarted.html但它需要一个表单名称.我正在尝试做的网站有这个页面来源.

<form method="post" action="doDelete">
     Are you sure you want to delete 'Apple?'?
 <input name="Submit" value="Yes" class="submit-button" type="submit" />
 </form>
Run Code Online (Sandbox Code Playgroud)

我正在尝试单击网页上的"是"按钮验证框.(删除按钮)如您所见,没有提供表单名称.这是我的代码.

 final WebClient webClient = new WebClient();
        final HtmlPage page1 = webClient.getPage("http://ma.some-site.com:8080/user/mike/delete");



        List<HtmlForm> formlist = (List<HtmlForm>) page1.getForms();
       System.out.println(formlist.toString());

        final HtmlForm form = page1.getFormByName("myform"); <---Problem here
       final HtmlSubmitInput button = form.getInputByName("Submit");
       button.click();
        webClient.closeAllWindows();
Run Code Online (Sandbox Code Playgroud)

我尝试了这个但是没有用

  final HtmlForm form =   page1.getFormByName(formlist.get(1).getLocalName());
Run Code Online (Sandbox Code Playgroud)

我相信你可以使用xpath来查找表单名称?

java xpath htmlunit

7
推荐指数
1
解决办法
7648
查看次数

在HTMLUnit中禁用CSS的权衡是什么?

我在HTMLUnit 2.12中经历了缓慢,因此在HTMLUnit中解释了禁用CSS :超慢执行?.

我想了解权衡取舍.这是否意味着我不能使用XPath选择器?还有其他权衡吗?

java performance htmlunit

7
推荐指数
1
解决办法
1539
查看次数

HTMLUnit:更改用户代理字符串

我在我的Java项目中使用HtmlUnit来测试一个内部有Javascript的网页.我的代码点击一个调用Javascript函数的按钮,将用户重定向到另一个页面(如链接缩短服务).这是代码:

public void click()
{
    WebClient webClient = new WebClient();
    HtmlPage page = webClient.getPage("http://mywebsite.com");
    HtmlImage a = page.getHtmlElementById("my_button");
    page = (HtmlPage) a.click();
}
Run Code Online (Sandbox Code Playgroud)

问题是HTMLUnit使用默认的用户代理(Internet Explorer 8),只有少数设置(Firefox 17和Chrome).如果检测到另一个浏览器/用户代理,mywebsite.com的行为不会更改.顺便说一下,网站存储用户代理字符串用于统计目的,每次访问时我都需要更改它.

我试图通过BrowserVersion以这种方式创建一个新对象来更改用户代理:

BrowserVersion bv = new BrowserVersion("Chrome", "Mozilla/5.0", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", 28);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,当我实例化传递我的bv对象的Webclient 对象时,我的代码不再起作用了.根据我的理解,HtmlUnit文档说我必须检查我的BrowserVersion中指定的用户代理是否具有运行Javascript的正确功能.

但是,请注意常量不足以完全自定义浏览器,您还需要查看BrowserVersionFeatures和"javascript"包中的类.

这是什么意思?为什么HtmlUnit不再起作用?我的目标只是更改用户代理字符串.我怎样才能做到这一点?请注意,我也尝试过Selenium,但没有成功.谢谢您的帮助.

编辑1:

找到了这个技巧.如果我实例化BrowserVersion如下:

BrowserVersion bv = new BrowserVersion("Netscape", "blablabla", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", 0);
Run Code Online (Sandbox Code Playgroud)

它有效,但我不明白为什么.我必须将第一个字符串设置为Netscape(尝试过Chrome和Mozilla,但它不起作用).第二个字符串是随机的,如果将Netscape设置为第一个参数,我可以放任何东西.第三个字符串是格式良好的用户代理,第四个参数是指示版本的整数.你能解释一下为什么它只Netscape作为第一个参数传递并随机传递给其他人(第二个除外)吗?

更新:

有时它不起作用(如上所述).对于某些用户代理字符串,页面未正确加载.我无法理解为什么用户代理应该修改HtmlUnit的行为,因为我很确定Javascript非常简单并且应该由所有浏览器版本运行.所以,我的最后一个问题是:如何在不改变执行Javascript时的行为的情况下更改HtmlUnit中的用户代理字符串?

javascript user-agent htmlunit

7
推荐指数
1
解决办法
8800
查看次数

HtmlUnit关闭所有windows内存泄漏

HtmlUnit似乎不会关闭webclient中的窗口,从而造成内存泄漏.我正在尝试使用HtmlUnit获取一个页面并将其传递给JSoup进行解析.我知道JSoup可以连接到一个页面,但我需要使用这种方法,因为我需要在解析它们之前在某些站点上保持登录会话.

这是代码:

import java.io.IOException;
import java.net.MalformedURLException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class HtmlUnitLeakTest {

public static void main(String args[]) throws FailingHttpStatusCodeException, MalformedURLException, IOException{

        WebClient webClient = new WebClient(BrowserVersion.CHROME);
        webClient.getOptions().setPrintContentOnFailingStatusCode(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.getOptions().setCssEnabled(false);

        for(int i = 0; i < 500; i++){
            HtmlPage page = webClient.getPage("http://www.stackoverflow.com");
            Document doc = Jsoup.parse(page.asXml());
            webClient.closeAllWindows();
            System.out.println(i);
            if((i % 5 == 0)){
                System.out.println(i);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

随着这个运行,内存不断攀升,在我的调试屏幕中,我可以看到所有窗口仍然在webclient下被引用而未关闭.

我已经看到这个代码是假设关闭这些窗口:

List<WebWindow> windows = webclient.getWebWindows();
for (WebWindow ww : windows) …
Run Code Online (Sandbox Code Playgroud)

java memory-leaks htmlunit

7
推荐指数
1
解决办法
2853
查看次数

htmlunit无法从undefined中读取属性"push"

我正在尝试使用htmlunit抓取网站.每当我运行它,它只输出以下错误:

Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "push" from undefined (https://www.kinoheld.de/dist/prod/0.4.7/widget.js#1)
Run Code Online (Sandbox Code Playgroud)

现在我对JS不太了解,但我读到的push是某种数组操作.这对我来说似乎是标准的,我不知道为什么htmlunit不支持它.

这是我到目前为止使用的代码:

public static void main(String[] args) throws IOException {
    WebClient web = new WebClient(BrowserVersion.FIREFOX_45);
    web.getOptions().setUseInsecureSSL(true);
    String url = "https://www.kinoheld.de/kino-muenchen/royal-filmpalast/vorstellung/280823/?mode=widget&showID=280828#panel-seats";
    web.getOptions().setThrowExceptionOnFailingStatusCode(false);
    web.waitForBackgroundJavaScript(9000);
    HtmlPage response = web.getPage(url);

    System.out.println(response.getTitleText());
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?有没有办法绕过这个或解决这个问题的方法?提前致谢!

java web-crawler htmlunit

7
推荐指数
2
解决办法
468
查看次数

HtmlUnit css未正确应用

我尝试使用HtmlUnit保存谷歌页面.但我无法获得适当的用户界面.当我检查保存的页面代码时,样式标签为空.

我的代码在这里.

public static void main(String[] args) throws IOException {

    FileUtils.cleanDirectory(new File("/home/user1/Documents/Aaa")); 
    WebClient webClient = new WebClient(BrowserVersion.CHROME);
    webClient.getOptions().setCssEnabled(true);
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.waitForBackgroundJavaScriptStartingBefore(1000);
    webClient.waitForBackgroundJavaScript(1000);
    webClient.getOptions().setTimeout(5000);
    System.out.println("******************loaded**********************************");
    try {
        HtmlPage page = webClient.getPage("https://www.google.com");
        page.save(new File("/home/user1/Documents/Aaa/index.html"));
    } catch (Exception e) {
        System.out.println("******************catch***********************************");
        e.printStackTrace();
    }
    webClient.close();
    System.out.println("******************finished********************************");
}
Run Code Online (Sandbox Code Playgroud)

我的页面看起来像

在此输入图像描述

控制台日志

Dec 10, 2016 3:47:45 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
Dec 10, 2016 3:47:46 PM com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError
SEVERE: runtimeError: message=[TypeError: object is not iterable] sourceName=[https://www.google.co.in/xjs/_/js/k=xjs.s.en.igGBAtxEWN0.O/m=sx,c,sb,cdos,cr,elog,hsm,jsa,r,qsm,j,p,d,csi/am=AAiUPF6wAOL_ISBuIRxBasDAoA/rt=j/d=1/t=zcms/rs=ACT90oGjQTdwqicso-l4vNE-7GeAqTtjtw] line=[10] lineSource=[null] lineOffset=[0]
Dec 10, 2016 …
Run Code Online (Sandbox Code Playgroud)

css java htmlunit

7
推荐指数
1
解决办法
1502
查看次数

在HTML单元中跳过特定的Javascript执行

我有一个URL.我想在执行Java Scripts后获取URL的Page-Source.

使用HtmlUnit获取页面源:URL卡住了

最初我怀疑这是由于系统资源和高CPU使用率导致URL卡住了.

然后我尝试在HTML UNIT 2.9和2.11上运行它.它在解析时都遇到了问题.请参阅上面的问题,以获取卡住的HTML UNIT代码.

现在我怀疑这可能是由于JS Execution进入无限循环.

我想检查哪些JS文件导致问题并将其从执行中删除.

如果他们是谷歌分析,推特等网站的JS,我可能根本不需要它们.

所以我想找到一种方法告诉HTML单元忽略某些JS文件并执行其余的.

有谁知道怎么做?

htmlunit

6
推荐指数
1
解决办法
1838
查看次数

使用HtmlUnit进行抓取时出现OutOfMemoryError

我正在使用HtmlUnit登录到一个站点,然后从表中下载数据

当我运行我的代码是导致java.lang.OutOfMemoryError并且无法进一步运行.

以下是我的代码:

WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_6);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setRedirectEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
                            webClient.getOptions().setPrintContentOnFailingStatusCode(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setTimeout(50000);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setPopupBlockerEnabled(true);

HtmlPage htmlPage=webClient.getPage(url);
Thread.sleep(200);
                            //~~~~~~~Log-In
HtmlTextInput uname=(HtmlTextInput)htmlPage.getFirstByXPath("//*[@id=\"username\"]");
uname.setValueAttribute("xxx");
HtmlPasswordInput upass=(HtmlPasswordInput)htmlPage.getFirstByXPath("//*[@id=\"password\"]");
upass.setValueAttribute("xxx");
HtmlSubmitInput submit=(HtmlSubmitInput)htmlPage.getFirstByXPath("//*[@id=\"login-button\"]/input");
htmlPage=(HtmlPage) submit.click();
Thread.sleep(200);
webClient.waitForBackgroundJavaScript(10000);
for (int i = 0; i < 250; i++) {
 if (!htmlPage.asText().contains("Loading...")) {
     break;
  }
    synchronized (htmlPage) {
     htmlPage.wait(500);
 }
}

System.out.println(htmlPage.asText());
Run Code Online (Sandbox Code Playgroud)

以下是stackTrace

java.lang.OutOfMemoryError: Java heap space
at net.sourceforge.htmlunit.corejs.javascript.Node.newString(Node.java:155)
at net.sourceforge.htmlunit.corejs.javascript.Node.newString(Node.java:151)
at net.sourceforge.htmlunit.corejs.javascript.IRFactory.createPropertyGet(IRFactory.java:1990)
at net.sourceforge.htmlunit.corejs.javascript.IRFactory.transformPropertyGet(IRFactory.java:968)
at net.sourceforge.htmlunit.corejs.javascript.IRFactory.transform(IRFactory.java:106)
at net.sourceforge.htmlunit.corejs.javascript.IRFactory.transformPropertyGet(IRFactory.java:964)
at net.sourceforge.htmlunit.corejs.javascript.IRFactory.transform(IRFactory.java:106)
at net.sourceforge.htmlunit.corejs.javascript.IRFactory.transformPropertyGet(IRFactory.java:964)
at …
Run Code Online (Sandbox Code Playgroud)

java htmlunit web-scraping tomcat7

6
推荐指数
1
解决办法
958
查看次数