HtmlUnit 没有完全加载 youtube 上的页面
HtmlUnit doesnt fully load page on youtube
我的程序正在输入一个 YouTube 视频 link 并试图获取评论框。我知道如何获取它,但是当我尝试访问包含它的 div 时,它显示为正在加载 div,因此我假设该页面未完全加载。我尝试了这些解决方案,其中 none 个有效:
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 似乎仅在您向下滚动页面时触发,直到它在页面中可见。您可能想先尝试模拟滚动,然后依靠等待 "loading" 字符串从容器 div 的内部 html 消失的循环。
还要考虑到,当他们推出更新时,这种行为可能会很快改变。
编辑:
在与 chrome 检查员检查后,似乎有更多 div 元素包含 "loading" (子)字符串,即使在通过 [=24= 填充评论部分之后也是如此].我建议修改您的条件以显示新的预期字符串,而不是 "loading" 去。例如,您可以搜索 "Top comments"(按钮文本)或 "Add a public comment..."(评论发布文本区域的占位符)。
我的程序正在输入一个 YouTube 视频 link 并试图获取评论框。我知道如何获取它,但是当我尝试访问包含它的 div 时,它显示为正在加载 div,因此我假设该页面未完全加载。我尝试了这些解决方案,其中 none 个有效:
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 似乎仅在您向下滚动页面时触发,直到它在页面中可见。您可能想先尝试模拟滚动,然后依靠等待 "loading" 字符串从容器 div 的内部 html 消失的循环。
还要考虑到,当他们推出更新时,这种行为可能会很快改变。
编辑:
在与 chrome 检查员检查后,似乎有更多 div 元素包含 "loading" (子)字符串,即使在通过 [=24= 填充评论部分之后也是如此].我建议修改您的条件以显示新的预期字符串,而不是 "loading" 去。例如,您可以搜索 "Top comments"(按钮文本)或 "Add a public comment..."(评论发布文本区域的占位符)。