Асинхронный запуск нескольких экземпляров selenium webdriver (firefox)

#javascript #node.js #selenium #selenium-webdriver

#javascript #node.js #selenium #selenium-webdriver

Вопрос:

Как я могу заставить свой webdriver запрашивать несколько страниц (или открывать несколько браузеров) одновременно, одновременно?

Все решения, которые я нашел в Интернете, ожидают завершения загрузки предыдущего сеанса и только после этого открывают новый экземпляр браузера.

Я пробовал selenium-webdriver, webdriverjs и wdjs, и ни один из них, похоже, не может выполнять несколько HTTP-запросов для разных страниц асинхронно. Даже такие решения, как это https://github.com/OniOni/wd-parallel-async не сработает. Все они открываются по одному за раз.

Я что-то упустил?

PS: я не хочу запускать несколько браузеров одновременно! Я хочу запустить несколько экземпляров одного и того же браузера.

Комментарии:

1. Я думаю, что я немного неправильно понял веб-драйверы. Да, кажется, что все они открываются по одному за раз, но как только они открыты, я могу управлять ими независимо.

Ответ №1:

Что-то вроде:

 WebDriver driver1 = new FirefoxDriver();
WebDriver driver2 = new FirefoxDriver();
WebDriver driver3 = new FirefoxDriver();
driver1.get("page1");
driver2.get("page2");
driver3.get("page3");
  

Если вам это нужно по-настоящему асинхронно, тогда вам нужно будет перейти на Java threading … что сделало бы это более продолжительным обсуждением и не по теме для SO.

Комментарии:

1. Вы знаете, будут ли файлы cookie использоваться совместно между экземплярами? Мне нужно, чтобы они были изолированы и имели свой собственный файл cookie.

2. Каждый WebDriver driverX = new FirefoxDriver(); из них создаст новый экземпляр Firefox со своим собственным отдельным профилем … и отдельное хранилище файлов cookie.

3. Хорошо, я только что проверил это, вы правы 😉 Спасибо за отзыв.

4. Поддерживают ли драйверы Chrome и IE аналогичные изолированные экземпляры?

5. Я предполагаю, что это означает, что вы получите отдельный сеанс для каждого экземпляра браузера, правильно?

Ответ №2:

Используйте потоковую обработку. Я вижу, у вас есть node.js помеченный…Я не так хорошо знаком с этим, но ниже приведен пример c #, который работает … должна применяться аналогичная теория. c#

     Parallel.Invoke(
        ()=> { 1st test execution call },
        ()=> { 2nd test execution call },
        ()=> { 3rd test execution call }
    );
  

Хотя будьте осторожны, так как webdriver иногда может запутаться и перекрывать окна. Я обнаружил, что одновременное выполнение более 5 на одном компьютере приводит к различным проблемам. Если вы используете Parallel.Invoke в c #, вы можете ограничить это, чтобы разрешить только определенное число за раз … хотя Grid — лучший способ сделать это, поскольку вы устанавливаете свои ограничения в конфигурации, а затем балансируете нагрузку для вас.