我正在从selenium-1升级到selenium-2并试用新的HtmlUnit驱动程序.我已经尝试了一些基本的测试(打开一个页面,get_text,..)似乎
我很高兴听到你对它的印象.我希望你会发现我错了(我可以没有(1)速度但(2)稳定性至关重要)?是否有HtmlUnit与selenium驱动程序的速度比较?
我来自德国,请原谅我的一些不好的句子.
我编写了一个基于Web的应用程序,我不想在代码的一部分中对页面进行屏幕截图.
我正在使用HTML-Unit,所以我想知道如何使用它,如果我需要在整个项目中更改它,那将是不好的.
期待一个答案,真诚地,一位客人
我正在尝试使用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>
我正在尝试单击网页上的"是"按钮验证框.(删除按钮)如您所见,没有提供表单名称.这是我的代码.
 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();
我尝试了这个但是没有用
  final HtmlForm form =   page1.getFormByName(formlist.get(1).getLocalName());
我相信你可以使用xpath来查找表单名称?
我在我的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();
}
问题是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);
顺便说一句,当我实例化传递我的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);
它有效,但我不明白为什么.我必须将第一个字符串设置为Netscape(尝试过Chrome和Mozilla,但它不起作用).第二个字符串是随机的,如果将Netscape设置为第一个参数,我可以放任何东西.第三个字符串是格式良好的用户代理,第四个参数是指示版本的整数.你能解释一下为什么它只Netscape作为第一个参数传递并随机传递给其他人(第二个除外)吗?
更新:
有时它不起作用(如上所述).对于某些用户代理字符串,页面未正确加载.我无法理解为什么用户代理应该修改HtmlUnit的行为,因为我很确定Javascript非常简单并且应该由所有浏览器版本运行.所以,我的最后一个问题是:如何在不改变执行Javascript时的行为的情况下更改HtmlUnit中的用户代理字符串?
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);
            }
        }
    }
}
随着这个运行,内存不断攀升,在我的调试屏幕中,我可以看到所有窗口仍然在webclient下被引用而未关闭.
我已经看到这个代码是假设关闭这些窗口:
List<WebWindow> windows = webclient.getWebWindows();
for (WebWindow ww : windows) …我正在尝试使用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)
现在我对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());
}
我错过了什么?有没有办法绕过这个或解决这个问题的方法?提前致谢!
我尝试使用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********************************");
}
我的页面看起来像
控制台日志
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 …我有一个URL.我想在执行Java Scripts后获取URL的Page-Source.
最初我怀疑这是由于系统资源和高CPU使用率导致URL卡住了.
然后我尝试在HTML UNIT 2.9和2.11上运行它.它在解析时都遇到了问题.请参阅上面的问题,以获取卡住的HTML UNIT代码.
现在我怀疑这可能是由于JS Execution进入无限循环.
我想检查哪些JS文件导致问题并将其从执行中删除.
如果他们是谷歌分析,推特等网站的JS,我可能根本不需要它们.
所以我想找到一种方法告诉HTML单元忽略某些JS文件并执行其余的.
有谁知道怎么做?
我正在使用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());
以下是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 …htmlunit ×10
java ×6
css ×1
javascript ×1
memory-leaks ×1
performance ×1
screenshot ×1
selenium ×1
selenium-rc ×1
tomcat7 ×1
user-agent ×1
web-crawler ×1
web-scraping ×1
webdriver ×1
xpath ×1