HtmlUnit执行Javascript后如何获取页面

时间:2018-12-15 17:20:42

标签: javascript java htmlunit

我正在尝试使用HTML单元在网页上运行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的,但是库中可能已有更改... 参见:calling a JavaScript function with HTMLUnit

我正在使用:

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

2 个答案:

答案 0 :(得分:0)

是的,在涉及事件处理的大量重构中,getNewPage()方法已从2.33版本中删除。

作为替换,您可以使用窗口的所附页面。

例如如果您确定结果页面与当前页面在同一窗口中(已替换页面而不打开新窗口),则可以使用

page.getEnclosingWindow().getEnclosedPage()

如果您的代码可能会打开一个新窗口,则向webClient询问当前窗口会更省钱(新打开的窗口会自动标记为当前窗口)

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

或者在代码示例中,您可以直接使用客户端

webClient.getCurrentWindow().getEnclosedPage()

希望有帮助。

答案 1 :(得分:0)

对于我来说,我尝试了硒浏览器:

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

我发现它很少!我刚刚构建了一个驱动程序,一个js执行程序,并且只要运行JS,驱动程序就会在页面上更新。

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

四行是诀窍。我认为我会坚持使用硒,除非有充分的理由不这样做?