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. Если вы хотите увидеть это исправлено, вы должны
- Прочитайте это (Отправка ошибок 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>