Типичные ошибки начинающих писать тесты на WebDriver

31
Типичные ошибки начинающих писать тесты на WebDriver Игорь Хрол

description

My speech on SeleniumCamp'2013

Transcript of Типичные ошибки начинающих писать тесты на WebDriver

Page 1: Типичные ошибки начинающих писать тесты на WebDriver

Типичные ошибки начинающих писать тесты на WebDriver

Игорь Хрол

Page 2: Типичные ошибки начинающих писать тесты на WebDriver

О себе

• Игорь Хрол• Более шести лет в

автоматизации тестирования• Тренер, консультант, инженер,

менеджер, архитектор• Selenium, HP QTP, TestCompete,

Jmeter• Докладчик на

SeleniumCamp’2011 и 2012

Page 3: Типичные ошибки начинающих писать тесты на WebDriver

О чём будем говорить?

Мы все когда-то начинали– Подводные камни Selenium’a– Ошибки в программировании

Основано на личном мироощущении

Page 4: Типичные ошибки начинающих писать тесты на WebDriver

Selenium 2.0 (WebDriver) API

• Selenium – это библиотека для работы с браузером

• Требуются знания и усердие, чтобы сделать из неё автоматические тесты

Page 5: Типичные ошибки начинающих писать тесты на WebDriver

Проверки

Только текстовый вывод и ничего больше…

//Some actionsif (isElementPresent(By.id("identifier"))) {

log("PASS: Element was on the page");} else {

log("FAIL: Element wasn't shown");}//Some other actions

Page 6: Типичные ошибки начинающих писать тесты на WebDriver

Проверки

Использование готового решения

@Testpublic void testImportantFeature() {

//Some actionsAssert.assertTrue(isElementPresent(By.id("identifier")),

"Element wasn't shown");log("PASS: Element was on the page");//Some other actions

}

Page 7: Типичные ошибки начинающих писать тесты на WebDriver

isElementPresent

• NoSuchElementException вместо false, если элемента нет на странице

• Возвращает false, если элемент есть на странице, но невидимый

public boolean isElementPresent(By locator) { return driver.findElement(locator).isDisplayed();}

Page 8: Типичные ошибки начинающих писать тесты на WebDriver

isElementPresent

Если возвращает false, то «подвисает» на таймаут, указанный в implicitlyWait

public boolean isElementPresent(By locator) { try { driver.findElement(locator); return true; } catch(NoSuchElementException e) { return false; }}

Page 9: Типичные ошибки начинающих писать тесты на WebDriver

isElementPresent

Ненужная исключительная ситуация

public boolean isElementPresent(By locator) {try {

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

driver.findElement(locator);return true;

} catch(NoSuchElementException e) {return false;

} finally {driver.manage().timeouts().

implicitlyWait(30, TimeUnit.SECONDS);}

}

Page 10: Типичные ошибки начинающих писать тесты на WebDriver

isElementPresent

Ну и если совсем-совсем хочется…

public boolean isElementPresent(By locator) {driver.manage().timeouts().

implicitlyWait(0, TimeUnit.SECONDS);boolean result = driver.

findElements(locator).size() > 0;driver.manage().timeouts().

implicitlyWait(30, TimeUnit.SECONDS);return result;

}

Page 11: Типичные ошибки начинающих писать тесты на WebDriver

isElementPresentpublic boolean isElementPresent(By locator) {

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

List<WebElement> list = driver.findElements(locator);driver.manage().timeouts().

implicitlyWait(30, TimeUnit.SECONDS);if (list.size() == 0) {

return false;} else {

return list.get(0).isDisplayed();}

}

Page 12: Типичные ошибки начинающих писать тесты на WebDriver

WebDriver API не возвращает Null

Ничего не проверяет…

WebElement element = driver.findElement(By.id("identifier"));

Assert.assertNotNull(element, "Element wasn't found");

Alert alert = driver.switchTo().alert();Assert.assertNotNull(alert, "Alert wasn't found");

Page 13: Типичные ошибки начинающих писать тесты на WebDriver

try-catch где попало

• Получаете NullPointerException вместо NoSuchElementException

• Исключительные ситуации используются для «падения» тестов

public WebElement getElement(By locator) {try {

return driver.findElement(locator);} catch (NoSuchElementException e) {

return null;}

}

Page 14: Типичные ошибки начинающих писать тесты на WebDriver

Сгеренированный XPath

• Используйте «характерные» свойства элементов:

//table[@id=‘dataTable’]• Выучите XPath

/html/body/div[4]/div/div/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr/td[2]/div/a

Page 15: Типичные ошибки начинающих писать тесты на WebDriver

Хорошо:• //a[text()=‘Link’]• //div[@id=‘container’]• //table[@name=‘named’]

Плохо:• //a[@text=‘Link’]• //a[@text()=‘Link’]

XPath: text() – это функция

Page 16: Типичные ошибки начинающих писать тесты на WebDriver

"sleep" для синхронизации

• Не решает проблем синхронизации• Сильно увеличивает время выполнения

тестов

Page 17: Типичные ошибки начинающих писать тесты на WebDriver

Включайте его, он хороший

• Если вы вызываете метод findElement, скорее всего вы хотите его найти

• Если не можем найти, то лучше немного подождать

implicitlyWaitdriver.manage().timeouts().

implicitlyWait(30, TimeUnit.SECONDS);

Page 18: Типичные ошибки начинающих писать тесты на WebDriver

Лишняя логика в скриптах

• Тест-скрипты линейные по своей природе• Чем больше логики в скриптах, тем

больше шанс допустить ошибку

public void click(By locator) {if (isElementPresent(locator)) {

driver.findElement(locator).click();}

}

Page 19: Типичные ошибки начинающих писать тесты на WebDriver

Собственные циклы для синхронизации

public void waitForSomething() {int timeout = 30000;long start = System.currentTimeMillis();while (System.currentTimeMillis() - start < timeout) {

if (isSomething()) {return;

} else {try {

Thread.sleep(1000);} catch (InterruptedException e1) {}

};}Assert.assertFalse(true,

"Timeout is over waiting for something");}

Page 20: Типичные ошибки начинающих писать тесты на WebDriver

Собственные циклы для синхронизации

public void waitForSomething() {WebDriverWait waiter =

new WebDriverWait(driver, 30, 1000);waiter.until(new Predicate<WebDriver>() {

public boolean apply(WebDriver input) {return isSomething(input);

}});

}

Page 21: Типичные ошибки начинающих писать тесты на WebDriver

XPath vs CSS

“CSS работает быстрее XPath”

• Было актуально только для Selenium RC и Internet Explorer

• Уже неактуально

Page 22: Типичные ошибки начинающих писать тесты на WebDriver

Сравнение скорости на Internet Explorer 9.0 + Selenium 2.29.0

XPath CSS

//*[@id='g-search-input'] #g-search-input

56 45

//form[@id='globalSearch']//input form#globalSearch input

40 30

//header[@class='g-top']//form[@id='globalSearch']//input

header.g-top form#globalSearch input

40 20

Время в миллисекундах

• Да, CSS быстрее• Но оба метода работают приемлемо быстро

Page 23: Типичные ошибки начинающих писать тесты на WebDriver

Ошибки в программированииАвтоматизация тестирования – это программирование и разработка

программного обеспечения

Page 24: Типичные ошибки начинающих писать тесты на WebDriver

Лучше начать с изучения языка

Page 25: Типичные ошибки начинающих писать тесты на WebDriver

Названия переменных и методов

• Подумайте о ваших последователях• IDE позволяют эффективно

переименовывать

int spanNumber =driver.findElements(By.tagName("div")).size();

System.out.println("Number of div: " + spanNumber);

public int multiply(int x, int y) {return x / y;

}

Page 26: Типичные ошибки начинающих писать тесты на WebDriver

Закомментированный код

Система контроля версий хранит все ваши изменения!/*public boolean isElementPresent(By locator) {

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);boolean result = driver.findElements(locator).size() > 0;driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);return result;

} */

public boolean isElementPresent(By locator) {driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);List<WebElement> list = driver.findElements(locator);driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);if (list.size() > 0) {

return true;} else {

return list.get(0).isDisplayed();}

}

Page 27: Типичные ошибки начинающих писать тесты на WebDriver

Непонятные комментарии

Пишите так, чтобы вы сами могли понять написанное через несколько месяцев

private boolean someMethod() {// Errorreturn false;

}

Page 28: Типичные ошибки начинающих писать тесты на WebDriver

Используйте конвенции языка, на котором пишете

• Java:– Классы с большой буквы– Методы с маленькой буквы– Объекты и переменные с маленькой буквы– Camel-нотация

• С#– Классы с большой буквы– Методы с большой буквы– Объекты и переменные с маленькой буквы– Camel-нотация

Page 29: Типичные ошибки начинающих писать тесты на WebDriver

warning

Держите код в «чистом» состоянии

Page 30: Типичные ошибки начинающих писать тесты на WebDriver

Итого

Делать ошибки – это часть развития!Давайте учиться программировать

качественно!

Page 31: Типичные ошибки начинающих писать тесты на WebDriver

Спасибо за внимание!

Игорь Хрол• E-mail: [email protected] • Skype: igor.khrol • LinkedIn: http://www.linkedin.com/in/khroliz • Блог: http://ru.khroliz.com • Facebook: https://www.facebook.com/khroliz