2010-12-01 25 views
11

Mientras ejecuto webdriver, 3 minutos después de ejecutarlo, recibo los siguientes errores de excepción y Webdriver.Webdriver: java.net.BindException: dirección que ya está en uso: connect

Estoy utilizando solo una instancia de webdriver y un perfil de FirefoxDriver.

Exception in thread "main" org.openqa.selenium.WebDriverException: 
java.net.BindException: Address already in use: connect 
System info: os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', 
java.version: '1.6.0_18' 
Driver info: driver.version: remote 
     at 
org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java: 
341) 
     at 
org.openqa.selenium.firefox.FirefoxDriver.execute(FirefoxDriver.java: 
234) 
     at 
org.openqa.selenium.remote.RemoteWebDriver.findElements(RemoteWebDriver.java: 
173) 
     at 
org.openqa.selenium.remote.RemoteWebDriver.findElementsByXPath(RemoteWebDriver.java: 
231) 
     at org.openqa.selenium.By$6.findElements(By.java:200) 
     at 
org.openqa.selenium.remote.RemoteWebDriver.findElements(RemoteWebDriver.java: 
158) 

Caused by: java.net.BindException: Address already in use: connect 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.PlainSocketImpl.doConnect(Unknown Source) 
     at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
     at java.net.PlainSocketImpl.connect(Unknown Source) 
     at java.net.SocksSocketImpl.connect(Unknown Source) 
     at java.net.Socket.connect(Unknown Source) 
     at 
org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java: 
123) 
     at 
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java: 
133) 
     at 
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java: 
149) 
     at 
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java: 
108) 
     at 
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java: 
415) 
     at 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java: 
641) 
     at 
org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java: 
211) 
     at 
org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.execute(NewProfileExtensionConnection.java: 
125) 
     at org.openqa.selenium.firefox.FirefoxDriver 
$LazyCommandExecutor.execute(FirefoxDriver.java:341) 
     at 
org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java: 
328) 
     ... 11 more 
+0

¿Se puede publicar un fragmento de código de donde se está produciendo el problema? – javamonkey79

+0

posible duplicado de [WebDriver: executeScript() causa BindException] (http://stackoverflow.com/questions/4330459/webdriver-executescript-causes-bindexception) –

Respuesta

9

Se están quedando sin puertos de salida. Eso significa que ha realizado miles de conexiones salientes en dos minutos. Solución: use un grupo de conexiones o disminuya la velocidad de su programa.

+0

Me di cuenta de que se ejecuta Javascript en cada página cargada mediante la prueba WebDriver '((JavascriptExecutor) driver) .executeScript (javascripthere) 'está causando este problema. Sin embargo, necesito ejecutar Javascript en las páginas que se prueban. – KJW

+0

Lo hace, pero no necesita probar una situación poco realista.Los clientes prácticos no abrirán miles de conexiones salientes. Solo lo haces porque quieres saturar el * servidor *. Entonces, la respuesta es usar más clientes de hardware. – EJP

+2

no estoy seguro de lo que mencionó por grupo de conexiones. ¿Cómo cierro las conexiones salientes una vez que terminan de usarse? – KJW

1

Si su situación es como la mía, donde

  1. puerto abierto 1
  2. conecta a la máquina
  3. ??
  4. cerca del puerto 1
  5. puerto abierto 1
  6. conectar a los distintos máquina

intento de añadir socket.setSoLinger(true, 0); directamente ante socket.close();.

así:

socket.setSoLinger(true, 0); 
socket.close(); 

Fuerza al sistema operativo para liberar el zócalo, en lugar de ponerlo en un estado TIME_WAIT.

+1

También obliga a TCP a descartar cualquier dato en vuelo, y también obliga al par a tratar un error ECONNRESET en lugar de un final normal de la secuencia. Ambos son cambios semánticos en la aplicación. No recomendado. – EJP

3

Tuve este problema en un conjunto de máquinas donde algunos ejecutaban Win2003, algunos ejecutaban Windows 7 y muchos ejecutaban Linux. Lo que encontré fue que cerrar todos los procesos de Java y reiniciar ayudó un poco, especialmente después de ejecutar los procesos de Java durante muchos días. Y, lo que ayudado de forma muy significativa fue Avoiding TCP/IP Port Exhaustion on MSDN con MaxUserPort de (dos veces el valor por defecto de 5000) y TcpTimedWaitDelay de (mínimo) en la máquina Win2003, que estaba ejecutando la red selenio independiente como el papel concentrador. REINICIAR después de cambiar, según las instrucciones en MSDN.

El comando "netstat -b" de Windows fue muy útil en la máquina Win2003 para confirmar que docenas y docenas de conexiones tcp/ip estaban abiertas (puertos 4444 y 5555); obviamente estos eran parte del sistema Selenium Grid (v2).

En Java, utilizo driver.quit(); al final de cada método de prueba. Intenté driver.close() y perdí la capacidad de ejecutar más de una prueba en una fila.

Ahora puedo ejecutar 250 pruebas con 0 excepciones que aparecen en la consola java del concentrador.

Cuestiones relacionadas