【问题标题】:HtmlUnit How to get a page after executing JavascriptHtmlUnit 执行 Javascript 后如何获取页面
【发布时间】:2018-12-15 17:20:42
【问题描述】:

我正在尝试使用 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 但图书馆可能已经发生了变化...... 见:calling a JavaScript function with HTMLUnit

我正在使用:

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

【问题讨论】:

    标签: javascript java htmlunit


    【解决方案1】:

    是的,你是对的,getNewPage() 方法在 2.33 版本中被删除,这是对事件处理进行大规模重构的一部分。

    作为替代,您可以使用窗口的封闭页面。

    例如如果您确定生成的页面与当前页面位于同一窗口中(已替换您的页面而不打开新窗口),您可以使用

    page.getEnclosingWindow().getEnclosedPage()
    

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

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

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

    webClient.getCurrentWindow().getEnclosedPage()
    

    希望对您有所帮助。

    【讨论】:

    • 感谢您的回答,我认为这对其他人会有所帮助。至于我,我尝试了 selenium 浏览器,我在下面发布了我所做的以便正确格式化。
    【解决方案2】:

    至于我,我尝试了 selenium 浏览器:

    <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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多