Как ускорить Java Selenium Script, с минимальным временем ожидания - PullRequest
0 голосов
/ 14 декабря 2018

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

В основном я использовал каждый из приведенных ниже сценариев и запускал тест, хотя в каждом случае выполнялся сценарий, но я нахожу очень незначительное увеличение скорости выполнения сценария. Я использую ожидание

driver.manage().timeouts().implicitlyWait(10000,TimeUnit.MILLISECONDS);

и вместе с ним

!(driver.findElement(By.xpath("Element Xpath)).isEmpty()) 

или

driver.findElements(By.xpath("Element Xpath)).size()>0

Я знаю, что могу использовать селекторы CSS, но в моем случае это невозможно из-за структуры дерева DOM,что можно использовать вместо

driver.findElements(By.xpath("Element Xpath)).size()>0

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

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Существует несколько подходов для выполнения вашего набора тестов с оптимальной скоростью.Ваш кодовый блок дал бы нам больше информации о причине задержки, с которой вы столкнулись.Тем не менее, в отношении ваших фрагментов кода есть несколько способов:

  • implicitlyWait(10000,TimeUnit.MILLISECONDS);: день ото дня все больше и больше веб-приложений переходят на JavaScript , jQuery , AngularJS , ReactJS и т. Д., ExplicitWait т.е. WebDriverWait стали обязательной мерой для синхронизациибыстро движущийся экземпляр WebDriver , то есть драйвер с запаздывающим клиентом браузера .Но опять же согласно документации :

Не смешивайте неявные и явные ожидания.Это может привести к непредсказуемому времени ожидания.Например, установка неявного ожидания 10 секунд и явного ожидания 15 секунд может привести к возникновению тайм-аута через 20 секунд.

  • Таким образом, первым шагом будет получениеизбавиться от всех неявноWait и заменить их на WebDriverWait

  • driver.findElements(By.xpath("Element Xpath)).size()>0: findElement() и findElements() подвержены влиянию 'неявное время ожидания, действующее на момент исполнения.Вызов findElement(..) вернет совпадающую строку или повторяет попытку несколько раз, пока не будет достигнуто настроенное время ожидания.findElement() не должен использоваться для поиска несуществующих элементов, вместо этого используйте findElements(By) и assert ответ нулевой длины.Все это добавляет много накладных расходов.Скорее, я бы порекомендовал блок try-catch {} с определенной стратегией локатора , поймать исключение в случае ошибки и двигаться дальше.

  • Подробное обсуждение можно найти в NoSuchElementException с методом isDisplayed () в блоке try catch в Selenium
  • Согласно текущей Рекомендации WebDriver-W3C ниже приведен списокпредпочтительный Стратегии локатора :

Locator Strategies_W3C

  • Существует некоторая разница в производительности используя CssSelector и XPath .Вот некоторые из них:
    • Для начала, между XPath и CSS нет существенной разницы в производительности.
    • Обход DOM в старых браузерах, таких как IE8, не работает с CSS, но в XPath это нормально.И XPath может проходить вверх по DOM (например, от дочернего к родительскому), тогда как CSS может проходить только по DOM (например, от родительского к дочернему).Однако отсутствие возможности обхода DOM с помощью CSS в старых браузерах не обязательно является плохой вещью, поскольку это скорее показатель того, что ваша страница имеет плохой дизайн и может извлечь пользу из некоторой полезной разметки.
    • Аргумент вПреимущество CSS заключается в том, что они более читабельны, кратки и лаконичны, хотя это субъективный вызов.
    • Бен Бертон упоминает, что вы должны использовать CSS, потому что именно так приложенияпостроены.Это облегчает написание тестов, их обсуждение и помощь в ведении других.
    • Адам Гоше говорит о необходимости применения более гибридного подхода - в первую очередь на идентификаторахзатем CSS и использование XPath только тогда, когда вам это нужно (например, прогулка по DOM) и что XPath всегда будет более мощным для продвинутых локаторов.
    • Подробное обсуждение можно найти в Почему я долженкогда-либо использовать селекторы CSS в отличие от XPath для автоматического тестирования?

Заключение

Принимая во внимание вышеупомянутые факторы, необходимо учитывать:

0 голосов
/ 14 декабря 2018

Есть несколько проблем с вашим подходом.

  1. .implicitlyWait() на самом деле не ждет.Он устанавливает время ожидания для экземпляра драйвера, поэтому вам нужно установить его только один раз, а не вызывать его каждый раз, когда вы захотите подождать.

  2. driver.findElement(...).isEmpty() не будет компилироваться.Может быть, вы имели в виду .findElements()?В любом случае, .isEmpty() против .size() > 0 будет незначительной разницей в скорости.

  3. Основная проблема заключается в том, что у вас включено неявное ожидание при проверке чего-либо, что НЕ может бытьнастоящее ... особенно 10 секунд ожидания.Это означает, что каждый раз, когда проверяется элемент, Selenium будет ждать 10 секунд, даже если он ожидает, что его там НЕ будет.

Вам будет лучше обслужить, отключив неявное ожидание (настройкадо 0), а затем проверьте наличие на наличие элементов, которых, как вы ожидаете, там нет, а затем включите его снова.Это будет 10s x # проверок существования, которых вы ожидаете, что их там не будет.В зависимости от того, сколько проверок существования вы проводите, это может привести к большому количеству времени.Недостатком этого является то, что если у вас сложная страница с фоновыми процессами, вам нужно будет подождать, пока страница (или часть страницы) завершит загрузку, прежде чем проверять наличие элементов с неявным ожиданием.

Примечание: авторы Selenium заявили, что неявное ожидание не должно использоваться.Вместо этого используйте WebDriverWait, но это совсем другое обсуждение.

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