javascript - Java 中的 HTMLUnit - 如何导航到 GridView 页面

标签 javascript java jsoup htmlunit

我正在尝试使用 java 创建一个应用程序,该应用程序将从网页读取信息。为了从我想要的元素下载信息,我使用了 jsoup (优秀的工具!),但我想加载网页中使用的 GridView 的下一页。 该页面是一个.aspx页面,第二页的链接是这样的:

 <a href="javascript:__doPostBack('GridView1','Page$2')" style="color:White;">2</a>

下面是使用的 javascript 函数:

    //<![CDATA[
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>

目前,我正在尝试使用 HTMLUnit 来完成此操作,但看起来不起作用。下面是我正在使用的代码:

 final WebClient webClient = new WebClient(BrowserVersion.CHROME);
            HtmlPage page = webClient.getPage("http://www.webpage.com/Main.aspx");          
            HtmlAnchor anchor = null;
            List<HtmlAnchor> anchors = page.getAnchors();
            for (int j = 0; j < anchors.size(); j++)
            {
                anchor = anchors.get(j);
                String sAnchor = anchor.asText();               
                String sAnchorxml = anchor.asXml();         
                if (sAnchor.equals("2"))
                {
                    HtmlPage page2 = anchor.click();
                    doc = Jsoup.parse(page2.asXml());
                    .....

当我使用与阅读第一页相同的代码阅读该页面时,出现以下错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at test.advacus.com.MainProgram.main(MainProgram.java:148)

我假设我的错误出现在 'Jsoup.parse()' 行中。只是为了澄清一下,一旦您单击下一页,网址就不会更改,只会更改 GridView 中的信息,因此我无法使用新网址进行解析。

任何其他帮助或任何建议的工具(而不是 HTMLUnit)将与 jsoup 更好地配合,真的很有帮助! 预先感谢您!

编辑附加信息: 看起来 click() 不起作用...我修改了代码,newPage 正文看起来包含与第一页相同的信息:

final WebClient webClient = new WebClient(BrowserVersion.CHROME);       
HtmlPage page = webClient.getPage("http://www.qatarsale.com/EnMain.aspx");                  
HtmlAnchor anchor = page.getAnchorByText("2");              
HtmlPage newPage = anchor.click();      
HtmlElement el = newPage.getBody();
System.out.println(el.asText());

最佳答案

检查 anchor - 正如您已经指出的 - 调用 doPostBack ,因此调用 javascript 调用要简单得多,而不是首先捕获 anchor 并调用单击它。

示例代码

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
final WebClient webClient = new WebClient(BrowserVersion.CHROME);

webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(10000);

try {
    HtmlPage htmlPage = webClient.getPage("http://qatarsale.com/EnMain.aspx");

    Document doc = Jsoup.parse(htmlPage.asXml());

    System.out.println(doc.select("[id$=Label10]").text());

    ScriptResult result = htmlPage.executeJavaScript("__doPostBack('GridView1','Page$2')");
    htmlPage = (HtmlPage)result.getNewPage();

    Thread.sleep(3000); // delay needed for lazy loading, there might be something cleaner

    doc = Jsoup.parse(((HtmlPage)htmlPage).asXml());

    System.out.println(doc.select("[id$=Label10]").text());

} catch (Exception e) {
    e.printStackTrace();
} finally {
    webClient.close();
}

输出

Toyota Porsche Mercedes-Benz Cadillac Jeep Porsche Porsche Nissan Mitsubishi BMW Porsche Ford Mitsubishi Toyota Nissan Land Rover Nissan Mercedes-Benz Nissan Nissan Toyota Toyota Porsche Mitsubishi Mitsubishi Nissan Nissan Mercedes-Benz Nissan Jeep Mercedes-Benz Lexus BMW Lexus
BMW Lexus Toyota Toyota Lexus Nissan Mercedes-Benz Mercedes-Benz Ferrari Dodge BMW Mercedes-Benz Aston Martin Mitsubishi Suzuki Maserati Porsche Maserati Land Rover Chevrolet Land Rover GMC Toyota Porsche Lexus Land Rover GMC Mercedes-Benz Toyota Lexus Toyota Lexus Toyota Nissan

关于javascript - Java 中的 HTMLUnit - 如何导航到 GridView 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39673782/

相关文章:

javascript - 在 HTML 表格中,如何使单元格的内容(而不是表格本身)居中?

javascript - 将预先格式化的文本更改为 javascript 对象

c# - Java2C#翻译: public methods in Interfaces in C#

java - 从 HTML 替换不起作用

java - 使用 JSoup 从表中提取数据

javascript - PrimeFaces 5.2 及更新版本中图表扩展器属性的替代项是什么

javascript - 获取网站标题

java - 如何将双数组列表与字符串数组列表合并

java - 如何使用java连接到neo4j服务器?

java - 使用 Jsoup 发布登录数据