如何设置selenium webdriver获取超时?

时间:2012-03-16 03:09:48

标签: java selenium webdriver

当我在像FirefoxDriver这样的webdriver中使用代理时,如果代理不好,那么get方法将永远阻止。我设置了一些超时参数,但这没有用。

这是我的代码:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);    
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);

// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")

对driver.get的调用将永远阻塞,但是我希望它等待30秒,如果页面没有加载则抛出异常。

9 个答案:

答案 0 :(得分:24)

试试这个:

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

答案 1 :(得分:24)

timeouts()方法在某些驱动程序中未实现,并且通常非常不可靠 我为超时使用一个单独的线程(将url作为线程名传递给访问者):

    Thread t = new Thread(new Runnable()
    {
      public void run()
      {
        driver.get(Thread.currentThread().getName());
      }
    }, url);
    t.start();
    try
    {
      t.join(YOUR_TIMEOUT_HERE_IN_MS);
    }
    catch (InterruptedException e)
    { // ignore
    }
    if (t.isAlive())
    { // Thread still alive, we need to abort
      logger.warning("Timeout on loading page " + url);
      t.interrupt();
    }

这似乎在大多数情况下都有效,但是可能会发生驱动程序确实卡住以及随后对驱动程序的任何调用都会被阻止(我在Windows上使用Chrome驱动程序时会遇到这种情况)。甚至像driver.findElements()调用一样无害的东西也可能最终被阻止。不幸的是,我没有阻止驱动程序的解决方案。

答案 2 :(得分:8)

尝试

driver.executeScript("window.location.href='http://www.sina.com.cn'")

此声明将立即返回。

然后,您可以添加带有超时的 WebDriverWait 来检查页面标题或任何元素是否正常。

希望这会对你有所帮助。

答案 3 :(得分:5)

我有同样的问题,感谢这个论坛和其他一些人找到答案。 最初我还想到了单独的线程,但它使代码复杂化了一些。所以我试图找到一个符合我的原则“优雅和简单”的答案。

请看一下这样的论坛: https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading

解: 在代码中,在使用'get'方法行之前,您可以使用例如:

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

有一件事是它会抛出timeoutException,所以你必须将它封装在try catch块中或者用某种方法包装。

我没有找到pageLoadTimeout的getter,所以我不知道默认值是什么,但可能非常高,因为我的脚本被冻结了好几个小时而没有任何进展。

注意: 'pageLoadTimeout'未针对Chrome驱动程序实施,因此会导致异常。我看到用户评论说有计划制作它。

答案 4 :(得分:2)

您可以像这样设置HTTP客户端上的超时

int connectionTimeout=5000;
int socketTimeout=15000;
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout));
HttpCommandExecutor executor =
      new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory);
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities);

答案 5 :(得分:1)

添加

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

不会做任何事情。页面会阻塞很长时间。

答案 6 :(得分:1)

driver.manage()。timeouts()。pageLoadTimeout(10,TimeUnit.SECONDS)的解决方案将在具有同步加载的页面上工作,但这并不能解决在asynch中加载内容的页面上的问题,如果我们设置pageLoadTimeOut,测试将一直失败。

答案 7 :(得分:0)

我发现超时调用在现实生活中不够可靠,特别是对于Internet Explorer,但以下解决方案可能会有所帮助:

  1. 您可以在正在运行selenium进程的junit测试中使用@Test(timeout = 10000)来超时完整测试。这将释放执行其他测试的主线程,而不是阻止整个节目。然而,即使这有时也不起作用。

  2. 无论如何,通过超时,您不打算挽救测试用例,因为即使单个操作超时也可能使整个测试序列处于不一致状态。您可能只想在不阻塞的情况下继续使用其他测试用例(或者可能再次重试相同的测试)。在这种情况下,一个简单的方法是编写一个轮询器来轮询运行超过10分钟的Webdriver(例如IEDriverServer.exe,Phantomjs.exe)的进程并杀死它们。可以在Automatically identify (and kill) processes with long processing time

  3. 找到一个示例

答案 8 :(得分:0)

在类似情况下使用下面的代码

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

并在try catch中嵌入了driver.get代码,解决了加载超过1分钟的页面的问题。