Selenium webdriver。无尽的页面加载

时间:2015-07-02 14:58:28

标签: java selenium browsermob-proxy

我使用Selenium webdriver和Firefox来抓取网页。有时Web浏览器会等待一些过多的请求完成(例如,到facebook.net)。

我尝试使用BrowserMob-Proxy来过滤这些请求。但它没有任何帮助。即使在收到200或404代码后,这些请求也不会停止。

我想过在一段时间后停止Web浏览器加载页面的可能性。 例如:

try {
    Thread.sleep(5000);
} catch (InterruptedException ex) {
      Thread.currentThread().interrupt(); }
((JavascriptExecutor) driver).executeScript("window.stop();");

但是在网页完全加载之前它不起作用。

在你的情况下,你能建议我做什么?

P.S。这是使用pageLoadTimeout参数的代码。

WebDriver driver;
FirefoxBinary firefox;
FirefoxProfile customProfile;

public static void main(String[] args) {
openFirefox();
for (String url : listOfUrls) {                   
  Boolean pageLoaded = false;
  while (pageLoaded == false) {
  try {
    driver.get(url);
    pageLoaded = true;
    } catch (org.openqa.selenium.TimeoutException ex) {
      System.out.println("Got TimeoutException on page load. Restarting browser...");
      restartFirefox();
    }
  }
  //here I do something with a content of a webpage
 }
 }

 public static void openFirefox(){
        firefox = new FirefoxBinary(new File(Constants.PATH_TO_FIREFOX_EXE));
        customProfile = new FirefoxProfile();
        customProfile.setAcceptUntrustedCertificates(true);
        customProfile.setPreference("webdriver.load.strategy", "unstable");
        driver = new FirefoxDriver(firefox, customProfile);
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
    } 

private static void restartFirefox() {
        driver.close();
        firefox.quit();
        openFirefox();
    }

1 个答案:

答案 0 :(得分:0)

  1. 如何使用超时?因此,对于您正在使用的每个WebDriver实例,您需要设置:

    WebDriver.Timeouts pageLoadTimeout(长时间,java.util.concurrent.TimeUnit单位)

  2. Documentation

      

    设置之前等待页面加载完成的时间   抛出一个错误。如果超时为负,则可以加载页面   无限期的。

    Parameters:
    time - The timeout value.
    unit - The unit of time. Returns:
    A Timeouts interface.
    
    1.   

      我尝试使用BrowserMob-Proxy来过滤这些请求。但它   没有帮助。这些请求,即使在收到200或404代码后,   不停。

    2. 你是什么意思“没有帮助”。我不相信你。请分享您的黑名单网址代码。例如,以下代码代码为我的任何谷歌分析相关网站返回HTTP.200

      server.blacklistRequests("https?://.*\\.google-analytics\\.com/.*", 200); // server is bmp proxy server
      
      1. 我听说,WebDriver现在应该有webdriver.load.strategy。我从来没用过它。因此,阻止调用(a'la get())的WebDrivers的默认行为是等待document.readyStatecomplete,但我已经读过这个属性,你可以告诉驱动程序返回立刻。所以可能值得谷歌搜索一段时间。