Selenium WebDriver.findElement导致SocketException持续10秒

Selenium WebDriver.findElement导致SocketException持续10秒,selenium,webdriver,httpclient,Selenium,Webdriver,Httpclient,我遇到了一个奇怪的问题,一套WebDriver测试用例导致了广泛的失败 套件中的一个测试用例目前预计会失败-网站中有一个打开的bug导致选项卡消失。应该单击该选项卡的测试用例调用WebDriver的findElement方法来查找该选项卡。它等待标准超时,但随后,我开始在控制台中获取通常捕获错误的测试用例代码无法捕获的SocketException,而不是抛出通常的异常并继续: Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.Default

我遇到了一个奇怪的问题,一套WebDriver测试用例导致了广泛的失败

套件中的一个测试用例目前预计会失败-网站中有一个打开的bug导致选项卡消失。应该单击该选项卡的测试用例调用WebDriver的findElement方法来查找该选项卡。它等待标准超时,但随后,我开始在控制台中获取通常捕获错误的测试用例代码无法捕获的SocketException,而不是抛出通常的异常并继续:

Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.DefaultRequestDirector tryConnect
INFO: I/O exception (java.net.SocketException) caught when connecting to the target host: No buffer space available (maximum connections reached?): connect
Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.DefaultRequestDirector tryConnect 
INFO: Retrying connect 
Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.DefaultRequestDirector tryConnect 
INFO: I/O exception (java.net.SocketException) caught when connecting to the target host: No buffer space available (maximum connections reached?): connect 
Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.DefaultRequestDirector tryConnect 
INFO: Retrying connect 
Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.DefaultRequestDirector tryConnect 
INFO: I/O exception (java.net.SocketException) caught when connecting to the target host: No buffer space available (maximum connections reached?): connect 
Apr 18, 2013 8:47:23 AM org.apache.http.impl.client.DefaultRequestDirector tryConnect 
INFO: Retrying connect
SocketException导致无法访问的BrowserException:

org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died.
Build info: version: '2.25.0', revision: '17482', time: '2012-07-18 22:18:01'
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_32'
Driver info: driver.version: RemoteWebDriver
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:493)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:502)
    at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:372)
    at com.brainshark.uitests.common.TestBase.afterClass(TestBase.java:243)
    at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:36)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at com.brainshark.uitests.runners.BrainsharkTestRunner.run(BrainsharkTestRunner.java:51)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:24)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.openqa.selenium.remote.HttpCommandExecutor.fallBackExecute(HttpCommandExecutor.java:319)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:297)
    at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.execute(NewProfileExtensionConnection.java:136)
    at org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:357)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:472)
    ... 32 more
这会导致每个测试用例快速失败,并且在大约10秒钟内,每次尝试运行下一个测试用例都会触发上述失败。然后,神奇的事情发生了,例外情况停止了


有人知道我为什么会看到这种行为吗?或者什么需要10秒来重置?我是否应该在尝试执行下一个测试用例之前,通过检测这样的情况并保持静止10秒来解决这个问题?谢谢

我明白了。SocketException是由于在太短的时间内进行了太多findElement调用而导致的

我有一个定制的find方法,除了By定位器之外,它还允许匹配其他参数,比如文本模式。在某些情况下(即,如果存在与By定位器匹配但与文本模式不匹配的元素,例如在本例中,有多个选项卡,但缺少我要查找的文本的选项卡),此方法可以在超时期间重复findElement调用

我从来没有注意到开发中的问题,因为我在编写测试时使用了20秒的超时时间,所以测试失败的速度更快。在实际运行中,我们使用了180秒的超时时间,这足够让Selenium在findElement调用中过载


我添加了一些sleep,以确保最多每四分之一秒只调用findElement一次,并且还添加了try/catch来捕获无法访问的BrowserException,如果重载仍然发生,将导致该异常。如果有,我就睡40秒,然后再试一次。它现在似乎工作得很好。

可能与(链接失效时的解释)有关。我从下面的链接中了解到,一个可能的解决方法是使用Chrome驱动程序而不是Firefox。在windows机器上使用Chrome驱动程序时,我也遇到了同样的问题。mac上没有错误。从最初的搜索来看,它看起来像是windows上的service pack问题?