SlideShare a Scribd company logo
Software quality assurance days
18 Международная конференция
по вопросам качества ПО
sqadays.com
Москва. 27–28 ноября 2015
Матвеев Сергей
ЗАО «КИВИ». Москва, Россия
Selenium, а давай подождем?
Selenium, а давай подождем?
О себе
В тестировании более 3 лет
Занимаюсь front-end и back-end
тестами, а так же нагрузочным
тестированием
Люблю организовывать
процессы и вдохновлять людей
2
Selenium, а давай подождем?
Selenium, а давай подождем?
3
Selenium, а давай подождем?
Схема простейшего теста
Подождем
элемент
Взаимодействие
с элементом
Подождем
результат
Проверим
результат
4
Selenium, а давай подождем?
Простейшее ожидание
public void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void sleep(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Продвинутые методики:
5
Selenium, а давай подождем?
Почему это плохо?
1. Тесты не стали стабильнее
2. Увеличение времени на
поддержку
3. Увеличение времени
прохождения тестового
набора
4. «Временное решение»
станет вечным
5. Увеличение кода тестовых
методов
6
Selenium, а давай подождем?
«Временное решение» станет вечным
form.typeValue(value);
page.waitSecond();
Assert.assertTrue(form.dataOnlineIsVisible());
Следующий commit:
form.typeValue(value);
page.waitSecond();
page.waitSecond();
page.waitSecond();
page.waitSecond();
Assert.assertTrue(form.dataOnlineIsVisible());
7
Selenium, а давай подождем?
Увеличение кода тестовых методов
link = “Боевики"
leftMenu.choose(link);
assertTrue(!content.isEmpty);
Так?
link = «Боевики"
leftMenu.choose(link);
sleep();
assertTrue(!content.isEmpty);
… или так?
public void choose(String link) {
driver.findElement(By.linkText(link)).click();
sleep();
}
8
Selenium, а давай подождем?
Состояния элемента
Не найден
Есть, видимый, нельзя
взаимодействовать
Есть, но невидимый
Есть, видимый, можно
взаимодействовать
Был, но удален из DOM
«Алексей Баранцев. Все секреты и тайны Selenium 2.0»
9
Selenium, а давай подождем?
Имплицитные ожидания (неявные)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
element = driver.findElement(By.id("sub"));
Когда они не работают:
1. Надо просто проверить наличие элемента
2. Нужно найти один элемент из двух
3. Подождать пока элемент исчезнет
10
Selenium, а давай подождем?
Эксплицитные ожидания (явные)
Супер связка WebDriverWait + ExpectedCondition
new WebDriverWait(driver, 30).until(visibilityOfAllElementsLocatedBy(By.id("subb")));
11
Selenium, а давай подождем?
Что можно подождать?
Класс ExpectedConditions:
Смена заголовка страницы
wait.until(titles(«Заголовок");
Появление элемента
wait.until(presenceOfAllElementsLocatedBy(locator));
Видимость элемента
wait.until(visibilityOfElementLocated(locator));
Удаление элемента из DOM
wait.until(stalenessOf(element));
Невидимость элемента
wait.until(invisibilityOfElementLocated(locator));
12
Selenium, а давай подождем?
Тонкая настройка
public class WebDriverWait extends FluentWait<WebDriver>
new WebDriverWait()
.withMessage(“Не дождались :-(”)
.pollingEvery(200, TimeUnit.MILLISECONDS)
.withTimeout(10,TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class)
13
Selenium, а давай подождем?
Собственные условия ожидания
static ExpectedCondition<Boolean> display(final By by) {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver webDriver) {
return webDriver.findElement(by).isDisplayed();
}
};
}
14
static Predicate<WebElement> isElementDisplay() {
return new Predicate<WebElement>() {
@Override
public boolean apply(WebElement element) {
return element.isDisplayed();
}
};
}
Selenium, а давай подождем?
Прочие ожидания
• Frame
• Window
• Alert
• Загрузка страницы
15
Selenium, а давай подождем?
Alert
wait().until(ExpectedConditions.alertIsPresent());
Команда driver.switchTo().alert(); в FF будет ждать 2 секунды, если alert нет.
Любое действие может закончиться с UnhandledAlertException
16
Selenium, а давай подождем?
Окна
17
Selenium, а давай подождем?
Ожидание окна с html контентом
ExpectedCondition<String> windowWithCorrectH1(final String h1) {
return new ExpectedCondition<String>() {
@Override
public String apply(WebDriver driver) {
String mainWindow = driver.getWindowHandle();
String foundWindow = null;
Set<String> otherWindows = driver.getWindowHandles();
for(String window : otherWindows) {
try {
driver.switchTo().window(window);
if(driver.findElement(By.tagName("h1")).getText().equals(h1)) {
foundWindow = window;
break;
}
} catch (WebDriverException e) {
}
}
driver.switchTo().window(mainWindow);
return foundWindow;
}
};
}
18
Selenium, а давай подождем?
Ожидание появления любого нового окна
ExpectedCondition<String> newWindow(final Set<String> currentWindows) {
return new ExpectedCondition<String>() {
@Override
public String apply(WebDriver driver) {
Set<String> newWindows = driver.getWindowHandles();
newWindows.removeAll(currentWindows);
if (newWindows.size() > 0) {
return (String)newWindows.toArray()[0];
} else {
return null;
}
}
};
}
...
Set<String> windows = driver.getWindowHandles();
click();
new WebDriverWait(driver,10).until(newWindow(windows));
...
19
Selenium, а давай подождем?
Ожидание загрузки страницы
Selenium использует свойство document.readyState для определения момента
окончания загрузки страницы.
20
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(CapabilityType.PAGE_LOAD_STRATEGY,"eager");
• normal
• eager
• none
Виды стратегий:
Selenium, а давай подождем?
Как все это использовать?
21
Selenium, а давай подождем?
Как все это использовать?
driver.findElement(search).sendKeys("mts");
clickEnter();
Assert.assertTrue(isProvidersPresent());
driver.findElement(search).sendKeys("банки");
clickEnter();
Assert.assertTrue(isProvidersPresent());
22
Selenium, а давай подождем?
Как все это использовать?
driver.findElement(search).sendKeys("mts");
clickEnter();
Assert.assertTrue(isProvidersPresent());
driver.findElement(search).sendKeys("банки");
clickEnter();
Assert.assertTrue(isProvidersPresent());
if(isProvidersPresent()) {
wait.until(ExpectedConditions.stalenessOf(driver.findElement(By.cssSelector(provider)));
}
23
Selenium, а давай подождем?
Как все это использовать?
driver.findElement(search).sendKeys("mts");
clickEnter();
Assert.assertTrue(isProvidersPresent());
driver.findElement(search).sendKeys("банки");
clickEnter();
Assert.assertTrue(isProvidersPresent());
WebElement provider = driver.findElement(By.cssSelector(provider));
wait.until(ExpectedConditions.stalenessOf(provider));
24
Selenium, а давай подождем?
Как все это использовать?
Тест не дождался нового провайдера
25
Selenium, а давай подождем?
Как все это использовать?
driver.findElement(search).sendKeys("mts");
clickEnter();
Assert.assertTrue(isProvidersPresent());
WebElement provider = driver.findElement(By.cssSelector(provider));
driver.findElement(search).sendKeys("банки");
clickEnter();
wait.until(ExpectedConditions.stalenessOf(provider));
Assert.assertTrue(isProvidersPresent());
wait.until(visibilityOfAllElementsLocatedBy(providerLocator));
wait.until(visibilityOfAllElementsLocatedBy(providerLocator));
26
Selenium, а давай подождем?
Зачем все это нужно?
27
Selenium, а давай подождем?
Убрал все sleep();
28

More Related Content

PPTX
Selenium vs AJAX
PPTX
Оценка качества автотестов
PPT
Alexander manuhin selenium_php_v2.0
PPTX
XPath локаторы в Selenium WebDriver
PPTX
Типичные ошибки начинающих писать тесты на WebDriver
PPTX
Автоматизация и Selenium IDE
PPTX
Selenium: начало работы
PDF
Автоматизация UI тестирования под Windows и Windows Phone
Selenium vs AJAX
Оценка качества автотестов
Alexander manuhin selenium_php_v2.0
XPath локаторы в Selenium WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Автоматизация и Selenium IDE
Selenium: начало работы
Автоматизация UI тестирования под Windows и Windows Phone

What's hot (19)

PPTX
автоматизация тестирования с помощью Selenium
PPTX
Automation testing desktop applications
PDF
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
PPT
Опыт тестирования API САПР платформы
PPT
Selenium 2.0: обзор новых возможностей
PDF
QA Fest 2017. Яна Кокряшкина. Интеграция автоматизированных тестов с инструме...
PDF
BDD girls Battle: Cucumber VS. JBehave
PPTX
Selenium: приемы работы
PDF
Автоматизация функционального тестирования REST API
PPTX
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
PPTX
автоматизация тестирования с помощью Selenium
PPTX
Человекопонятные отчёты
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
PPTX
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
ODP
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
PDF
Реактивный двигатель вашего Android приложения
PDF
Контроль качества верстки или как начать делать Makeup
PPTX
Автоматизация тестирования многопоточности
автоматизация тестирования с помощью Selenium
Automation testing desktop applications
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Опыт тестирования API САПР платформы
Selenium 2.0: обзор новых возможностей
QA Fest 2017. Яна Кокряшкина. Интеграция автоматизированных тестов с инструме...
BDD girls Battle: Cucumber VS. JBehave
Selenium: приемы работы
Автоматизация функционального тестирования REST API
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
автоматизация тестирования с помощью Selenium
Человекопонятные отчёты
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Реактивный двигатель вашего Android приложения
Контроль качества верстки или как начать делать Makeup
Автоматизация тестирования многопоточности
Ad

Viewers also liked (15)

PPTX
Непрерывная интеграция и автотесты. Сравнительный анализ инструментов
PPT
Тестирование инсталляторов
PPTX
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
PDF
Подводная часть айсберга: что делать, чтобы автотесты не превратились в Титаник
PPTX
Автоматизируем тестирование UI с Ruby, Cucumber и Selenium
PPT
Что ждет тестировщиков при организации процесса тестирования Enterprise-проду...
PDF
Как «сварить» Pairwise и не пуститься во все тяжкие
PPTX
Нагрузочное тестирование. С чего начать?
PPTX
Автоматизация тестирования: доступна каждому или удел избранных?
PPTX
Автоматизация тестирования ролей и привилегий
PDF
Успешный тестировщик. Путь профессионала
PDF
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
PPTX
Нагрузочное тестирование JMeter Кожухов
PDF
Оценки тестирования - полезные и условные метрики
PDF
Death By PowerPoint Rus
Непрерывная интеграция и автотесты. Сравнительный анализ инструментов
Тестирование инсталляторов
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Подводная часть айсберга: что делать, чтобы автотесты не превратились в Титаник
Автоматизируем тестирование UI с Ruby, Cucumber и Selenium
Что ждет тестировщиков при организации процесса тестирования Enterprise-проду...
Как «сварить» Pairwise и не пуститься во все тяжкие
Нагрузочное тестирование. С чего начать?
Автоматизация тестирования: доступна каждому или удел избранных?
Автоматизация тестирования ролей и привилегий
Успешный тестировщик. Путь профессионала
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Нагрузочное тестирование JMeter Кожухов
Оценки тестирования - полезные и условные метрики
Death By PowerPoint Rus
Ad

Similar to Selenium, а давай подождем? (11)

KEY
Testing RIA with Selenium
PDF
Плюсы и минусы автоматизации, пример из жизни
ODP
Selenium на практике и подводные камни
PPT
Оптимизация Selenium тестов и ускорение их поддержки
PPT
Test framework grid_ant_testng
PPTX
А вы знаете что тестируют ваши тесты?
PPTX
Do you know what you are testing?
PPT
Functional Testing with Selenium
PPTX
Тестирование отклика Web-интерфейса с JMeter и Selenium
PPT
Selenium Begins
PPT
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
Testing RIA with Selenium
Плюсы и минусы автоматизации, пример из жизни
Selenium на практике и подводные камни
Оптимизация Selenium тестов и ускорение их поддержки
Test framework grid_ant_testng
А вы знаете что тестируют ваши тесты?
Do you know what you are testing?
Functional Testing with Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
Selenium Begins
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине

More from SQALab (20)

PDF
Готовим стажировку
PPTX
Куда приводят мечты? или Искусство развития тестировщика
PPT
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
PPTX
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
PPTX
Continuous performance testing
PDF
Конфиги вместо костылей. Pytestconfig и зачем он нужен
PPT
Команда чемпионов в ИТ стихии
PPTX
API. Серебряная пуля в магазине советов
PPTX
Добиваемся эффективности каждого из 9000+ UI-тестов
PPT
Делаем автоматизацию проектных KPIs
PDF
Вредные привычки в тест-менеджменте
PPTX
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
PPT
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
PPTX
Стили лидерства и тестирование
PPT
"Давайте не будем про качество"
PDF
Apache.JMeter для .NET-проектов
PPTX
Тестирование геолокационных систем
PPTX
Лидер или босс? Вот в чем вопрос
PPTX
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
PPTX
Истинная сила тестировщика - информация
Готовим стажировку
Куда приводят мечты? или Искусство развития тестировщика
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Continuous performance testing
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Команда чемпионов в ИТ стихии
API. Серебряная пуля в магазине советов
Добиваемся эффективности каждого из 9000+ UI-тестов
Делаем автоматизацию проектных KPIs
Вредные привычки в тест-менеджменте
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Стили лидерства и тестирование
"Давайте не будем про качество"
Apache.JMeter для .NET-проектов
Тестирование геолокационных систем
Лидер или босс? Вот в чем вопрос
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
Истинная сила тестировщика - информация

Selenium, а давай подождем?

  • 1. Software quality assurance days 18 Международная конференция по вопросам качества ПО sqadays.com Москва. 27–28 ноября 2015 Матвеев Сергей ЗАО «КИВИ». Москва, Россия Selenium, а давай подождем?
  • 2. Selenium, а давай подождем? О себе В тестировании более 3 лет Занимаюсь front-end и back-end тестами, а так же нагрузочным тестированием Люблю организовывать процессы и вдохновлять людей 2
  • 3. Selenium, а давай подождем? Selenium, а давай подождем? 3
  • 4. Selenium, а давай подождем? Схема простейшего теста Подождем элемент Взаимодействие с элементом Подождем результат Проверим результат 4
  • 5. Selenium, а давай подождем? Простейшее ожидание public void sleep() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } public void sleep(long time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } Продвинутые методики: 5
  • 6. Selenium, а давай подождем? Почему это плохо? 1. Тесты не стали стабильнее 2. Увеличение времени на поддержку 3. Увеличение времени прохождения тестового набора 4. «Временное решение» станет вечным 5. Увеличение кода тестовых методов 6
  • 7. Selenium, а давай подождем? «Временное решение» станет вечным form.typeValue(value); page.waitSecond(); Assert.assertTrue(form.dataOnlineIsVisible()); Следующий commit: form.typeValue(value); page.waitSecond(); page.waitSecond(); page.waitSecond(); page.waitSecond(); Assert.assertTrue(form.dataOnlineIsVisible()); 7
  • 8. Selenium, а давай подождем? Увеличение кода тестовых методов link = “Боевики" leftMenu.choose(link); assertTrue(!content.isEmpty); Так? link = «Боевики" leftMenu.choose(link); sleep(); assertTrue(!content.isEmpty); … или так? public void choose(String link) { driver.findElement(By.linkText(link)).click(); sleep(); } 8
  • 9. Selenium, а давай подождем? Состояния элемента Не найден Есть, видимый, нельзя взаимодействовать Есть, но невидимый Есть, видимый, можно взаимодействовать Был, но удален из DOM «Алексей Баранцев. Все секреты и тайны Selenium 2.0» 9
  • 10. Selenium, а давай подождем? Имплицитные ожидания (неявные) driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); element = driver.findElement(By.id("sub")); Когда они не работают: 1. Надо просто проверить наличие элемента 2. Нужно найти один элемент из двух 3. Подождать пока элемент исчезнет 10
  • 11. Selenium, а давай подождем? Эксплицитные ожидания (явные) Супер связка WebDriverWait + ExpectedCondition new WebDriverWait(driver, 30).until(visibilityOfAllElementsLocatedBy(By.id("subb"))); 11
  • 12. Selenium, а давай подождем? Что можно подождать? Класс ExpectedConditions: Смена заголовка страницы wait.until(titles(«Заголовок"); Появление элемента wait.until(presenceOfAllElementsLocatedBy(locator)); Видимость элемента wait.until(visibilityOfElementLocated(locator)); Удаление элемента из DOM wait.until(stalenessOf(element)); Невидимость элемента wait.until(invisibilityOfElementLocated(locator)); 12
  • 13. Selenium, а давай подождем? Тонкая настройка public class WebDriverWait extends FluentWait<WebDriver> new WebDriverWait() .withMessage(“Не дождались :-(”) .pollingEvery(200, TimeUnit.MILLISECONDS) .withTimeout(10,TimeUnit.SECONDS) .ignoring(NoSuchElementException.class) 13
  • 14. Selenium, а давай подождем? Собственные условия ожидания static ExpectedCondition<Boolean> display(final By by) { return new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver webDriver) { return webDriver.findElement(by).isDisplayed(); } }; } 14 static Predicate<WebElement> isElementDisplay() { return new Predicate<WebElement>() { @Override public boolean apply(WebElement element) { return element.isDisplayed(); } }; }
  • 15. Selenium, а давай подождем? Прочие ожидания • Frame • Window • Alert • Загрузка страницы 15
  • 16. Selenium, а давай подождем? Alert wait().until(ExpectedConditions.alertIsPresent()); Команда driver.switchTo().alert(); в FF будет ждать 2 секунды, если alert нет. Любое действие может закончиться с UnhandledAlertException 16
  • 17. Selenium, а давай подождем? Окна 17
  • 18. Selenium, а давай подождем? Ожидание окна с html контентом ExpectedCondition<String> windowWithCorrectH1(final String h1) { return new ExpectedCondition<String>() { @Override public String apply(WebDriver driver) { String mainWindow = driver.getWindowHandle(); String foundWindow = null; Set<String> otherWindows = driver.getWindowHandles(); for(String window : otherWindows) { try { driver.switchTo().window(window); if(driver.findElement(By.tagName("h1")).getText().equals(h1)) { foundWindow = window; break; } } catch (WebDriverException e) { } } driver.switchTo().window(mainWindow); return foundWindow; } }; } 18
  • 19. Selenium, а давай подождем? Ожидание появления любого нового окна ExpectedCondition<String> newWindow(final Set<String> currentWindows) { return new ExpectedCondition<String>() { @Override public String apply(WebDriver driver) { Set<String> newWindows = driver.getWindowHandles(); newWindows.removeAll(currentWindows); if (newWindows.size() > 0) { return (String)newWindows.toArray()[0]; } else { return null; } } }; } ... Set<String> windows = driver.getWindowHandles(); click(); new WebDriverWait(driver,10).until(newWindow(windows)); ... 19
  • 20. Selenium, а давай подождем? Ожидание загрузки страницы Selenium использует свойство document.readyState для определения момента окончания загрузки страницы. 20 DesiredCapabilities cap = new DesiredCapabilities(); cap.setCapability(CapabilityType.PAGE_LOAD_STRATEGY,"eager"); • normal • eager • none Виды стратегий:
  • 21. Selenium, а давай подождем? Как все это использовать? 21
  • 22. Selenium, а давай подождем? Как все это использовать? driver.findElement(search).sendKeys("mts"); clickEnter(); Assert.assertTrue(isProvidersPresent()); driver.findElement(search).sendKeys("банки"); clickEnter(); Assert.assertTrue(isProvidersPresent()); 22
  • 23. Selenium, а давай подождем? Как все это использовать? driver.findElement(search).sendKeys("mts"); clickEnter(); Assert.assertTrue(isProvidersPresent()); driver.findElement(search).sendKeys("банки"); clickEnter(); Assert.assertTrue(isProvidersPresent()); if(isProvidersPresent()) { wait.until(ExpectedConditions.stalenessOf(driver.findElement(By.cssSelector(provider))); } 23
  • 24. Selenium, а давай подождем? Как все это использовать? driver.findElement(search).sendKeys("mts"); clickEnter(); Assert.assertTrue(isProvidersPresent()); driver.findElement(search).sendKeys("банки"); clickEnter(); Assert.assertTrue(isProvidersPresent()); WebElement provider = driver.findElement(By.cssSelector(provider)); wait.until(ExpectedConditions.stalenessOf(provider)); 24
  • 25. Selenium, а давай подождем? Как все это использовать? Тест не дождался нового провайдера 25
  • 26. Selenium, а давай подождем? Как все это использовать? driver.findElement(search).sendKeys("mts"); clickEnter(); Assert.assertTrue(isProvidersPresent()); WebElement provider = driver.findElement(By.cssSelector(provider)); driver.findElement(search).sendKeys("банки"); clickEnter(); wait.until(ExpectedConditions.stalenessOf(provider)); Assert.assertTrue(isProvidersPresent()); wait.until(visibilityOfAllElementsLocatedBy(providerLocator)); wait.until(visibilityOfAllElementsLocatedBy(providerLocator)); 26
  • 27. Selenium, а давай подождем? Зачем все это нужно? 27
  • 28. Selenium, а давай подождем? Убрал все sleep(); 28