Обязательные проверки страниц

Требования к созданию авто-тестов для экспресс-тестирования

 

Состав теста:

В идеале тест должен состоять из 5 частей:

· входные (тестовые) данные (при необходимости)

· предусловие, т.е. некоторое состояние системы, при котором мы сможем выполнить необходимую проверку (например, открытие главной страницы, вход под тестовым пользователем, переход в необходимую часть приложения и подведение системы к состоянию пригодному для тестирования)

· взаимодействие с web-приложением

· проверка — сравнение ожидаемого результата с полученным

· постусловие - удаление, созданных в процессе выполнения скрипта, ненужных тестовых данных (при необходимости)

 

 

Разновидности тестов:

· Тестирование статичного контента

- правильно ли озаглавлена страница? Содержит ли страница необходимую информацию?

Проверка осуществляется при помощи конструкций вида:

Assert.IsTrue(driver.PageSource.Contains("Отчёт о трудозатратах"));

 

· Тестирование ссылок (-необязательно?)

driver.FindElement(By.LinkText("Последние за месяц")).Click();

 

· Тестирование функциональности

- проверка определенного функционала приложения путем передачи ему пользовательского ввода и получения некоторого результата

 

· Тестирование динамических элементов

- driver.FindElement(By.XPath("//div[contains(@id,'dayOfWeekPanel']”));

Синтаксис Xpath - https://msdn.microsoft.com/ru-ru/library/ms256471(v=vs.110).aspx

 

 

Проверка результатов

Наиболее часто применимые методы проверки результатов:

Assert.IsFalse – проверка того, что условие не выполняется, например – текст отсутствует на странице

Assert.IsTrue – проверка того, что условие выполняется, например – элемент присутствует на странице

Assert.AreEqual – проверка того, что два объекта равны, например, можно сравнить полученное текстовое содержимое определенного элемента с заранее заданным текстом

Assert.AreNotEqual – проверка того, что два объекта не равны, например – проверка того, что значение полученного атрибута объекта не совпадает с заранее заданным в коде значением данного атрибута.

 

Методы поиска элементов

 

В Selenium объект может быть найден при помощи:

§ атрибута ID

driver.FindElement(By.Id("popup_ok"));

§ атрибута name

§ выражения XPath

driver.FindElement(By.XPath("//a[@id='toolbar_btn_taskactions_actionsbutton']/span[2]"));

§ по тексту ссылки

driver.FindElement(By.LinkText("Последние за месяц"));

§ css класса

driver.FindElement(By.CssSelector("td.td_calendar_navigator > a > img"));

 

Предпочтительным является поиск элемента по Id. Если у элемента Id нет, либо если элемент является динамическим (его Id генерируется каждый раз при открытии/появлении данного элемента), то используется поиск по Xpath.

 

Требования к автотесту:

 

1) Тест должен выполняться в браузерах: Internet Explorer, Firefox, Chrome

2) Тесты должны быть независимы друг от друга для возможности запуска в произвольном порядке.

3) Все тесты должны иметь наименования, отвечающие следующим требованиям:

- наименование должно отражать суть проверяемой тестом задачи;

- в Nunit тесты располагаются по алфавиту, а не по порядку расположения в проекте, именование тестовых методов в стиле "_00_do_first()", "_01_do_second()", "_02_do_third()", и т.д дает в NUnit желаемый порядок исполнения тестов, соответственно, тесты должны иметь в своем наименовании цифровое значение, например - M_0_5_ManHourTest_ActivityCategory (данный тест проверяет функциональность выбора категории в разделе трудозатрат и имеет порядковый номер 5)

4) Комментарии к производимым действиям

5) По возможности - отсутствие ожиданий вида Thread.Sleep() в тесте, вместо них необходимо использовтаь следующую конструкцию для ожидания появления элемента:

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(10.00));

wait.Until(driver1 => { return driver.FindElement(By.XPath("//div[contains(text(),'Изменения сохранены')]")); });

Ожидание полной загрузки страницы:

wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

6) Использование уникальных идентификаторов для обращения к элементам – т.е., если у элемента есть Id и он уникален для страницы – обращаемся по Id, иначе – обращаемся к элементу по Xpath, который необходимо построить таким образом, чтобы обращение к элементу было уникальным, например, в случае страницы Трудозатрат поле выбора задачи не обладает уникальным Id и путь к нему может быть изменен в процессе работы со страницей (удаление записи о трудозатратах), поэтому Xpath в данном случае будет выглядеть следующим образом:

driver.FindElement(By.XPath("//div[contains(@id,'dayOfWeekPanel') and contains(@class, 'dayOfWeekExpand')]//table[@id='workLogReport']//td[@class='workLogTableCell']//tr[not(contains(@style, 'display: none'))]//div[contains(@id,'divComboBoxHistoryObject') ]//span[contains(@class, 't-select t-header')]"));

 

7) Проверки для каждой страницы

 

Обязательные проверки страниц

· Заголовок и/или текст страницы соответствует производимым действиям

· Работоспособность функционала (соответствие отображаемой информации на странице произведенным изменениям)

· На странице отсутствуют признаки ошибок: Exception, Error, Ошибка, Исключение

· текст на кнопках, которые нажимаем - ???

· отображение базовых элементов страницы - ???

· ошибки в консоли

Логирование для Google Chrome:

1) Скачать из проекта https://github.com/dharrya/ChromeJSErrorCollector файл extension.crx

2) Положить данный файл в папку с проектом и добавить его в проект: Add->Existing Item

3) В блок [TestFixtureSetup] добавить:

var options = new ChromeOptions();

options.AddExtension("extension.crx");

Driver = new ChromeDriver(options);

 

4) Функция:
public static void jsChromeErrors()

{

var javascriptDriver = Driver as IJavaScriptExecutor;

var errors = javascriptDriver.ExecuteScript("return window.JSErrorCollector_errors ? window.JSErrorCollector_errors.pump() : []");

var writer = new StreamWriter("jsErrors.log");

var collection = errors as ReadOnlyCollection<object>;

foreach (var item in collection)

{

var errorObject = item as Dictionary<string, object>;

foreach (var field in errorObject)

{

Console.WriteLine(field.Key + " - " + field.Value);

writer.WriteLine(field.Key + " - " + field.Value);

}

Console.WriteLine("-------------------");

writer.WriteLine("-------------------");

}

writer.Flush();

writer.Close();

}

Записывает ошибки из консоли в файл jsErrors.log, который кладется в папку с проектом.

5) В блок [TearDown] добавить следующий вызов данной функции:

[TearDown]

public void TeardownTest()

{

Utils.jsChromeErrors();

var writer = System.IO.File.ReadAllText("jsErrors.log");

if (writer.ToString() != "")

{

Assert.Fail("Error in console - " + writer);

}

}