Получаю следующую ошибку Selenium Server: [1567550645.996][SEVERE]: bind() failed: Cannot assign requested address (99)

Вопрос или проблема

Я пытаюсь настроить Selenium Grid на сервере EC2, и ниже приведены шаги, которые я предпринял до сих пор.

  1. Запустите HUB на порту 4044

    java -jar /ebst/wrangler/upla/bin/selenium-server-standalone-3.141.59.jar -role hub -port 4044
    
  2. Зарегистрируйте узел на 4045

    java -Dwebdriver.chrome.driver="~/chromedriver" -jar ~/selenium-server-standalone-3.141.59.jar -role node -hub http://hubURL:4044/grid/register -port 4045
    
  3. Запустите 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 связаться с указанным портом. Данное обстоятельство возможно из-за ограничений сети или конфигурации, свойственных вашему окружению. Понимание ключевых компонентов поможет разобраться в корне проблемы:

  1. Selenium Server – действует как посредник между узлом и механизмом WebDriver. В вашей настройке используется для запуска хаба и узлов.

  2. ChromeDriver – управляет экземплярами браузера Chrome, получая команды от Selenium Server.

  3. EC2 и сетевая конфигурация – виртуальные машины AWS могут иметь ограничения по портам, доступным для использования.

Практический пример (Example)

В вашем случае хаб настроен на использование порта 4044, а узел — 4045. Однако при запуске ChromeDriver явно не указано какой именно порт он должен использовать, что приводит к его случайному выбору. Из-за сетевых ограничений AWS (или корпоративного брандмауэра) случайно выбранный ChromeDriver порт может быть занят, что и вызывает ошибку.

Применение (Application)

Чтобы устранить данную проблему, вам следует настроить фиксированное значение порта для ChromeDriver, а также убедиться в правильности путей и доступности всех используемых ресурсов. Ниже шаги, которые помогут в этом:

  1. Явно укажите путь к ChromeDriver: Убедитесь, что используете полный путь к ChromeDriver, а не символические ссылки ~/ или относительные пути.

    Например, замените:

    -Dwebdriver.chrome.driver="~/chromedriver"

    на:

    -Dwebdriver.chrome.driver="/полный/путь/к/chromedriver"
  2. Установка фиксированного порта для ChromeDriver: Во избежание случайного выбора порта, укажите необходимый порт, например 9515, в конфигураторе ChromeOptions:

    chromeOptions.addArguments("--port=9515");
  3. Настройки безопасности и сетевые политики: Убедитесь, что брандмауэр или политики безопасности AWS EC2 разрешают трафик на выбранных портах (4044, 4045 и 9515).

  4. Обновление ChromeDriver: Проверьте и обновите версию ChromeDriver, чтобы она была совместима с текущим версионным браузером.

  5. Диагностика и отладка: Запустите средство проверки бизнес-процессов AWS (например, AWS CloudWatch) для анализа сетевой активности и выявления отказов подключения.

Рекомендации по улучшению

  • Актуальность версий: Регулярно обновляйте Java, Selenium, Chrome и ChromeDriver до последних стабильных версий, чтобы избежать несовместимостей.
  • Документация и логирование: Развёрнутая система логирования поможет быстрее выявлять и решать сетевые и конфигурационные проблемы.
  • Тестирование конфигураций: Используйте тестовые стенды для обкатки конфигураций, уменьшая риск возникновения инцидентов в продуктивном окружении.

Подытоживая, правильная настройка портов и учет ограничений сетевой архитектуры вашего окружения EC2 позволят устранить ошибку и обеспечить реальности работы Selenium Grid. Если проблема остается актуальной, детальный анализ сетевых политик и их настройка с участием администратора AWS могут оказаться необходимыми.

Оцените материал
Добавить комментарий

Капча загружается...