【问题标题】:Scrolling with phantomJs Selenium使用 phantomJs Selenium 滚动
【发布时间】:2015-08-08 01:08:53
【问题描述】:

我正在尝试运行此特定代码以滚动网页,这是一种分页。它与 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 驱动程序一样停止?

【问题讨论】:

  • 你使用什么 PhantomJS 版本?由于这是一个 https 站点,因此问题可能与 poodle 漏洞有关。您是否截取了屏幕截图或查看了页面源代码以确保其中有内容?
  • phantomjsdriver-1.0.1.jar、phanbedder-1.9.8-1.0.0.jar 和 selenium-java-2.45.0.jar

标签: java selenium selenium-webdriver phantomjs


【解决方案1】:

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

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

【讨论】:

  • 虽然这似乎可行,但它很脆弱。如果网站通过 JavaScript 计时器更改,那么您的代码将再次中断。通常,最好识别滚动后必须发生的元素或更改并检测此特定更改,而不是盲目地希望 DOM 仍然相同。
  • 我正在尝试为电子商务网站开发一个通用爬虫,我已经处理了点击分页,因为我所要做的就是点击元素直到它的链接或出现,这里的问题是 div 标签它从无到显示到无,但如果它是一个通用的爬虫,它会变得越来越难处理。
  • 您需要一组脚本才能为每个站点设置特殊规则。这样,您可以快速更改脚本,而无需一直重新编译代码。另请注意,许多商业网站不欢迎爬虫。确保你遵守规则,否则它们最终会阻止你。
  • {"errorMessage":"拒绝将字符串评估为 JavaScript,因为在以下内容安全策略指令中,'unsafe-eval' 不是允许的脚本来源
【解决方案2】:

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

我不确定为什么您在 Firefox 中看不到;也许它会在您调用getPageSource()getPageSource() 返回陈旧数据后处理滚动事件。

【讨论】:

  • 忽略LinkedIn,我尝试的URL是带有惰性分页的snapdeal。我在 Firefox 中得到了正确的输出,但在 PhantomJs 中没有
  • 在这种情况下,您必须自己运行代码并检查这两个字符串以查看发生了什么变化。我在这里只能说滚动页面确实会改变 PhantomJS 上的 DOM。这是出乎意料的,但并非不可能。
  • 通过调用wait得到了答案。
猜你喜欢
  • 2017-11-06
  • 2018-05-29
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多