使用 phantomJs Selenium 滚动
Scrolling with phantomJs Selenium
我正在尝试获取此特定代码 运行 以滚动网页,这是一种分页。它与 Firefox 驱动程序一起工作就像一个魅力,但是当我使用 phantomJS 时它不起作用并进入无限循环
public class Drivers {
public WebDriver phJS()
{
File phantomjs = Phanbedder.unpack(); //Phanbedder to the rescue!
String[] phantomArgs = new String[] {
"--webdriver-loglevel=NONE"
};
DesiredCapabilities dcaps = new DesiredCapabilities();
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, phantomjs.getAbsolutePath());
dcaps.setCapability( "phantomjs.cli.args", phantomArgs);
WebDriver driver = new PhantomJSDriver(dcaps);
phantomjs.delete();
return driver;
}
public static void main(String args[]) throws IOException
{
WebDriver wd=new FirefoxDriver();// Does Not work with new Drivers().phJS()
wd.get("http://www.snapdeal.com/products/mobiles-mobile-phones/filters/Form_s~Smartphones#plrty|Brand:HTC|Ram_s:1%20GB^ 2%20GB^ 3%20GB^ 512%20MB%20and%20Below|Form_s:Smartphones|");
wd= new PageScroll().scrollToBottom(wd);
List<WebElement> wele = wd.findElements(By.xpath("//*[@class=' product-image ']/a"));
for(WebElement we:wele)
{
System.out.println(we.getAttribute("href"));
}
wd.quit();
}
}
这是执行滚动的代码
public class PageScroll {
WebDriver driver;
public WebDriver scrollToBottom(WebDriver driver) {
String oldpage="";
String newpage="";
do{
oldpage=driver.getPageSource();
((JavascriptExecutor) driver)
.executeScript("window.scrollTo(0, document.body.scrollHeight)");
newpage=driver.getPageSource();
System.out.println(oldpage.equals(newpage));
}while(!oldpage.equals(newpage));
return driver;
}
}
当我使用 PhantomJS 时,它会进入 do while 的无限循环,我不明白为什么。是因为ajax脚本没有执行吗?但如果是这样它应该跳出循环,如果它滚动为什么它不像 firefox 驱动程序那样停止?
当您滚动到底部时,LinkedIn 正在更改页面,请求更多数据。这意味着您在滚动后永远不会得到相同的结果。
我不确定为什么您在 Firefox 中看不到;也许它会在您调用 getPageSource()
或 getPageSource()
returns 陈旧数据后处理滚动事件。
得到答案,我叫显式等待。而且效果很好
public synchronized WebDriver scrollToBottom(WebDriver driver, WebElement element,int time) throws InterruptedException {
String oldpage="";
String newpage="";
do{
oldpage=driver.getPageSource();
((JavascriptExecutor) driver)
.executeScript("window.scrollTo(0, (document.body.scrollHeight))");
this.wait(time);
newpage=driver.getPageSource();
}while(!oldpage.equals(newpage));
return driver;
}
我正在尝试获取此特定代码 运行 以滚动网页,这是一种分页。它与 Firefox 驱动程序一起工作就像一个魅力,但是当我使用 phantomJS 时它不起作用并进入无限循环
public class Drivers {
public WebDriver phJS()
{
File phantomjs = Phanbedder.unpack(); //Phanbedder to the rescue!
String[] phantomArgs = new String[] {
"--webdriver-loglevel=NONE"
};
DesiredCapabilities dcaps = new DesiredCapabilities();
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, phantomjs.getAbsolutePath());
dcaps.setCapability( "phantomjs.cli.args", phantomArgs);
WebDriver driver = new PhantomJSDriver(dcaps);
phantomjs.delete();
return driver;
}
public static void main(String args[]) throws IOException
{
WebDriver wd=new FirefoxDriver();// Does Not work with new Drivers().phJS()
wd.get("http://www.snapdeal.com/products/mobiles-mobile-phones/filters/Form_s~Smartphones#plrty|Brand:HTC|Ram_s:1%20GB^ 2%20GB^ 3%20GB^ 512%20MB%20and%20Below|Form_s:Smartphones|");
wd= new PageScroll().scrollToBottom(wd);
List<WebElement> wele = wd.findElements(By.xpath("//*[@class=' product-image ']/a"));
for(WebElement we:wele)
{
System.out.println(we.getAttribute("href"));
}
wd.quit();
}
}
这是执行滚动的代码
public class PageScroll {
WebDriver driver;
public WebDriver scrollToBottom(WebDriver driver) {
String oldpage="";
String newpage="";
do{
oldpage=driver.getPageSource();
((JavascriptExecutor) driver)
.executeScript("window.scrollTo(0, document.body.scrollHeight)");
newpage=driver.getPageSource();
System.out.println(oldpage.equals(newpage));
}while(!oldpage.equals(newpage));
return driver;
}
}
当我使用 PhantomJS 时,它会进入 do while 的无限循环,我不明白为什么。是因为ajax脚本没有执行吗?但如果是这样它应该跳出循环,如果它滚动为什么它不像 firefox 驱动程序那样停止?
当您滚动到底部时,LinkedIn 正在更改页面,请求更多数据。这意味着您在滚动后永远不会得到相同的结果。
我不确定为什么您在 Firefox 中看不到;也许它会在您调用 getPageSource()
或 getPageSource()
returns 陈旧数据后处理滚动事件。
得到答案,我叫显式等待。而且效果很好
public synchronized WebDriver scrollToBottom(WebDriver driver, WebElement element,int time) throws InterruptedException {
String oldpage="";
String newpage="";
do{
oldpage=driver.getPageSource();
((JavascriptExecutor) driver)
.executeScript("window.scrollTo(0, (document.body.scrollHeight))");
this.wait(time);
newpage=driver.getPageSource();
}while(!oldpage.equals(newpage));
return driver;
}