четверг, 15 августа 2013 г.

Сворачивание списка в Excel

      Очень часто при создании таблиц в Excel хотелось бы использовать сворачиваемые списки. Оказывается, это очень просто!

      Итак, как же это сделать?
      1. Выделяем строки раздела, которые нужно сгруппировать, кроме заголовка.
      2. Выбрать Данные -> Группировать
      3. Если были выделены не целые строки при помощи их заголовков, а просто группа ячеек, то отобразится диалоговое окно, в котором пользователю будет предложено уточнить, что он группирует — строки или столбцы.
      4. Готово!

      Теперь раздел строк можно свернуть или развернуть, нажав на кнопки «+» или «-».
      Для отображения строк определенного уровня нужно нажать на кнопки 1, 2 и т.п., соответствующие уровню.

      По умолчанию кнопки «+»/ «-» расположены внизу, но чаще всего это неудобно и некрасиво. Поэтому сделаем небольшие изменения и разместим кнопку для группировки сверху.
      Для этого в настройках раздела «Структура» в Excel нужно откорректировать расположение итоговых данных и снять флаг «итоги в строках под данными»:

      Теперь сгруппированный список выглядит так:


пятница, 9 августа 2013 г.

Selenium: проверка присутствия элемента на странице

      Одной из наиболее частых проверок в автотестах является проверка присутствия какого-либо объекта на странице. В SeleniumIDE для этого существует метод isElementPresent, а для вебдрайвера такого метода нет, но можно написать свой собственный метод:

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

понедельник, 5 августа 2013 г.

Selenium: сохранение скриншота при неуспешном выполнении теста

После выполнения автоматического теста на Selenium необходимо проанализировать результаты, а если тест оказался провален, то нужно еще и понять причину. Для нахождения ошибки при выполнении теста можно пользоваться записями в логе. Но иногда записей бывает недостаточно И вообще, лучше один раз увидеть, чем сто раз… прочитать лог.

Для того, чтобы снять скриншот экрана, у Selenium есть метод getScreenshotAs. Снятый скриншот помещается во временный файл в формате .png. Нужно скопировать этот временный файл куда-нибудь, чтобы его сохранить, иначе он будет автоматически удален после окончания выполнения тестов. 
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("C:/Work/screenshot.png"));


Итак, с сохранением скриншота все довольно просто. Но как сделать так, чтобы скриншот сохранялся только при неуспешном выполнении теста?

Для этого нужно воспользоваться возможностями фреймворка TestNG, а именно аннотацией @AfterMethod. Метод с такой аннотацией будет запускаться всегда после выполнения каждого тестового метода (для аннотации нужно обязательно указать alwaysRun = true). Далее нужно проверить результат выполнения теста ITestResult, и если результат неуспешный, то делаем скриншот.

В результате получаем: 
@AfterMethod(alwaysRun = true)
public void takeScreenshot(ITestResult result) { 

   if (! result.isSuccess()) {       File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
      try {
         String scrFilePath = "C:/Work/screenshot.png";
         FileUtils.copyFile(scrFile, new File(scrFilePath));
         log.log(Level.SEVERE, "<a href='file:///" + scrFilePath + "'>"+ result.getMethod().getMethodName()</a>");
      } catch (IOException ex) {
         log.log(Level.SEVERE, null, ex);
      }
   }
}

четверг, 25 июля 2013 г.

Selenium: завершение работы браузера

      При написании автотестов важно не забывать правильно их завершать. Для тестов, написанных с помощью вебдрайвера, после выполнения всех проверок нужно остановить браузер. У вебдрайвера есть два метода для завершения работы браузера quit и close. Различие этих методов в том, что close только закрывает текущее окно, а quit закрывает все окна, останавливает браузер и кроме того удаляет все временные файлы.

      Поэтому для корректной остановки браузера нужно пользоваться только методом quit. Можно, например, вынести завершение работы браузера в отдельный метод:

public void closeDriver() {
    //log.log(Level.INFO, "Start closeDriver");
    try{
         if (driver !=null) {
             //log.log(Level.FINE, "Closing driver...");
             driver.quit();
            driver = null;
         }
    }
    catch (Exception e){
        //log.log(Level.SEVERE, "Could not close webdriver", e);
    }

}

понедельник, 22 июля 2013 г.

Selenium: настройка driverTimeout

      При выполнении теста Webdriver выполняет все команды последовательно, не дожидаясь окончания выполнения предыдущей. Например, нажали на какую-нибудь кнопку на странице, в результате должно появиться новое поле, в которое нужно что-то ввести, но из-за асинхронной работы Webdriver команда работы с этим полем выполняется раньше, чем оно успевает появиться. Из-за этого тест может возвращать ошибку, что элемент не найден.

      Чтобы избежать этой ошибки можно каждый раз проверять наличие элемента на странице. Для этого придется использовать цикл и периодически вызывать метод findElement. Очевидно, что писать циклы для проверки наличия элемента перед выполнением каждой команды очень неудобно. К счастью, у Webdriver есть возможность задавать неявные ожидания.

      Значение неявного ожидания можно задать всего один раз, и потом Webdriver каждый раз перед выполнением команды будет пытаться найти элемент. Если же в течение указанного времени элемент не появится, то получим исключение NoSuchElementException.

       int driverTimeout = 15;
       driver.manage().timeouts().implicitlyWait(driverTimeout, TimeUnit.SECONDS);


      Включать и отключать неявное ожидание, а также менять время ожидания, можно в любой момент.

четверг, 27 июня 2013 г.

Selenium: Запуск браузера Firefox с настроенным профилем

      При запуске браузера Firefox вебдрайвер каждый раз создает новый профиль с настройками по умолчанию. Но если для выполнения теста нужно подключить какие-нибудь плагины или, например, настроить параметры proxy? Существует как минимум две возможности это сделать:
  •  все необходимы настройки свойств браузера (preferences) можно сделать в коде тестов;
  •  можно запустить Firefox с заранее настроенным профилем.

      Настройка свойств браузера в коде теста

      Список настраиваемых свойств и их названия можно узнать, набрав в адресной строке браузера специальный адрес about:config, а также в базе знаний Mozilla.

      Установка свойства браузера выполняется с помощью метода setPreference для профайла:
      profile.setPreference(свойство, значение_свойства);

      В коде теста это будет выглядеть так:
      import org.openqa.selenium.*
      import org.openqa.selenium.firefox.* 

      profile = new FirefoxProfile();
      profile.setPreference("capability.policy.default.Window.frameElement", "allAccess");
      driver = new FirefoxDriver(profile);

      Запуск Firefox с заранее настроенным профилем

      Не все настройки браузера можно изменить через интерфейс Selenium. Если все же необходимо запустить Firefox с модифицированными настройками или нужными сертификатами безопасности, то можно заранее подготовить профиль с необходимыми настройки и указывать его в тесте при запуске браузера.

      Подготовка профиля Firefox

  • Закрыть все запущенные приложения Firefox
  • Запустить командную строку Run(Выполнить) и выполнить: firefox.exe –p
  • Создать новый профайл, назвать его Webdriver
  • Запустить браузер пользователем Webdriver и настроить необходимые параметры браузера

      Код для запуска браузера с выбранным профилем

      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.firefox.FirefoxProfile;
      import org.openqa.selenium.firefox.internal.ProfilesIni;
       …
      FirefoxProfile profile = new ProfilesIni().getProfile("Webdriver");
      driver = new FirefoxDriver(profile);

среда, 26 июня 2013 г.

Совет по выбору декодера

      Периодически каждый, кто работает с компьютером, сталкивается с текстами в непонятной кодировке: то сообщение об ошибке выводится непонятными символами, то в тексте письма сплошная абракадабра… К счастью, сейчас в интернете можно найти множество самых разных декодеров текста. Одни из них более удобны в использовании, другие же совершенно неудобные и непонятные.

      Какие у меня основные требования к декодеру?
  • исходный текст и результат должны располагаться рядом на одной странице (без каких-либо переходов и всякой «анимации»;
  • вид кодировки должен определяться автоматически или должны присутствовать подсказки для выбора кодировки;
  • для меня чаще всего нужно декодировать текст на русском языке, поэтому декодер обязательно должен корректно работать именно с кириллицей;
  • раскодированный текст можно копировать просто с помощью Ctrl+C (результаты в виде txt- или doc-файлов для скачивания совершенно неудобны!);
  • после декодирования должна указываться исходная кодировка;
  • можно выбирать кодировку для отображения результата декодирования.

      С учетом этих требований для себя я выбрала Универсальный декодер кириллицы.
      Самый удобный декодер. Советую! :)