HtmlUnit Как получить страницу после выполнения Javascript - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь использовать Html Unit для запуска javascript на веб-странице с целью изменения страницы.

Я импортирую:

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.ScriptResult;

и код выглядит примерно так:

String javaScriptCode = "changePage(1)";
try{
    webClient = new WebClient(BrowserVersion.CHROME);
    webClient.getOptions().setCssEnabled(false);
    webClient.getOptions().setJavaScriptEnabled(true);
    page = webClient.getPage(url);
    newPage = page.executeJavaScript(javaScriptCode).getNewPage();
    webClient.close();
} catch (Exception e) {
    e.printStackTrace();
}

Однако я получаю сообщение об ошибке:

[Java] The method getNewPage() is undefined for the type ScriptResult [67108964]

Что является кристально чистым, однако это не говорит мне, какой метод я должен использовать?Большая часть того, что я нашел в интернете, основана на методе getNewPage или getPage, но в библиотеке могли быть изменения ... см .: вызов функции JavaScript с HTMLUnit

I 'м с использованием:

<dependency>
  <groupId>net.sourceforge.htmlunit</groupId>
  <artifactId>htmlunit</artifactId>
  <version>2.33</version>
</dependency>

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Что касается меня, я попробовал браузер селена:

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>3.141.59</version>
</dependency>

И я нахожу его очень полезным!Я только что построил драйвер, js executor, драйвер обновляется на хорошей странице, как только JS запустится.

driver = new ChromeDriver();
js = (JavascriptExecutor)driver;
driver.get(url);
js.executeScript(script);

Четыре строчки идентифицируют трюк.Я думаю, что буду придерживаться селена, за исключением случаев, когда есть веские причины не делать этого?

0 голосов
/ 17 декабря 2018

Да, вы правы, метод getNewPage () был удален с версией 2.33 как часть огромного рефакторинга в отношении обработки событий.

В качестве замены вы можете использовать вложенную страницу окна.

Например, если вы уверены, что полученная страница находится в том же окне, что и ваша текущая страница (заменила вашу страницу, не открывая новое окно), вы можете использовать

page.getEnclosingWindow().getEnclosedPage()

Если ваш код может открытьсядо нового окна будет больше сохранности, чтобы запросить у веб-клиента текущее окно (вновь открытые окна автоматически помечаются как текущие)

page.getWebClient().getCurrentWindow().getEnclosedPage()

Или в вашем примере кода вы можете напрямую использовать клиент

webClient.getCurrentWindow().getEnclosedPage()

Надеюсь, это поможет.

...