Вопрос или проблема
Я пытаюсь настроить Selenium Grid на сервере EC2, и ниже приведены шаги, которые я предпринял до сих пор.
-
Запустите HUB на порту 4044
java -jar /ebst/wrangler/upla/bin/selenium-server-standalone-3.141.59.jar -role hub -port 4044
-
Зарегистрируйте узел на 4045
java -Dwebdriver.chrome.driver="~/chromedriver" -jar ~/selenium-server-standalone-3.141.59.jar -role node -hub http://hubURL:4044/grid/register -port 4045
-
Запустите Webdriver в моем Java коде
import cucumber.api.java.Before; import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import java.net.MalformedURLException; import java.net.URL; public class Test { WebDriver driver; @Before public void setup() throws MalformedURLException { String nodeURL = "http://hubURL:4044/wd/hub"; System.out.println("setting up"); DesiredCapabilities desiredCapabilities = DesiredCapabilities.chrome(); desiredCapabilities.setBrowserName("chrome"); desiredCapabilities.setPlatform(Platform.LINUX); ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments( "--verbose", "--headless", "--disable-web-security", "--ignore-certificate-errors", "--allow-running-insecure-content", "--allow-insecure-localhost", "--no-sandbox", "--disable-gpu"); chromeOptions.merge(desiredCapabilities); driver = new RemoteWebDriver(new URL(nodeURL), chromeOptions); System.out.println("setting up done"); } }
На консоли я получил следующую ошибку из-за тайм-аута.
org.openqa.selenium.WebDriverException: unknown error: cannot find Chrome binary (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 3.10.0-1062.el7.x86_64 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 16 milliseconds Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53' System info: host: 'ip-10-160-169-203.syd.non.c1.macquarie.com', ip: '10.160.169.203', os.name: 'Linux', os.arch: 'amd64', os.version: '3.10.0-1062.el7.x86_64', java.version: '1.8.0_181' Driver info: driver.version: unknown Command duration or timeout: 523 milliseconds
Когда я перешел обратно на сервер узла, это сообщение было отображено.
22:44:05.604 INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.grid.session.remote.ServicedSession$Factory (provider: org.openqa.selenium.chrome.ChromeDriverService) Starting ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) on port 3459 Only local connections are allowed. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code. [1567550645.675][SEVERE]: bind() failed: Cannot assign requested address (99) 22:44:05.988 INFO [ActiveSessionFactory.apply] - Capabilities are: { "browserName": "chrome", "goog:chromeOptions": { "args": [ "--verbose", "--headless", "--disable-web-security", "--ignore-certificate-errors", "--allow-running-insecure-content", "--allow-insecure-localhost", "--no-sandbox", "--port:4040", "--disable-gpu" ], "extensions": [ ] }, "platform": "LINUX", "version": "" }
Я понимаю, что ошибка возникает из-за того, что в нашей компании доступны только определенные порты, и ChromeDriver запускается на случайном порте каждый раз. Чтобы указать порт, на который ChromeDriver запускается каждый раз, я пробовал все виды спецификаций для моих ChromeOptions и RemoteWebDriver в коде Java, но безуспешно.
Является ли это правильным способом запуска Selenium Server на EC2?
Любая помощь будет сильно оценена!
Попробуйте вместо этого следующую команду:
java -Dwebdriver.chrome.driver="<path-of-chromedriver>" -jar ~/node_modules/webdriver-manager/selenium/selenium-server-standalone-3.141.59.jar -port 4444
Я думаю, что ChromeDriver и Selenium должны работать на одном порту.
Ответ или решение
Ошибка, с которой вы столкнулись, связана с попыткой запуска ChromeDriver на порту, однозначно недоступном. Давайте детализируем проблему и возможные решения, ориентируясь на предоставленные вами сведения и контекст.
Теоретическая часть (Theory)
Ваша цель состоит в развертывании Selenium Grid на сервере EC2 с использованием Selenium Server и ChromeDriver. Ошибка bind() failed: Cannot assign requested address (99)
свидетельствует о невозможности ChromeDriver связаться с указанным портом. Данное обстоятельство возможно из-за ограничений сети или конфигурации, свойственных вашему окружению. Понимание ключевых компонентов поможет разобраться в корне проблемы:
-
Selenium Server – действует как посредник между узлом и механизмом WebDriver. В вашей настройке используется для запуска хаба и узлов.
-
ChromeDriver – управляет экземплярами браузера Chrome, получая команды от Selenium Server.
-
EC2 и сетевая конфигурация – виртуальные машины AWS могут иметь ограничения по портам, доступным для использования.
Практический пример (Example)
В вашем случае хаб настроен на использование порта 4044, а узел — 4045. Однако при запуске ChromeDriver явно не указано какой именно порт он должен использовать, что приводит к его случайному выбору. Из-за сетевых ограничений AWS (или корпоративного брандмауэра) случайно выбранный ChromeDriver порт может быть занят, что и вызывает ошибку.
Применение (Application)
Чтобы устранить данную проблему, вам следует настроить фиксированное значение порта для ChromeDriver, а также убедиться в правильности путей и доступности всех используемых ресурсов. Ниже шаги, которые помогут в этом:
-
Явно укажите путь к ChromeDriver: Убедитесь, что используете полный путь к ChromeDriver, а не символические ссылки
~/
или относительные пути.Например, замените:
-Dwebdriver.chrome.driver="~/chromedriver"
на:
-Dwebdriver.chrome.driver="/полный/путь/к/chromedriver"
-
Установка фиксированного порта для ChromeDriver: Во избежание случайного выбора порта, укажите необходимый порт, например 9515, в конфигураторе ChromeOptions:
chromeOptions.addArguments("--port=9515");
-
Настройки безопасности и сетевые политики: Убедитесь, что брандмауэр или политики безопасности AWS EC2 разрешают трафик на выбранных портах (4044, 4045 и 9515).
-
Обновление ChromeDriver: Проверьте и обновите версию ChromeDriver, чтобы она была совместима с текущим версионным браузером.
-
Диагностика и отладка: Запустите средство проверки бизнес-процессов AWS (например, AWS CloudWatch) для анализа сетевой активности и выявления отказов подключения.
Рекомендации по улучшению
- Актуальность версий: Регулярно обновляйте Java, Selenium, Chrome и ChromeDriver до последних стабильных версий, чтобы избежать несовместимостей.
- Документация и логирование: Развёрнутая система логирования поможет быстрее выявлять и решать сетевые и конфигурационные проблемы.
- Тестирование конфигураций: Используйте тестовые стенды для обкатки конфигураций, уменьшая риск возникновения инцидентов в продуктивном окружении.
Подытоживая, правильная настройка портов и учет ограничений сетевой архитектуры вашего окружения EC2 позволят устранить ошибку и обеспечить реальности работы Selenium Grid. Если проблема остается актуальной, детальный анализ сетевых политик и их настройка с участием администратора AWS могут оказаться необходимыми.