Вопрос по 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 анонимных

