Обязательные проверки страниц
Требования к созданию авто-тестов для экспресс-тестирования
Состав теста:
В идеале тест должен состоять из 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);
}
}