От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
Selenium, а давай подождем?
1. Software quality assurance days
18 Международная конференция
по вопросам качества ПО
sqadays.com
Москва. 27–28 ноября 2015
Матвеев Сергей
ЗАО «КИВИ». Москва, Россия
Selenium, а давай подождем?
2. Selenium, а давай подождем?
О себе
В тестировании более 3 лет
Занимаюсь front-end и back-end
тестами, а так же нагрузочным
тестированием
Люблю организовывать
процессы и вдохновлять людей
2
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();
}
};
}
16. Selenium, а давай подождем?
Alert
wait().until(ExpectedConditions.alertIsPresent());
Команда driver.switchTo().alert(); в FF будет ждать 2 секунды, если alert нет.
Любое действие может закончиться с UnhandledAlertException
16
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
Виды стратегий:
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