Вопрос по WebDriver (Selenium) к гуру
#1
Отправлено 25 ноября 2011 - 14:42
Что посоветуете , есть авто-тест вызывающий страницу сайта с разными элементами ( линки, поп-ап диалоги, фреймы ) , также страница имеет AJAX- запросы, т.е грузится может долго.Как сделать, чтобы тест ждал пока загрузятся нужные элементы( т.е страница полностью) и уже потом проверял дальше, а не давал ошибку. Вариант со Thread.sleep()после каждого запроса не устраивает. Заранее спасибо за помощь.
#2
Отправлено 25 ноября 2011 - 15:41
Написать метод ожидания появления элементов.
#3
Отправлено 25 ноября 2011 - 19:03
Добрый день.
Что посоветуете , есть авто-тест вызывающий страницу сайта с разными элементами ( линки, поп-ап диалоги, фреймы ) , также страница имеет AJAX- запросы, т.е грузится может долго.Как сделать, чтобы тест ждал пока загрузятся нужные элементы( т.е страница полностью) и уже потом проверял дальше, а не давал ошибку. Вариант со Thread.sleep()после каждого запроса не устраивает. Заранее спасибо за помощь.
Попробуйте это http://stackoverflow...-nameusername-s
#4
Отправлено 25 ноября 2011 - 19:26
#5
Отправлено 28 ноября 2011 - 12:15
Добрый день.
Что посоветуете , есть авто-тест вызывающий страницу сайта с разными элементами ( линки, поп-ап диалоги, фреймы ) , также страница имеет AJAX- запросы, т.е грузится может долго.Как сделать, чтобы тест ждал пока загрузятся нужные элементы( т.е страница полностью) и уже потом проверял дальше, а не давал ошибку. Вариант со Thread.sleep()после каждого запроса не устраивает. Заранее спасибо за помощь.
Попробуйте это http://stackoverflow...-nameusername-s
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - это очень хорошо. Вот только у нас тесты реализованы по структре PageObject ,
т.е отдельный класс для описания страниц сайта и потом уже отдельные классы для тестов. в это случае эта фича не хочет работать , или может кто знает как ее настроить?
класс для определения веб-драйвера браузера.
protected WebDriver driver;
protected static final String SITE_URL = "http://адрес сайта";
@Parameters ({"BROWSER"})
@BeforeTest
public void setUp(String BROWSER) throws Exception {
System.out.println("Browser: " + BROWSER);
if (BROWSER.equals("FF")) {
System.out.println("FF is selected");
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); \\ не работает
} else if (BROWSER.equals("IE")) {
System.out.println("IE is selected");
driver = new InternetExplorerDriver();
} else if (BROWSER.equals("CH")){
System.out.println("Google chrome is selected");
driver = new ChromeDriver();
} else {
System.out.println("FF is selected");
driver = new FirefoxDriver();
}
}
#6
Отправлено 29 ноября 2011 - 07:34
Конкретный пример можете привести -- где не работает?driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - это очень хорошо. Вот только у нас тесты реализованы по структре PageObject ,
т.е отдельный класс для описания страниц сайта и потом уже отдельные классы для тестов. в это случае эта фича не хочет работать , или может кто знает как ее настроить?
Не очень в это верится, потому что PageObject внутри использует те же самые методы findElement и findElements.
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#7
Отправлено 29 ноября 2011 - 08:05
Применял такое решение (хотя оно очень напряжное):
package com.qulix.ft.webdriver.extensions; import org.openqa.selenium.*; import org.openqa.selenium.ie.InternetExplorerElement; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.remote.SessionId; import java.io.File; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; /** * Расширение класса org.openqa.selenium.ie.InternetExplorerDriver */ public class InternetExplorerDriver extends org.openqa.selenium.ie.InternetExplorerDriver { private long implTime = 0; private TimeUnit implUnit = TimeUnit.SECONDS; /** * Конструктор. Задает таймауты ожидания */ public InternetExplorerDriver() { super(); } public Options manage(){ return new RemoteWebDriverOptions(); } protected class RemoteWebDriverOptions extends org.openqa.selenium.remote.RemoteWebDriver.RemoteWebDriverOptions{ public Timeouts timeouts(){ return new Timeouts(); } protected class Timeouts extends RemoteTimeouts{ public org.openqa.selenium.WebDriver.Timeouts implicitlyWait(long time, TimeUnit unit){ implTime = time; implUnit = unit; return super.implicitlyWait(time, unit); } } } public long getImplicitlyTimeout(){ return implUnit.toMillis(implTime); } /** * Конструктор. * @param capabilities * @see org.openqa.selenium.ie.InternetExplorerDriver */ public InternetExplorerDriver(Capabilities capabilities) { super(capabilities); } /** * * * @param by Локатор * @return com.qulix.ft.webdriver.extensions.InternetExplorerElement */ public WebElement findElement(By by) { long now = new Date().getTime(); InternetExplorerElement element; do{ try{ element = super.findElement(by); break; } catch (WebDriverException e){ if (new Date().getTime() - now > getImplicitlyTimeout()){ log(getSessionId(), "findElement", by + ". Timeout of: " + getImplicitlyTimeout()); throw new WebDriverException(e); } } } while (true); return element; } /** * @param by Локатор * @return список com.qulix.ft.webdriver.extensions.InternetExplorerElement */ public List<WebElement> findElements(By by) { long now = new Date().getTime(); do{ try{ elements = super.findElements(by); break; } catch (WebDriverException e){ if (new Date().getTime() - now > getImplicitlyTimeout()){ log(getSessionId(), "findElements", by + ". Timeout of: " + getImplicitlyTimeout()); throw new WebDriverException(e); } } } while (true); return elements; } }
Аналогично нужно переопределить методы для WebElement
#8
Отправлено 29 ноября 2011 - 08:34
Я именно об этом прошу -- покажите, где имплицитные ожидания не работают!
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#9
Отправлено 01 декабря 2011 - 07:47
Алексей, вот пример . Thread.sleep(2000); - без этой задержки не работает . Скорее всего из-за переключений с фреймами фича driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS) не работает.Есть ли смысл выстраивать костыли, если можно поправить баг в инструменте. Если он есть, конечно :)
Я именно об этом прошу -- покажите, где имплицитные ожидания не работают!
package test; import org.testng.Assert; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class CopyOfTestBase { private WebDriver driver; private StringBuffer verificationErrors = new StringBuffer(); @BeforeTest public void setUp() throws Exception { driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } @Test public void testUntitled() throws Exception { driver.get("http://docs.pravo.ru/"); driver.findElement(By.linkText("Войти в систему")).click(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); //Thread.sleep(2000); - без этой задержки не работает driver.switchTo().frame(1); driver.findElement(By.id("email")); driver.findElement(By.id("email")).clear(); driver.findElement(By.id("email")).sendKeys("test"); } @AfterTest public void tearDown() throws Exception { driver.quit(); String verificationErrorString = verificationErrors.toString(); if (!"".equals(verificationErrorString)) { Assert.fail(verificationErrorString); } } }
#10
Отправлено 01 декабря 2011 - 09:10
Это неправильный пример :)Алексей, вот пример . Thread.sleep(2000); - без этой задержки не работает . Скорее всего из-за переключений с фреймами фича driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS) не работает.
Есть ли смысл выстраивать костыли, если можно поправить баг в инструменте. Если он есть, конечно :)
Я именно об этом прошу -- покажите, где имплицитные ожидания не работают!
Было заявлено, что имплицитные ожидания не работают в сочетании с PageObject, я именно это просил продемонстрировать.
А здесь не работает именно переключение во фрейм.
Потому что сейчас имплицитные ожидания реализованы только для элементов страницы.
Фреймы, окна, алёрты -- для них пока нет имплицитных ожиданий.
Поэтому приведённый пример, действительно, требует явного ожидания.
Пока требует :)
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#11
Отправлено 27 декабря 2011 - 14:01
Добрый день.
Что посоветуете , есть авто-тест вызывающий страницу сайта с разными элементами ( линки, поп-ап диалоги, фреймы ) , также страница имеет AJAX- запросы, т.е грузится может долго.Как сделать, чтобы тест ждал пока загрузятся нужные элементы( т.е страница полностью) и уже потом проверял дальше, а не давал ошибку. Вариант со Thread.sleep()после каждого запроса не устраивает. Заранее спасибо за помощь.
Добрый день,
Я не могу похвастаться большим опытом в разработки автоматических тестов, но с вашей проблемой уже успел столкнуться.
И, как мне кажется, успел найти приемлемое для нее решение:
Я использую WebDriver вместе с Selenium RC. И с помощью Selenium RC написал свои методы waitForPageToLoad(String[] locator), click(), type(), где ключевым моментом является команда Selenium RC waitForCondition(String script, String timeOut).
код для ожидания загрузки страницы выглядит примерно так:
public void waitForPageToLoad(String[] elementsLocator) throws InterruptedException{
for(int i = 0; i < elementsLocator.length; i++){
selenium.waitForCondition("selenium.isElementPresent(elementsLocator[i], "60000");
}
}
,где
elementsLocator[], как вы догадались - локаторы элементов, которые вы желаете дождаться, перед продолжением исполнения инструкций
selenium - это екземпляр класса DefaultSelenium, порожденный из WebDriver (на всякий случай, укажу как порожденный - FirefoxDriver ff1 = new FirefoxDriver(profile); DefaultSelenium selenium = new WebDriverBackedSelenium(ff1, "http://www.facebook.com/");)
Аналогично методы click() и type(), написаны так, чтобы их выполнение начиналось после того, как нужный элемент появился.
Удачи!
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных