Параллельный запуск Seleium-тестов завершается неудачно, когда окна браузера перекрываются - PullRequest
0 голосов
/ 03 сентября 2018

Я использую следующий код (взят из Настройка собственной среды автоматизации тестирования )

var webdriver = require('selenium-webdriver'),
    By = webdriver.By,
    until = webdriver.until;

var driver_fx = new webdriver.Builder()
    .forBrowser('firefox')
    .usingServer('http://localhost:4444/wd/hub')
    .build();

var driver_chr = new webdriver.Builder()
    .forBrowser('chrome')
    .usingServer('http://localhost:4444/wd/hub')
    .build();

searchTest(driver_fx);
searchTest(driver_chr);

function searchTest(driver) {
  driver.get('http://www.google.com');
  driver.findElement(By.name('q')).sendKeys('webdriver');

  driver.sleep(1000).then(function() {
    driver.findElement(By.name('q')).sendKeys(webdriver.Key.TAB);
  });

  driver.findElement(By.name('btnK')).click();

  driver.sleep(2000).then(function() {
    driver.getTitle().then(function(title) {
      if(title === 'webdriver - Google Search') {
        console.log('Test passed');
      } else {
        console.log('Test failed');
      }
      driver.quit();
    });
  });


}

Предполагается открыть Firefox и Chrome, зайти в Google, ввести текст в поле ввода, нажать кнопку поиска и затем проверить заголовок окна.

Я запускаю сервер селена, используя:

java -Dwebdriver.gecko.driver=/home/sean/bin/geckodriver -Dwebdriver.chrome.driver=/home/sean/bin/chromedriver -jar ~/Downloads/selenium-server-standalone-3.14.0.jar

А затем node index.js для запуска тестов. Это открывает и Firefox и Chrome и выдает эту ошибку:

WebDriverError: Element <input name="btnK" type="submit"> is not clickable at point (564,411) because another element <div class="sbqs_c"> obscures it
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:13:22.693Z'
System info: host: 'mx', ip: '127.0.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.13.0-46-generic', java.version: '1.8.0_171'
Driver info: driver.version: unknown
    at Object.checkLegacyResponse (/home/sean/workspace/selenium-test/node_modules/selenium-webdriver/lib/error.js:546:15)
    at parseHttpResponse (/home/sean/workspace/selenium-test/node_modules/selenium-webdriver/lib/http.js:509:13)
    at doSend.then.response (/home/sean/workspace/selenium-test/node_modules/selenium-webdriver/lib/http.js:441:30)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:118:7)
From: Task: WebElement.click()
    at thenableWebDriverProxy.schedule (/home/sean/workspace/selenium-test/node_modules/selenium-webdriver/lib/webdriver.js:807:17)
    at WebElementPromise.schedule_ (/home/sean/workspace/selenium-test/node_modules/selenium-webdriver/lib/webdriver.js:2010:25)
    at WebElementPromise.click (/home/sean/workspace/selenium-test/node_modules/selenium-webdriver/lib/webdriver.js:2092:17)
    at searchTest (/home/sean/workspace/selenium-test/index.js:58:39)
    at Object.<anonymous> (/home/sean/workspace/selenium-test/index.js:47:1)
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)

Если я запускаю тесты в 1 браузере за раз, они оба проходят.

Я попытался не использовать сервер selenium и позволить модулю selenium-webdriver запускать процессы. Также попытался запустить концентратор с несколькими узлами (на одном компьютере) и запустить каждый браузер на другом узле. Все с одинаковой ошибкой.

Правильно ли я понимаю, что если в моих тестах есть такие действия, как click (), то только один экземпляр браузера (один и тот же веб-драйвер или нет) должен быть открыт одновременно на одной физической / виртуальной машине, чтобы окна браузера не перекрывали друг друга

Каковы лучшие практики? 1 докер на каждый узел селена и установка maxSession 1 для каждого узла? только открыть один браузер и запустить там все тесты?

Существуют ли средства автоматизации тестирования, которые не имеют этого ограничения?

Редактировать: использование сторонних сервисов, таких как набор браузеров и соусники, не вариант

1 Ответ

0 голосов
/ 03 сентября 2018

Я обнаружил, что сначала могу запустить концентратор:

java -Dwebdriver.gecko.driver=/home/sean/bin/geckodriver -Dwebdriver.chrome.driver=/home/sean/bin/chromedriver -jar ~/Downloads/selenium-server-standalone-3.14.0.jar -role hub

затем запустите несколько экземпляров узла селена, используя -maxSession 1 и используя xvfb с параметром -a (попробуйте получить бесплатный номер X-сервера):

xvfb-run -a --server-args="-screen 1, 1366x768x24" java -Dwebdriver.gecko.driver=/home/sean/bin/geckodriver -Dwebdriver.chrome.driver=/home/sean/bin/chromedriver -jar ~/Downloads/selenium-server-standalone-3.14.0.jar -role node -maxSession 1

Таким образом, я не могу открыть 2 браузера в одном сеансе (как в коде выше), но я могу открыть несколько сеансов на одном компьютере, где каждый запускает свой собственный браузер

Я все еще хотел бы услышать о других решениях и лучших практиках, так как сомневаюсь, что это лучшее решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...