19 августа 2014 г.

Вебдрайвер и TestNG. Запуск тестов. 1. Командная строка.

Разберёмся, как запускать тесты с TestNG. 
Пойдём от простого к сложному и сначала рассмотрим простой запуск из командной строки.
Нужно указать в classpath все используемые нами библиотеки, а также классы с тестами.

Можно сделать вот такой вот .bat файлик

set ProjectPath=D:\Projects\Java\TestProject\bin
set SeleniumPath=C:\Libs\Java\Selenium\selenium-2.42.2\selenium-java-2.42.2.jar
set WebdriverPath=C:\Libs\Java\Selenium\selenium-2.42.2\libs\*
set TestNGPath=C:\eclipse\plugins\org.testng.eclipse_6.8.6.20141201_2240\lib\testng.jar
set classpath=%ProjectPath%;%TestNGPath%;%SeleniumPath%;%WebdriverPath%
java org.testng.TestNG testng.xml


Построчно:
Первая строчка - указание пути к бинам самого проекта.
Вторая и третья - пути к java-клиенту селениума и библиотечкам вебдрайвера
Четвёртая - это путь к самому TestNG. У меня он установлен в качестве плагина к эклипсу, потому путь выглядит вот так.
Пятая строчка - формирование classpath из заданных выше переменных.
Ну и последняя - сам запуск.

Здесь нужно напомнить, что  мы ссылаемся на файлик testng.xml. Там описано, как запускать тесты и вообще с его помощью можно наворотить делов очень тонко настроить выполнение наших тестов. Посмотрите на документацию TestNG. Там всё классно описано.
Можно не морочиться и создать такой дефолтный testng.xml из самого эклипса. Кликаем на проекте правой кнопкой мыши. TestNG - Convert to TestNG.

И ещё одна маленькая подсказка:
Используйте команду pause, чтобы окошко не закрывалось при возникновении ошибки исполнения batch файла.

18 августа 2014 г.

Webdriver. Полезные фокусы. C#


1. Относительный Xpath

Часто необходимо найти элемент с помощью Xpath внутри уже найденного вебдрайвером WebElement-а. Используйте для этого относительный Xpath (точка вначале выражения).
Вот так:
var questionDiv = driver.FindElement(By.XPath("//div[@class='ac-item']"));
questionDiv.FindElement(By.XPath(".//label[@class='ac-title']")).Click();

2. Несколько примеров работы функции contains() в Xpath выражениях:

//span[contains(.,'Как узнать информацию')] -Будут найдены элементы span, в тексте которых содержится строка 'Как узнать информацию'.

//label[contains(@class,'ac-title')] -Будут найдены все элементы label, содержащие в названии класса строку ac-title.

//label[contains(span,'Как узнать информацию')] -Будут найдены все элемент label, у которых есть дочерний элемент span, содержащий в тексте строку 'Как узнать информацию'.

//label[contains(@class,'ac-title') and contains(span,'Как узнать информацию')]  -Будут найдены все элементы label, у которых есть класс, содержащий в названии строку 'ac-title' и дочерний элемент span, содержащий в тексте строку 'Как узнать информацию'.

3. Задача - получить текст элемента, который есть в DOM-модели, но не виден. 

Использование функции Text() не решает задачу - результат будет null.
Можно выкрутиться c помощью GetAttribute("textContent"):
driver.FindElement(By.XPath("//label[@class='ac-title']")).GetAttribute("textContent");

PhantomJS и SSL. C#

Одна из первых проблем с которой я столкнулся при работе с "безголовым" браузером PhantomJS, - это открытие https-страничек.
Оказывается, по дефолту фантом их просто не открывает.

Обойти эту проблему можно так:

private static IWebDriver _driver;

public static IWebDriver GetDriver()
{
 if (_driver == null)
 {
  var driverPath = Utils.GetPhantomJSPath(); //Метод определяет путь к папке с драйвером phantomjs.exe 

  PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService(driverPath);
  service.IgnoreSslErrors = true;
  service.ProxyType = "none";
  _driver = new PhantomJSDriver(service);
  _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
 }
return _driver;
}


Ключевая строчка: service.IgnoreSslErrors = true;