如何设置 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 秒,如果页面未加载,则抛出异常。

原文由 Stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

尝试这个:

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

原文由 Fujiao Liu 发布,翻译遵循 CC BY-SA 3.0 许可协议

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() 调用这样无伤大雅的事情也可能最终被阻止。不幸的是,我没有针对被阻止的驱动程序的解决方案。

原文由 user1102631 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题