Перейти к содержимому

Фотография

Вопрос по WebDriver (Selenium) к гуру


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 el_matador

el_matador

    Новый участник

  • Members
  • Pip
  • 6 сообщений
  • ФИО:qa


Отправлено 25 ноября 2011 - 14:42

Добрый день.
Что посоветуете , есть авто-тест вызывающий страницу сайта с разными элементами ( линки, поп-ап диалоги, фреймы ) , также страница имеет AJAX- запросы, т.е грузится может долго.Как сделать, чтобы тест ждал пока загрузятся нужные элементы( т.е страница полностью) и уже потом проверял дальше, а не давал ошибку. Вариант со Thread.sleep()после каждого запроса не устраивает. Заранее спасибо за помощь.
  • 0

#2 Wolonter

Wolonter

    Постоянный участник

  • Members
  • PipPipPip
  • 205 сообщений
  • ФИО:Макс
  • Город:Екатеринбург


Отправлено 25 ноября 2011 - 15:41

Попросить программистов выводить на каждой странице счетчик активных сессий.
Написать метод ожидания появления элементов.
  • 0

#3 soleksenko2702

soleksenko2702

    Постоянный участник

  • Members
  • PipPipPip
  • 193 сообщений
  • ФИО:Олексенко Сергей

Отправлено 25 ноября 2011 - 19:03

Добрый день.
Что посоветуете , есть авто-тест вызывающий страницу сайта с разными элементами ( линки, поп-ап диалоги, фреймы ) , также страница имеет AJAX- запросы, т.е грузится может долго.Как сделать, чтобы тест ждал пока загрузятся нужные элементы( т.е страница полностью) и уже потом проверял дальше, а не давал ошибку. Вариант со Thread.sleep()после каждого запроса не устраивает. Заранее спасибо за помощь.


Попробуйте это http://stackoverflow...-nameusername-s
  • 0

#4 Wolonter

Wolonter

    Постоянный участник

  • Members
  • PipPipPip
  • 205 сообщений
  • ФИО:Макс
  • Город:Екатеринбург


Отправлено 25 ноября 2011 - 19:26

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

#5 el_matador

el_matador

    Новый участник

  • Members
  • Pip
  • 6 сообщений
  • ФИО:qa


Отправлено 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();

}
}
  • 0

#6 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 29 ноября 2011 - 07:34

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - это очень хорошо. Вот только у нас тесты реализованы по структре PageObject ,
т.е отдельный класс для описания страниц сайта и потом уже отдельные классы для тестов. в это случае эта фича не хочет работать , или может кто знает как ее настроить?

Конкретный пример можете привести -- где не работает?
Не очень в это верится, потому что PageObject внутри использует те же самые методы findElement и findElements.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#7 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 29 ноября 2011 - 08:05

у меня также driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS) не работает в версиях 2.8 и 2.10. По-моему есть даже такой дефект в jira.

Применял такое решение (хотя оно очень напряжное):


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
  • 0

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 29 ноября 2011 - 08:34

Есть ли смысл выстраивать костыли, если можно поправить баг в инструменте. Если он есть, конечно :)
Я именно об этом прошу -- покажите, где имплицитные ожидания не работают!
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#9 el_matador

el_matador

    Новый участник

  • Members
  • Pip
  • 6 сообщений
  • ФИО:qa


Отправлено 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);
        }
    }


}

  • 0

#10 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 01 декабря 2011 - 09:10


Есть ли смысл выстраивать костыли, если можно поправить баг в инструменте. Если он есть, конечно :)
Я именно об этом прошу -- покажите, где имплицитные ожидания не работают!

Алексей, вот пример . Thread.sleep(2000); - без этой задержки не работает . Скорее всего из-за переключений с фреймами фича driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS) не работает.

Это неправильный пример :)
Было заявлено, что имплицитные ожидания не работают в сочетании с PageObject, я именно это просил продемонстрировать.
А здесь не работает именно переключение во фрейм.
Потому что сейчас имплицитные ожидания реализованы только для элементов страницы.
Фреймы, окна, алёрты -- для них пока нет имплицитных ожиданий.
Поэтому приведённый пример, действительно, требует явного ожидания.
Пока требует :)
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#11 DmR

DmR

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Россоховатский Дмитрий

Отправлено 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(), написаны так, чтобы их выполнение начиналось после того, как нужный элемент появился.

Удачи!
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных