Подтвердить что ты не робот

Webdriver: java.net.BindException: адрес уже используется: connect

При запуске webdriver, за 3 минуты работы, я получаю следующее исключение, и сбой Webdriver.

Я использую только один экземпляр webdriver и один профиль 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 
4b9b3361

Ответ 1

У вас закончились исходящие порты. Это означает, что вы выполнили тысячи исходящих подключений в течение двух минут. Решение: используйте пул соединений или замедлите работу программы.

Ответ 2

У меня была эта проблема в наборе машин, где некоторые запускали Win2003, некоторые работали под управлением Windows7, а многие из них работали под Linux. Я обнаружил, что закрытие всех процессов java и перезапуск помогли немного, особенно после запуска java-процессов в течение многих дней подряд. И, что очень помогло, Избежать утечки порта TCP/IP в MSDN с помощью MaxUserPort 10000 (дважды по умолчанию 5000) и TcpTimedWaitDelay 30 (минимум) на машине Win2003, которая запускала автономную селеновую сетку в роли роли-концентратора. REBOOT после изменения - по инструкциям в MSDN.

Команда Windows netstat -b была очень полезна на машине Win2003, чтобы подтвердить, что были открыты десятки и десятки подключений tcp/ip (порты 4444 и 5555); они, очевидно, были частью системы Selenium Grid (v2).

В Java я использую driver.quit(); в конце каждого метода испытаний. Я попробовал driver.close() и потерял возможность запускать более одного теста подряд.

Теперь я могу запустить 250 тестов с 0 исключениями, появляющимися на консоли Jub java.

Ответ 3

Если ваша ситуация похожа на мою, где вы

  • открыть порт 1
  • подключиться к машине
  • ??
  • закрыть порт 1
  • открыть порт 1
  • подключиться к другой машине

попробуйте добавить socket.setSoLinger(true, 0); непосредственно перед socket.close();.

Так же:

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

Это вынуждает ОС освобождать сокет, а не помещать его в состояние TIME_WAIT.