有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

尽管元素存在,但HtmlUnit中的java ElementNotFoundException

我制作了一个java服务器,可以刮取一个网站,但我的问题是,在几次请求(大约10次)后,我总是会得到这个错误ElementNotFoundException,尽管元素应该在那里。基本上,我的程序只是每隔几分钟检查一下这个网站的信息,但几次之后,它就给了我一个例外。 这是我的刮码,我不知道是怎么回事,过了几次元素都找不到了

final WebClient webClient = new WebClient();
try (final WebClient webClient1 = new WebClient()) {
    final HtmlPage page = webClient.getPage("http://b7rabin.iscool.co.il/מערכתשעות/tabid/217/language/he-IL/Default.aspx");

    WebResponse webResponse = page.getWebResponse();
    String content = webResponse.getContentAsString();
     //   System.out.println(content);


    HtmlSelect select = (HtmlSelect) page.getElementById("dnn_ctr914_TimeTableView_ClassesList");
    HtmlOption option = select.getOptionByValue("" + userClass);

    select.setSelectedAttribute(option, true);

    //String jscmnd = "javascript:__doPostBack('dnn$ctr914$TimeTableView$btnChangesTable','')";
    String jscmnd = "__doPostBack('dnn$ctr914$TimeTableView$btnChanges','')";

    ScriptResult result = page.executeJavaScript(jscmnd);

    HtmlPage page1 = (HtmlPage) result.getNewPage();

    String content1 = page1.getWebResponse().getContentAsString();
    //System.out.println(content1);
    System.out.println("-----");
    HtmlDivision getChanges = null;
    String changes = "";

    getChanges = page1.getHtmlElementById("dnn_ctr914_TimeTableView_PlaceHolder");   
    changes = getChanges.asText();
    changes = changes.replaceAll("\n", "").replaceAll("\r", "");

    System.out.println(changes);
}

例外情况:

Exception in thread "Thread-0" com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[*] attributeName=[id] attributeValue=[dnn_ctr914_TimeTableView_PlaceHolder]
at com.gargoylesoftware.htmlunit.html.HtmlPage.getHtmlElementById(HtmlPage.java:1552)
at scrapper$1.run(scrapper.java:108)

我真的很想解决它,这是我项目中唯一的瓶颈


共 (1) 个答案

  1. # 1 楼答案

    在操作第二个页面之前,只需稍等片刻,如here所示

    因此,睡眠()3秒钟将使其始终成功

    HtmlPage page1 = (HtmlPage) result.getNewPage();
    
    Thread.sleep(3_000); // sleep for 3 seconds
    
    String content1 = page1.getWebResponse().getContentAsString();
    

    此外,不需要实例化WebClient的两个实例