Java 使用phantomJs Selenium滚动

Java 使用phantomJs Selenium滚动,java,selenium,selenium-webdriver,phantomjs,Java,Selenium,Selenium Webdriver,Phantomjs,我正在尝试运行此特定代码以滚动网页,这是一种分页类型。它在Firefox驱动程序中就像一个符咒,但当我使用phantomJS时,它不起作用,进入无限循环 public class Drivers { public WebDriver phJS() { File phantomjs = Phanbedder.unpack(); //Phanbedder to the rescue! String[] phantomArgs = new String[] { "

我正在尝试运行此特定代码以滚动网页,这是一种分页类型。它在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();
}
}


当我使用PhantomJS时,它会进入do的无限循环,但我不明白为什么。是因为没有执行ajax脚本吗?但是如果是这样的话,它应该退出循环,如果它滚动,为什么不像firefox驱动程序那样停止呢?

当你滚动到底部时,LinkedIn正在改变页面,请求更多数据。这意味着您在滚动之后永远不会得到相同的结果


我不知道你为什么看不到Firefox;可能它在您调用
getPageSource()
getPageSource()
返回陈旧数据后处理滚动事件。

得到答案,我调用了显式等待。而且效果很好

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;
    }

您使用的是什么PhantomJS版本?由于这是一个https站点,因此问题可能与狮子狗漏洞有关。你有没有截图或查看页面源代码以确保有什么东西在那里?phantomjsdriver-1.0.1.jar、Phantobeder-1.9.8-1.0.0.jar和selenium-java-2.45.0.jar忽略LinkedIn,我尝试的URL是snapdeal和惰性分页。我在Firefox中获得了正确的输出,但在PhantomJS中没有。在这种情况下,您必须运行代码并亲自检查这两个字符串,以查看发生了什么变化。从这里我可以说,滚动页面确实会改变PhantomJS上的DOM。这是出乎意料的,但并非不可能。通过呼叫wait获得了答案。虽然这似乎可行,但很脆弱。如果网站通过JavaScript计时器更改,那么代码将再次中断。通常情况下,最好识别滚动后必须发生的元素或更改,并检测此特定更改,而不是盲目地希望DOM保持不变。我正在尝试为电子商务网站开发一个通用爬虫,我已经处理了单击分页,因为我所要做的就是单击该元素,直到其成为链接或出现,这里的问题是div标签从none变为display变为none,但是如果它是一个通用的爬虫程序,那么它就变得越来越难处理了。你需要一组脚本才能为每个站点制定特殊的规则。这样,您就可以快速更改脚本,而无需一直重新编译代码。还要注意,许多商业网站不欢迎爬虫。请确保遵守规则,否则它们最终会阻止您。{“errorMessage”:“拒绝将字符串作为JavaScript求值,因为在以下内容安全策略指令中,“safe eval”不是允许的脚本源
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;
    }