【问题标题】:HTMLUnitDriver not working + correct maven dependencies?HTMLUnitDriver 不工作 + 正确的 Maven 依赖项?
【发布时间】:2017-10-29 23:18:54
【问题描述】:

我将Selenium 用于Java,但HTMLUnitDriver 出现问题。无论我尝试哪个网站或依赖哪个网站,根据控制台输出,它几乎都会在任何JavaScript 上崩溃。当我改用PhantomJS 时,一切都很好,而且东西的工作原理就像它对例如ChromeFirefox。另外,我不确定应该为HTMLUnitDriver 使用哪些依赖项。

下面应该给我the latest versionHTMLUnitDriver

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.5.3</version>
    <exclusions>
        <exclusion>
            <groupId>org.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.sourceforge.htmlunit</groupId>
            <artifactId>neko-htmlunit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-htmlunit-driver</artifactId>
    <version>2.52.0</version>
</dependency>

然而,事实并非如此。 HTMLUnitDriver 似乎与 net.sourceforge.htmlunit:htmlunit:2.27net.sourceforge.htmlunit:htmlunit-core-js:2.27net.sourceforge.htmlunit:neko-htmlunit:2.27 捆绑在一起,尽管排除了。

This 存储库建议 2.27 仍然是最新的,但它在网站上处理任何类型的 JavaScript 非常糟糕,因此无法使用。

我是这样开始的:

HtmlUnitDriver unitDriver = new HtmlUnitDriver();
unitDriver.setJavascriptEnabled(true);

例外:

Caused by: com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot find function registerElement in object [object HTMLDocument]. (https://www.example.com/some-script.js#31)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:894)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:637)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:518)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:774)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:750)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:102)
    at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:991)
    at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:366)
    at com.gargoylesoftware.htmlunit.html.HtmlScript$2.execute(HtmlScript.java:247)
    at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:268)
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:800)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:756)
    at net.sourceforge.htmlunit.cyberneko.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1236)
    at net.sourceforge.htmlunit.cyberneko.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1136)
    at net.sourceforge.htmlunit.cyberneko.filters.DefaultFilter.endElement(DefaultFilter.java:226)
    at net.sourceforge.htmlunit.cyberneko.filters.NamespaceBinder.endElement(NamespaceBinder.java:345)
    at net.sourceforge.htmlunit.cyberneko.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3178)
    at net.sourceforge.htmlunit.cyberneko.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2141)
    at net.sourceforge.htmlunit.cyberneko.HTMLScanner.scanDocument(HTMLScanner.java:945)
    at net.sourceforge.htmlunit.cyberneko.HTMLConfiguration.parse(HTMLConfiguration.java:521)
    at net.sourceforge.htmlunit.cyberneko.HTMLConfiguration.parse(HTMLConfiguration.java:472)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:999)
    at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:250)
    at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:192)
    at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:272)
    at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:160)
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:522)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:396)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:313)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:668)
    ... 3 more

不启用JavaScript 在避免异常方面效果更好,但站点需要JavaScript,所以这不是解决方案。

我的依赖项有什么问题还是HTMLUnitDriver 真的只是“垃圾”? PhantomJS 的启动时间约为 5 秒,如果您只想解析一次内容,这将是相当慢的,因此如果它有效,像 HTMLUnitDriver 这样更轻量级的驱动程序会派上用场...

【问题讨论】:

    标签: javascript java maven selenium htmlunit-driver


    【解决方案1】:

    请注意artifactId的变化,here提示的最新版本是:

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit-driver</artifactId>
        <version>2.27</version>
    </dependency>
    

    它基于 Selenium 3.4.0

    您可以将 Selenium 3.6.0 与 HtmlUnitDriver 2.28-SNAPSHOT 一起使用。

    我建议作为起点,您只引用HtmlUnitDriver,它会传递所有依赖,然后您可以获取所有其他驱动程序。

    【讨论】:

    • 好吧,自述文件已经有 5 个月没有更新了,我已经在使用 Selenium 和其他驱动程序,所以我不能直接删除它。由于PhantomJSDriver 的错误,我需要Selenium 3.5.3
    • Selenium 3.5.3 已经包含 HtmlUnit 2.27,这是最新发布的版本。关于 JavaScript 支持,请阅读here
    【解决方案2】:

    Documentation 建议从 Selenium v2.53.0 开始,您需要明确 包含 HtmlUnitDriver 作为要包含的依赖项它在您的 Selenium-Maven 项目中。驱动程序的版本号现在将跟踪 HtmlUnit 本身。

    例子:

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit-driver</artifactId>
        <version>3.6.0</version>
    </dependency>  
    

    【讨论】:

    • 是的,但版本 3.6.0 不存在。 LATEST 变成 2.27 并且该版本仍然非常糟糕,就像问题中解释的那样。
    【解决方案3】:

    类似的错误

    com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot find function registerElement in object [object HTMLDocument].
    

    通常是由于缺少对 HtmlUnit 中特殊 javascript 功能的支持。如果你想看到这个修复,你必须

    当然也欢迎单元测试和/或补丁。

    【讨论】:

    • 并非如此,如果制造商只是在现实生活中的网站上使用他们的HTMLUnitDriver,他们自己就会发现很多问题。他们有多年的时间来正确支持JavaScriptPhantomJSDriver 和所有现代浏览器都可以正常工作,所以让事情正常工作不会那么难。仍然感谢您让我知道您可以做些什么。
    猜你喜欢
    • 2023-04-01
    • 2022-07-08
    • 2022-11-16
    • 2021-05-08
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2019-03-10
    • 2014-05-19
    相关资源
    最近更新 更多