如何设置selenium webdriver获取超时?

福气鱼*_*福气鱼 33 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")
Run Code Online (Sandbox Code Playgroud)

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

Fuj*_*Liu 27

试试这个:

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

  • 在我写的时候,这个答案被认为是正确的.但是,正如zhongting [在下面提到](http://stackoverflow.com/a/10827070/705157),这个解决方案似乎在很长一段时间内阻止了负载.我认为实际的答案应该是[user1102631's](http://stackoverflow.com/a/12915015/705157). (3认同)
  • @ajsutton如何为每个命令增加30秒的延迟?implictwait**轮询**给定时间内的DOM,直到元素是可用的.如果它们在30秒之前可用,它将中断等待并继续执行. (3认同)
  • 同意,此答案将为 selenium 运行的每个命令增加 30 秒的延迟。像这样的任意延迟是一种非常昂贵且通常不可靠的测试工作方式。通常最好将隐式等待设置为 0,并对每个操作的结果使用显式等待。这更可靠并且通常更快,因为您只等到操作发生而不是每次都达到完整的时间限制。 (2认同)

小智 25

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

    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();
    }
Run Code Online (Sandbox Code Playgroud)

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


小智 8

尝试

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

该声明将立即返回.

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

希望这会帮助你.

  • 这是使用ChromeDriver的最简单的工作解决方案,因为它不支持pageLoadTimeout.也适用于python(execute_script). (2认同)
  • 好的!解决我与 socket.timeout 异常(python)斗争的好方法。我更喜欢处理 selenium 的 TimeoutException。 (2认同)

Luk*_*asz 5

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

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

#

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

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud) #

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

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

#

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