【问题标题】:HtmlUnit doesnt fully load page on youtubeHtmlUnit 没有在 youtube 上完全加载页面
【发布时间】:2016-09-08 23:13:31
【问题描述】:

我的程序正在输入一个 youtube 视频链接,并试图获取评论框。我知道如何获取它,但是当我尝试到达包含它的 div 时,它显示为加载 div,所以我假设页面没有完全加载。我尝试了这些解决方案,但都没有奏效:

while(pagina.getFirstByXPath("//div[@id='comment-section-renderer']/div")
                           .toString().contains("loading")) {
    synchronized(pagina) {
        pagina.wait(2000);
    }
}

反之:

 cliente.waitForBackgroundJavaScript(100000);

页面从 gmail 登录加载,我在加载视频页面时检查了用户是否成功登录。

这是方法的代码

public HtmlPage comentaVideo(String correo, String pass, String video, 
                             String comentario) throws ... {

    String url= "https://www.youtube.com"+video;
    HtmlPage pagina;
    HtmlDivision division;
    HtmlButton boton;
    HtmlTextInput input;

    pagina = cliente.getPage("https://www.youtube.com/watch?v=E2b9PiqobWg");

    boton = pagina.getFirstByXPath("//div[@id='yt-masthead-signin']/div/button"); 
    //press sign in button
    pagina = boton.click();

    pagina=iniciaSesion(correo,pass,pagina); //Login gmail (working)        

    System.out.println(pagina.getUrl().toString()); //just for debug

    //Trying to get the coment box div
    division = pagina.getFirstByXPath("//div[@id='comment-section-renderer']/div"); 

    //verifying that the div is correct
    System.out.println(division.toString()); 

    //some tests...
    pagina=division.click();

    boton= pagina.getFirstByXPath("//div[@id='comment-simplebox']/div/button[2]");
    pagina=boton.click();

    return pagina;

}

现在我认识到了问题,这是更新后的方法,仍然无法正常工作......

public HtmlPage comentaVideo(String correo, String pass, String video, String comentario) throws FailingHttpStatusCodeException, MalformedURLException, IOException, ErrorSesionNoIniciada, InterruptedException{

        String url= "https://www.youtube.com"+video;
        HtmlPage pagina;
        HtmlDivision division;
        HtmlButton boton;
        HtmlTextInput input;

        pagina = cliente.getPage("https://www.youtube.com/watch?v=E2b9PiqobWg");

        boton = pagina.getFirstByXPath("//div[@id='yt-masthead-signin']/div/button");
        pagina = boton.click();

        pagina=iniciaSesion(correo,pass,pagina);        

        System.out.println(pagina.getUrl().toString());


        //Parte no funcional

        division = pagina.getFirstByXPath("//div[@id='comment-section-renderer']/div"); 


        boton = division.getFirstByXPath("//div[@id='comment-section-renderer']/div[2]/button"); //best comments button

    while(boton == null){ //while this button is not loaded
        ScriptResult sr=pagina.executeJavaScript("window.scrollBy(0,60000)");
        cliente.waitForBackgroundJavaScript(1000);
        pagina=(HtmlPage)sr.getNewPage();
        boton = division.getFirstByXPath("//div[@id='comment-section-renderer']/div[2]/button"); 
    }
    System.out.println(boton.toString());



        //just for testing
        division = pagina.getFirstByXPath("//div[@id='comment-section-renderer']/div"); 

        System.out.println(division.toString());
        pagina=division.click();


        boton= pagina.getFirstByXPath("//div[@id='comment-simplebox']/div/button[2]");
        pagina=boton.click();

        return pagina;

我还尝试将内页高度设置为最大尺寸。 (代码中有未使用的 var 和 throws,因为只是为了测试,我会在得到解决方案时将其更新为最终版本)

编辑 1:更改了 while 循环条件,但仍然无法正常工作

【问题讨论】:

  • 查看 youtube 页面,加载评论部分的 ajax 似乎只有在您向下滚动以使其在页面中可见时才会触发。您可能想尝试模拟滚动
  • @ᴳᵁᴵᴰᴼ 哇谢谢你,我没想到,非常感谢!如果你不介意,你能回答这个问题吗?如何编辑可编辑的
  • 当然;关于用htmlunit填充div的另一个问题,我想最好创建一个新的。 (欢迎使用 stackoverflow)
  • @ᴳᵁᴵᴰᴼ 现在我被滚动部分卡住了,我尝试了 executeJavaScript 滚动方法和 fireEvent("scroll"),甚至更改了实际页面的最大大小,我也尝试过将所有这些方法放在一个带有 waitForJavaScript(6000) 的 while 循环中,这些都不起作用...如果您有任何解决方案...
  • 如果您仍有问题,我稍后会调查,我目前无法访问 youtube;我会试试这个(将内部高度设置为最大尺寸):stackoverflow.com/questions/12119610/… 同时

标签: javascript java html youtube htmlunit


【解决方案1】:

查看 youtube 页面结构,加载 cmets 部分的 ajax 似乎仅在您向下滚动页面时触发,直到它在页面中可见。您可能想先尝试模拟滚动,然后依靠循环等待“正在加载”字符串从容器 div 的内部 html 中消失。

还要考虑到,当他们推出更新时,这种行为可能会很快改变。

编辑:

在使用 chrome 检查器检查后,即使在通过 ajax 填充注释部分之后,似乎还有更多包含“正在加载”(子)字符串的 div 元素。我建议修改您的条件以显示新的预期字符串,而不是“加载”。例如,您可以搜索“Top cmets”(按钮文本)或“添加公共评论...”(评论发布文本区域的占位符)。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签