Selenium remotewebdriver запускает двоичный файл браузера, но не получает веб-драйвер — как я могу очистить процесс браузера

Мы работаем в инфраструктуре, которая иногда сильно тормозит. Что мы видим, так это то, что когда мы делаем вызов remotewebdriver, запускается firefox.exe, но из-за того, что машина очень медленная и у нас есть 15-секундный тайм-аут, создание веб-драйвера не удается. Итак, мы потерпели неудачу, но теперь у нас есть румяный процесс firefox, использующий память - после того, как тонны сборок запущены на наших удаленных машинах с селеном, мы видим сотни оставшихся процессов firefox, сидящих там. Я не могу закрыть или выйти из драйвера - у меня нет драйвера, так как вызов remotewebdriver не удался .... как я могу узнать, какой процесс Firefox мы только что создали, чтобы убить его? Это то, что должно быть очищено селеном? Мы используем java.


person A. Reitmeyer    schedule 16.08.2017    source источник


Ответы (2)


Чтобы избежать подобных проблем, вы должны убедиться, что driver.quit() вызывается, когда браузер больше не требуется.

Предполагая стек Java, скорее всего, вы используете платформу TestNG или JUnit. Лучшим местом для освобождения ресурсов будет либо один из @After... методов (в зависимости от выбранной стратегии управления сеансом), либо специальные слушатели. Например:

@AfterMethod
public void tearDown() {
    if (driver != null)
        driver.quit();
}
person Sergey Korol    schedule 16.08.2017
comment
Проблема в том, что у меня нет драйвера - вы пропустили эту часть - драйвер не был создан - только процесс firefox.... - person A. Reitmeyer; 17.08.2017
comment
@A.Reitmeyer нет, я этого не пропустил. А также вы не предоставили трассировку стека и журнал/конфигурацию сетки. Будьте более точны в деталях, пожалуйста. Особенно, когда вы говорите о тайм-аутах. - person Sergey Korol; 17.08.2017
comment
Спецификация версий Selenium/браузера/драйвера также будет полезна. - person Sergey Korol; 17.08.2017

Как вы упомянули firefox.exe is started but because the machine is so slow and we have a 15 second timeout, creating the webdriver does not succeed и see hundreds of leftover firefox processes sitting out there, у меня есть 4 решение, которое может вам подойти.

  1. Поскольку наша цель - протестировать приложение, я думаю, что мы все равно не должны возиться с загрузкой страницы. Установка 15 second timeout приведет только к провалу наших попыток активировать приложение, чтобы начать процесс тестирования. Следовательно, лучшей альтернативой было бы позволить экземпляру WebDriver запускать приложение в обычном режиме, чтобы Selenium получил чистый Document.readyState == complete из DOM tree
  2. Поскольку вы говорили о том, что машина работает медленно, самым следующим действием будет убедиться, что Test Bed настроен с требуемым Hardware (CPU, RAM, ROM, Cache) and Software (Selenium, WebDriver, WebBrowser versions) resources. Убедитесь, что Test Machines, на котором запущены Automation Script и Testcases, изолированы от других взаимодействий пользователей.
  3. Кроме того, если вы хотите сократить время загрузки страницы и хотите начать взаимодействие с WebElements, как только они загрузятся, в этом случае вы можете рассмотреть возможность настройки pageLoadStrategy. Настройкой по умолчанию для pageLoadStrategy является normal, которую мы можем изменить на eager. Установка pageLoadStrategy в eager подразумевает, что как только WebElements загружаются в HTML DOM и interactive, ваш скрипт возобновляет выполнение.
  4. Теперь основную проблему с hundreds of leftover firefox processes sitting out there можно решить, сохранив блокирующую часть кода в блоке try. Если блок кода в пределах try завершается успешно, наш скрипт продолжает работу. В случае сбоя try мы вызовем quit() в блоке catch(), чтобы экземпляр браузера Firefox и экземпляр WebDriver корректно завершили работу. Схема блока кода выглядит следующим образом:

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    public class Q45703729_firefox_process {
    
        public static void main(String[] args) {
    
    
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver =  new FirefoxDriver();
            try {
                driver.get("https://stackoverflow.com");
                System.out.println("Application opened");
            } catch (Exception e) {
                System.out.println("Unable to open Application. Quiting ...");
                driver.quit();
            }
            System.out.println("Page Title is : "+driver.getTitle());
            //Do other tasks
            driver.quit();
        }
    }
    
person DebanjanB    schedule 16.08.2017
comment
Для 1 балла: фраза firefox.exe is started but because the machine...., которую вы подчеркиваете и собираетесь ответить, заключена в формат кода. Поэтому я думаю, было бы лучше, если бы вы выделили ее курсивом или полужирным шрифтом. Пункт 2: да, с фигурными скобками проблем нет, я меняю их для большей читабельности. В любом случае у меня есть откат изменений. - person NarendraR; 16.08.2017
comment
Пункты 2 и 3 не имеют отношения к моему вопросу. Пункт 1 также не является правильным ответом для меня - в этой ситуации страница, скорее всего, никогда не загрузится. Процесс firefox.exe запускается, а geckodriver.exe — нет. Мне нужен способ очистить его. Поэтому - пункт 4 для меня тоже недействителен, так как я никогда не получаю драйвер. - person A. Reitmeyer; 17.08.2017