Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

кто знает, подскажите: нюансы использования ожиданий или задержек


(Garik) #1

Кратко о проблеме:

написал скрипт создания/добавления продукта в интернет-магазине на Мадженто. Без цикла, добавление продукта проходит на ура. Когда добавил цикл "while", скрипт начал зависать при открытии страницы (страница генирируется динамически).

При дебаге, прохождении пошагово - все нормально проходит. Вставлял задержки и ожидания - не помогло. Мне кажется возникает какой-то Exception. Обернул цикл в try{} catch (Exception e) {System.out.println(e);} - ошибка не выводится.

Возникли несколько вопросов:

1. Что лучше использовать Thread.sleep() или driver.manage().timeouts().implicitlyWait(X, TimeUnit.MILLISECONDS)?

и какая разница?

2. Как лучше реализовать ожидание появления елемента?

и как вывести сообщение о превышении времени ожидания?

Примерный код:

 

        while (i<3) {
            try {
            // add product
            //Thread.sleep(3000);
            driver.manage().timeouts().implicitlyWait(3, TimeUnit.MILLISECONDS);
            driver.findElement(By.xpath("//button[span='Add Product']")).click();
            new Select(driver.findElement(By.id("attribute_set_id"))).selectByVisibleText("Type Attribute Product");
            new Select(driver.findElement(By.id("product_type"))).selectByVisibleText("Simple Product");
            //Thread.sleep(2000);
            driver.manage().timeouts().implicitlyWait(2, TimeUnit.MILLISECONDS);
            driver.findElement(By.xpath("//button[span='Continue']")).click();
            // edit tab "General"
            driver.manage().timeouts().implicitlyWait(3, TimeUnit.MILLISECONDS);
            WebDriverWait wait = new WebDriverWait(driver, 5);
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("name")));
// ВОТ ЗДЕСЬ ЗАВИСАЕТ
            driver.findElement(By.id("name")).clear();
            driver.findElement(By.id("name")).sendKeys("AutoTestProduct#"+Integer.toString(i));
            driver.findElement(By.id("description")).clear();
...
            Thread.sleep(12000); // сохранение продукта
            i++;
            } catch (Exception e) {
                System.out.println(e);
            }
 
PS. Если браузер рефрешнуть или если тест не остановить и кликнуть на некоторых элементах (например: удаляю созданый продукт), то цикл идет дальше и создаются все новые продукты.

 


(vmaximv) #2

1. Озвучте версию WD и браузера

2. Поясните что значит "зависает"

3. Покажите лог селениума/драйвера браузера

4. Уберите блок try{}catch{} - при такой реализации если будете ловить экшепшены в цикле, получите "бесконечный цикл", т.к. до i++ в жизни не дойдете :)


(Sergey Korol) #3

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

driver.manage().timeouts().implicitlyWait задается только 1 раз и живет ровно столько, сколько и сам драйвер.

Разница между слипами и имлисити вейтами доступно описана во втором абзаце селениум доков.


(Garik) #4

1. Озвучте версию WD и браузера

WD=> selenium-server-standalone-2.25.0.jar

браузер=> driver = new FirefoxDriver(new FirefoxBinary(new File("C:/My_Program/Mozilla Firefox 17/firefox.exe")), profile); (в данном случае 17-й, но подобное и в16, можно проверить во всех)

2. Поясните что значит "зависает"

запускаю программу, один цикл проходит - создает 1-й продукт, идет на второй круг: нажимается кнопка "Add Product", затем в селектах выбирается тип продукта и набор аттрибутов и нажимается кнопка "Continue", и вот после этого нет внешних проявлений хода программы (тупо стоит на открытой странице)

3. Покажите лог селениума/драйвера браузера

копирую только ошибки:

Метка времени: 30.01.2013 11:00:15

Ошибка: TelemetryStopwatch: key "FX_SESSION_RESTORE_COLLECT_DATA_MS" was already initialized
Источник: resource://gre/modules/TelemetryStopwatch.jsm
Строка: 53
Метка времени: 30.01.2013 11:00:30
Ошибка: TelemetryStopwatch: key "FX_SESSION_RESTORE_COLLECT_DATA_MS" was already initialized
Источник: resource://gre/modules/TelemetryStopwatch.jsm
Строка: 53

4. Уберите блок try{}catch{}

убреру. Спс

 


(Garik) #5

ОК. Понял!


(vmaximv) #6

Апдейтайте WD - поддержка нативных инвентов для ФФ 16 релизнута в 2.26, а для ФФ 17 в 2.27

 

v2.26.0
=======
WebDriver:

........................

* Added support for native events for Firefox 15 and 16.

.......................

http://code.google.com/p/selenium/source/browse/java/CHANGELOG


(Garik) #7

Апдейтайте WD

OK! попробую. спс

Можешь подсказать/показать еффективный/работающий код   для реализации ожидания появления елемента с выводом сообщения о превышении времени ожидания?

.... мол сорри я ждал-ждал, а элемента не вижу!.. 

 


(vmaximv) #8

wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("name")));

- вполне годно - но незачем повторно искать элемент:

WebElement productName = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("name")));
productName.clear();
productName.sendKeys("AutoTestProduct#"+Integer.toString(i));

а эксепшен будет по таймауту

 

возможны косяки с isDisplayed() в сложных приложениях аля GWT, но это выходит за рамки топика.


(Garik) #9

Все заработало. Большое Спасибо!


(Garik) #10

Большое спасибо всем за советы. Все заработало. Не думал, что у Selenium такой капризный.

Обновил Firefox + скачал новые версии webDriver (27,28,29). С новым FireFox-ом заработали нормально 27 и 28 версии, а 29 - глючит. 

Капризная штучка, этот Selenium!  ;-)