如何设置硒网络驱动程序获取超时?

2022-09-01 01:52:22

当我在像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秒,如果未加载页面,则引发异常。


答案 1

试试这个:

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

答案 2

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

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


推荐