#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 — лучший способ сделать это, поскольку вы устанавливаете свои ограничения в конфигурации, а затем балансируете нагрузку для вас.