HTMLUnitDriver не работает + исправлены зависимости maven?

Я использую Selenium за Java и у меня проблемы с HTMLUnitDriver, Независимо от того, какой веб-сайт я пробую или зависимости, он просто падает почти на любом JavaScript согласно выводу консоли. Когда я использую PhantomJS вместо этого все хорошо, и все работает так же, как, например, с Chrome или же Firefox, Кроме того, я не уверен, какие зависимости я должен использовать для HTMLUnitDriver,

Следующее должно дать мне последнюю версию HTMLUnitDriver:

<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.27, net.sourceforge.htmlunit:htmlunit-core-js:2.27 а также net.sourceforge.htmlunit:neko-htmlunit:2.27 несмотря на исключение.

Этот репозиторий, однако, предполагает, что 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 пригодился бы, если бы это работало...

3 ответа

Пожалуйста, обратите внимание на изменение artifactId, последняя версия, намекаемая здесь:

<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 только, и он будет получать все зависимости транзитивно, а затем вы можете все другие драйверы.

Ошибки как

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

обычно являются результатом отсутствия поддержки специальной функциональности javascript в HtmlUnit. Если вы хотите увидеть это исправлено, вы должны

И, конечно, приветствуются юнит-тесты и / или патчи.

Документация предполагает, что из Selenium v2.53.0 и далее вам нужно явно включить HtmlUnitDriver как зависимость, чтобы включить его в свой Selenium-Maven Проект. Номер версии драйвера теперь будет отслеживать сам HtmlUnit.

Пример:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>htmlunit-driver</artifactId>
    <version>3.6.0</version>
</dependency>  
Другие вопросы по тегам