Могу ли я заставить Selenium WebDriver ждать перед каждым действием? (Для целей отладки) - PullRequest
0 голосов
/ 05 июля 2018

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

На данный момент я решаю это, поместив что-то вроде

Thread.sleep(humanWaitTime) 

перед каждым методом, но он отрицает цель написания эффективного кода.

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Возможно, вы можете использовать неявное ожидание,

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);

Допустим, в верхней части блока кода вы пишете: -

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

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

Неявное ожидание скажет веб-драйверу подождать определенное время, прежде чем он выдаст «Нет такого исключения элемента». Значение по умолчанию равно 0. Как только мы установим время, веб-драйвер будет ждать этого времени, прежде чем выдать исключение.

0 голосов
/ 10 июля 2018

Вы можете использовать WebDriverEventListener и подделать ожидание для несуществующего элемента, вам следует:

  1. создать класс: public class CustomDriverListener implements WebDriverEventListener и реализовать все методы
  2. в этом классе добавить следующий метод:

    private void fakeWaiter(WebDriver driver) { WebDriverWait wait = new WebDriverWait(driver, 20); try { wait.until(listenerDriver -> listenerDriver.findElement(By.xpath("//[.='it'sFakeElement']"))); } catch (org.openqa.selenium.TimeoutException e) { //ignore it } }

  3. добавьте вызов этого метода в нужные вам методы, например:

    @Override public void afterFindBy(By by, WebElement element, WebDriver driver) { fakeWaiter(driver); } @Override public void afterClickOn(WebElement element, WebDriver driver) { fakeWaiter(driver); } @Override public void afterChangeValueOf(WebElement element, WebDriver driver, CharSequence[] keysToSend) { fakeWaiter(driver); } @Override public void afterScript(String script, WebDriver driver) { fakeWaiter(driver); }

  4. Создайте объект EventFiringWebDriver и зарегистрируйте свой CustomDriverListener

    WebDriver webDriver = new ChromeDriver();<br> EventFiringWebDriver driver = new EventFiringWebDriver(webDriver); driver.register(new CustomDriverListener());

Теперь, если вы используете в своих тестах « драйвер », все операции будут выполняться медленнее (зависит от таймера в методе fakeWaiter )

P.S. извините за плохое форматирование = (

0 голосов
/ 05 июля 2018

Есть ли способ установить это глобально, Нет .

Когда вы пишете Thread.sleep(humanWaitTime), выполнение останавливается на точный период времени, который вы упомянули в humanWaitTime.

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

Я бы предложил вам использовать явное ожидание для вашего сценария.

Вы можете создать экземпляр WebDriverWait следующим образом:

WebDriver wait = new WebDriverWait(driver, 30);  // at fixture level or set up level. 

и затем вы можете использовать wait ссылку так, как вы хотите:

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("static id")));  

Вы можете обратиться по этой ссылке: Официальные документы Selenium

...