Selenium, а давай подождем?
Transcript of Selenium, а давай подождем?
Software quality assurance days18 Международная конференция по вопросам качества ПО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));
Удаление элемента из DOMwait.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>() {
@Overridepublic Boolean apply(WebDriver
webDriver) {return
webDriver.findElement(by).isDisplayed();}
};}
14
static Predicate<WebElement> isElementDisplay() {return new Predicate<WebElement>() {
@Overridepublic 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