2010-12-01 3 views
11

Lors de l'exécution de webdriver, 3 minutes après l'exécution, j'obtiens l'exception suivante et les plantages de Webdriver. Je n'utilise qu'une seule instance de webdriver et un seul profil FirefoxDriver.Webdriver: java.net.BindException: Adresse déjà utilisée: connect

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

Pouvez-vous poster un extrait de code de l'origine du problème? – javamonkey79

+0

duplication possible de [WebDriver: executeScript() provoque BindException] (http://stackoverflow.com/questions/4330459/webdriver-executescript-causes-bindexception) –

Répondre

9

Vous n'avez plus de ports sortants. Cela signifie que vous avez effectué des milliers de connexions sortantes en deux minutes. Solution: utilisez un pool de connexions ou ralentissez votre programme.

+0

J'ai réalisé que l'exécution de Javascript sur chaque page chargée via le test WebDriver '((JavascriptExecutor) driver) .executeScript (javascripthere) 'cause ce problème. Cependant, j'ai besoin de lancer Javascript sur les pages testées. – KJW

+0

Vous faites mais vous n'avez pas besoin de tester une situation irréaliste.Les clients pratiques n'ouvriront pas des milliers de connexions sortantes. Vous ne faites cela que parce que vous voulez saturer le * serveur *. Donc, la réponse est d'utiliser plus de clients matériels. – EJP

+2

ne sais pas ce que vous menez par pool de connexion. Comment fermer les connexions sortantes après leur utilisation? – KJW

1

Si votre situation est comme le mien, où vous

  1. port ouvert 1
  2. connecter à l'ordinateur
  3. ??
  4. orifice fermer 1
  5. port ouvert 1
  6. connecter à différents Machine

essai en ajoutant socket.setSoLinger(true, 0); directement avant socket.close();.

Comme si:

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

Cela force le système d'exploitation pour libérer le socket, plutôt que de le mettre dans un état TIME_WAIT.

+1

Force également TCP à rejeter toutes les données en vol et oblige également l'homologue à gérer une erreur ECONNRESET plutôt qu'une fin de flux normale. Les deux sont des changements sémantiques à l'application. Non recommandé. – EJP

3

J'ai eu ce problème dans un ensemble de machines où certains ont couru Win2003, certains ont couru Windows7 et beaucoup ont couru Linux. Ce que j'ai trouvé, c'est que la fermeture de tous les processus java et le redémarrage ont aidé un peu, surtout après l'exécution des processus Java pendant plusieurs jours. Et, ce qui a aidé de façon très significative était Avoiding TCP/IP Port Exhaustion on MSDN avec MaxUserPort de (deux fois la valeur par défaut de 5000) et TcpTimedWaitDelay de (minimum) sur la machine Win2003 qui dirigeait la grille de sélénium autonome comme le rôle de plaque tournante. REBOOT après le changement - par instructions sur MSDN.

La commande Windows "netstat -b" était très utile sur la machine Win2003 afin de confirmer que des douzaines et des dizaines de connexions tcp/ip étaient ouvertes (ports 4444 et 5555); ceux-ci faisaient évidemment partie du système Selenium Grid (v2).

En Java, j'utilise driver.quit(); à la fin de chaque méthode d'essai. J'ai essayé driver.close() et j'ai perdu la possibilité d'exécuter plus d'un test d'affilée.

Je peux maintenant exécuter 250 tests avec 0 exception apparaissant sur la console Java du Hub.

Questions connexes