2012-03-16 70 views
25

当我在Firefox驱动程序等webdriver中使用代理时,如果代理服务器不好,那么get方法将永远阻塞。我设置了一些超时参数,但是这并没有解决。如何设置硒webdriver获取超时?

这是我的代码:

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秒,如果没有加载的页面,然后抛出异常。

回答

18

试试这个:

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

正如我写的,这个答案被接受为正确的。然而,正如zhongting [在下文中提到](http://stackoverflow.com/a/10827070/705157),这种解决方案似乎阻止了很长一段时间的负载。我认为实际的答案应该是[user1102631's](http://stackoverflow.com/a/12915015/705157)。 – 2013-10-02 18:26:40

+0

同意,这个答案会延长30秒到硒运行的每一个命令。像这样的任意延迟是使测试工作非常昂贵且通常不可靠的方式。通常将隐式等待设置为0并使用显式等待每个操作的结果会更好。这是更可靠和通常更快,因为你只有等到行动发生,而不是每次全部时间限制。 – ajsutton 2014-01-20 22:26:18

+0

@ajsutton你如何明确地等待? – Thufir 2014-10-14 06:48:26

2

添加

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

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

21

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

+1

如果你将selenium和userscript混合使用(通过扩展和保存配置文件返回),即使硒被阻塞等待加载,仍然可以将JavaScript代码发送到浏览器中。这样,你可以在ms中添加一个简单的javascript'setTimeout(function(){window.stop();},5000)',然后停止加载页面。一旦你停止加载,控制器被发回硒(简单的运行测试,然后按加载时的ESC键)。这种方式可以让你加载5秒的网页并获得常用的网页元素。 – erm3nda 2015-11-08 17:54:47

4

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

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

SOLUTION: 在代码中,以 '得到' 的方法前行,你可以使用例如:

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

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

我还没有发现对pageLoadTimeout吸气,所以我不知道什么是默认值,但可能很高,因为我的剧本被冻结几个小时并没有什么向前发展。

通知: 'pageLoadTimeout'不适用于Chrome驱动程序,因此会导致异常。我通过用户的评论看到有计划实现它。

1

解决方法driver.manage().timeouts()。pageLoadTimeout(10,TimeUnit.SECONDS)将在页面上同步加载,但这并不能解决页面加载异物的问题,如果我们设置pageLoadTimeOut,测试会一直失败。

0

我发现,超时调用无法在现实生活中足够可靠,尤其适用于Internet Explorer,但以下解决方案可能会有所帮助:

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

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

8

找到尝试

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

本声明将立即返回。

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

希望这会帮助你。

+2

这是我使用ChromeDriver的最简单的工作解决方案,因为它不支持pageLoadTimeout。也可以在python中使用(execute_script)。 – chris838 2016-12-22 17:28:27

+1

不错!伟大的方式来解决我对socket.timeout异常(python)的战斗。我更喜欢处理硒的TimeoutException。 – 2017-02-01 20:28:50

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); 
0

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

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

和嵌入式driver.get代码在尝试捕捉,解决问题加载页面的时间超过1分钟。

+1

添加一些解释给你的答案 – mumair 2017-11-05 18:50:48