Ответ 1
У вас закончились исходящие порты. Это означает, что вы выполнили тысячи исходящих подключений в течение двух минут. Решение: используйте пул соединений или замедлите работу программы.
При запуске 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
У вас закончились исходящие порты. Это означает, что вы выполнили тысячи исходящих подключений в течение двух минут. Решение: используйте пул соединений или замедлите работу программы.
У меня была эта проблема в наборе машин, где некоторые запускали 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.
Если ваша ситуация похожа на мою, где вы
- открыть порт 1
- подключиться к машине
- ??
- закрыть порт 1
- открыть порт 1
- подключиться к другой машине
попробуйте добавить socket.setSoLinger(true, 0);
непосредственно перед socket.close();
.
Так же:
socket.setSoLinger(true, 0);
socket.close();
Это вынуждает ОС освобождать сокет, а не помещать его в состояние TIME_WAIT
.