среда, 5 июля 2023 г.

Как убрать конфликтующие зависимости в maven

 

  1. Например, имеем ошибку при сборке и запуске тестов: Ошибка - Unsupported version of junit:junit: 4.11.

  2. Хотя на проекте используется другая версия junit. Значит подтягивается другая версия из зависимостей.

  3. Чтобы просмотреть древо зависимостей в Intelllij Idea:
    • Нажимаем справа вкладку Maven 
    • -> Нажимаем букву m 
    • -> В появившемся окне Run Anything вводим команду с фильтром конкретной библиотеки - mvn dependency:tree -Dincludes=junit
    • Ищем в древе (после завершения загрузки зависимостей) в нашем случае - 4.11, и находим, что это какая-нибудь из подключаемых библиотек, допустим - xxx-api-rest-client

  4. Открываем основной файл Pom.xml, и находим нужную зависимость -  xxx-api-rest-client, и далее добавляем исключение в данную зависимость:
<dependency>
<groupId>ru.xxx.integration.test</groupId>
<artifactId>xxx-api-rest-client</artifactId>
<version>${xxx-api-rest-client.version}</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>

Итог:

  • Исправлена Ошибка - Unsupported version of junit:junit: 4.11 

вторник, 26 ноября 2019 г.

понедельник, 25 ноября 2019 г.

Как установить TestNG плагин в eclipse

Раньше TestNG плагин можно было найти прямо в Markrtplace. Сейчас его там почему-то нет, поэтому чтобы его установить нужно вручную добавить репозиторий через меню Help > Install New Software > Add
Name может быть любой
Location http://beust.com/eclipse

Далее ждем пока эклипс подгрузит список, выбираем нужные пункты, пару раз нажимаем Next, перезапускаем эклипс, если потребуется, и готово.



четверг, 6 августа 2015 г.

Как скопировать файлы с виртуальной машины/удаленного компьютера

При необходимости копирования файлов в виртуальную машину или с неё можно удобнее всего пользоваться клавишами ctrl+c ctrl+v

Если эта возможность не настроена и доступа к управлению виртуальной машиной нет, то можно воспользоваться следующей возможностью.

1) Присоединямся к удаленной машине через RDP
Для этого нажимаем win+R
Вводим mstsc
Нажимаем OK

2) Откроется Remote Desktop Connection
Пишем IP машины
Кликаем на Show Options

 3) Открываем вкладку Local Resources
Кликаем на More...
 4) Открываем пункт Drivers, покажутся все диски на Вашем компьютере
 5) Выбираем нужный диск и нажимаем ОК
 6) Нажимаем на Connect и соглашаемся с предупреждением
 7) Попадаем на удаленную машину, заходим в Мой Компьютер и видим добавленный диск

Диск будет доступен только в течение одного подключения.
Если данные на нём недоступны или скопировать на него не получается, возможно он защищен или зашифрован, попробуйте в этом случае подключить к локальному компьютеру флэшку и подсоединить к rdp её.

среда, 8 июля 2015 г.

Отключение блокировки всплывающих окон (popup) в Firefox

Если вдруг Ваше веб-приложение по какой-то причине изобилует всплывающими окнами, а тестовый сценарий включает много шагов с этими самыми попапами, то в какой-то момент Вы можете столкнуться с такой проблемой:
Firefox prevented this site from opening pop-up window.


Причем, даже если в настройках Firefox "Block pop-up windows"  не выбрано, начиная с какого-то момента он их все равно будет блокировать.


Это проблема.

Теперь о решении. 

Откройте в firefox about:config.


Свойство dom.popup_maximum и определяет количество окон, после открытия которого браузер начинает блокирование новых. Установив это значение можно корректировать поведения браузера.

Для использования при запуске браузера selenium в папке используемого профайла нужно найти файл prefs.js  и добавить (или отредактировать, если такое свойство уже есть) строку 
user_pref("dom.popup_maximum", 200);


вторник, 5 мая 2015 г.

Как выполнить xpath запрос в браузере

В процессе автоматизации тестирования бывает необходимо проверить результат выполнения  xpath. Конечно, есть плагины для браузеров и другие инструменты, но можно это сделать и имея под рукой только браузер.
Итак:
1. Открываем консоль браузера (F12)
2. Вставляем в консоль javascript:
function getElementByXpath(path) {
  return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

console.log( getElementByXpath("//table[@id='FieldsTable']/tbody/tr/td/select[0]") );

Заменяем выделенный текст на свой xpath и нажимаем Enter

Результат выполнения появится в консоли


или все то же самое, но без использования функции

 document.evaluate("//table[@id='FieldsTable']/tbody/tr/td/select[0]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;


четверг, 15 января 2015 г.

Selenium tests: Page Object Generator

When you need to automate tests for web-application with a lot of pages, it is hard to describe page objects for all pages manually.
There are free, easy, fast and user friendly service for page object generation automation
http://whispering-retreat-7160.herokuapp.com/generator

This web-application can generate Selenium Page Objects from html code or by link to web-page.
Generator supports following languages: Java, C#, PHP, Ruby.

How to generate page object:
1. Copy-paste html code
2. Select language: Java, C#, PHP or Ruby

3. Write selectors you need, e.g.  //a;//input
4. Click on Generate


5. After that Page Object will be generated:
public class CustomPage {

 @FindBy(id="paramField")
 private WebElement paramField;

 @FindBy(id="code")
 private WebElement code;

 @FindBy(id="description")
 private WebElement description;

}

It is about all, you can copy the page object in your project, rename and do any changes you need.

вторник, 4 ноября 2014 г.

Как снять скриншот с элемента, который находится за областью видимости окна, не совершая с ним действий

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

((Locatable) webElement).getCoordinates().inViewPort();

или

webDriver.executeScript("arguments[0].scrollIntoView(true);", webElement);

Это может помочь в случаях, когда нужно сделать скиншот не всего содержимого страницы, а лишь видимой части.

Второй способ - навести мышку на элемент, для этого нужно выполнить следующий код:

Actions actions = new Actions(webDriver);
actions.moveToElement(webElement).perform();

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






четверг, 2 октября 2014 г.

Selenium: как установить время поиска элемента или неявные ожидания

Selenium WebDriver передает управление сразу после выполнения команды, не дожидаясь какого-либо результата своих действий. То есть если Вы выполните клик по ссылке, а потом поиск элемента на странице, находящейся по этой ссылке, то Selenium не будет ждать загрузки страницы после клика, а сразу начнет поиск. Выглядит так, что этот механизм не должен работать, ведь страница еще не загрузилась и тест упадет, но по факту это работает благодаря механизму неявных ожиданий (implicit wait). WebDriver будет искать новый элемент в течение какого-то установленого времени (по умолчанию обычно 60 секунд), это не значит, что он просто подождет минуту и потом пойдет искать элемент. Это значит, что в течение 60 секунд с определенной периодичностью драйвер будет выполнять поиск элемента и только если за все это время найти элемент не удастся он упадет с ошибкой NoSuchElementException.
Методы findElement и findElements асинхронные, чтобы включить для них механизм неявного ожидания можно выполнить следующую команду:

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

После выполнения этой команды методы findElement и findElements будут пытаться найти элемент в течение 10 секунд и если ему это не удастся, выбросит исключение NoSuchElementException.

Величину implicitlyWait таймаута стоит выбирать осмысленно, слишком маленькое значение может привести к тому, что тесты будут падать просто потому что не дождались загрузки страницы. Слишком большое значение приведет к тому, что при некорректной работе приложения тесты будут слишком долго стоять в надежде найти таки этот несуществующий элемент и общее время выполнения тестов увеличится.

Если поставить значение implicitlyWait  переменной равное нулю, то веб драйвер попытается найти элемент один раз и в случае неудачи сразу выбросить исключение. Это может быть уместно, если, например, у Вас в коде уже отрабатывают методы по ожиданию полной загрузки страницы. В таком случае смысла ждать еще и внутри методов поиска элемента уже нет.

Итак, механизм неявных ожиданий (implicity waits) позволяет определить таймаут, в течение которого Selenium WebDriver  будет осуществлять поиск элемента.элементов.

среда, 24 сентября 2014 г.

Если тест зависает при попытке кликнуть на элемент, по клику на который должен открыться popup

Java Selenium WebDriver  испытывает некоторые трудности при обращении с элементами, при клике на которых открывается PopUp (всплывающее окно).
Так например, если сделать обычный клик webelement.click() по такому элементу, то тест зависнет и не упадет ни по таймауту ни по каким другим условиям. Можно лишь закрыть браузер вручную или остановить процесс. Такой эффект появляется только для некоторых сочетаний версий браузера-вебдрайвера-сайта, но тем не менее для меня в свое время это было огромной проблемой.

Чтобы клик проходил нормально, и ничего не зависало, можно нажимать на кнопку с помощью следующего джаваскрипта:

WebElement element;
//...
JavascriptExecutor executor = (JavascriptExecutor) getDriver();
        executor.executeScript("var el=arguments[0]; setTimeout(function() { el.click(); }, 100);", element);

Эта функция точно также кликнет по элементу, как и обычный click().

суббота, 29 марта 2014 г.

Несоответствие версии Selenium версии браузера (Chrome, Firefox и другие)

Одна из проблем работы с селениум заключается в том, что очень часто последняя версия Selenium Web Driver не работает с последними версиями браузеров. В такой ситуации выходов может быть несколько:
1) Подождать пока обновится драйвер для Вашего браузера. Как правило адаптация под новые версии добавляется довольно быстро. Особенно это касается firefox, потому что драйвер для него - это одна из основных частей самого продукта Selenium 2.0.
2) Тестировать на старой версии браузера. Для большинства приложений небольшое различие версий браузера не приводит к каким то фатальным проблемам. Поэтому если у Вас обычное корпоративное приложение или сайт, не использующие самые-самые последние возможности браузеров, то фатальных проблем быть не должно. Просто делаем даунгрэйд браузера и гоняем тесты не на самой последней версии.
Как обновить браузер на более старую версию?
Для Firefox можно запретить обновление в настройках (Firefox->Options->Advanced->Update) - Ставите галку, чтобы файрфокс не проверял наличие обновлений и убираете галку использования фонового сервиса для установки обновлений.

После этого скачиваете нужную версию браузера и устанавливаете поверх существующей (можно даже не удалять существующую)
Для Google Chrome ставите нужную версию и запрещаете обновления. Как запретить обновляться хрому, можете почитать тут.
Как правило, если версии не имеют сильных различий, то обновление браузера может пройти безболезненно. Но если же вдруг почему-то тесты перестали запускаться с примерно такой ошибкой - надо подумать о соответствии драйвера и браузера:
Hit exception trying to create new WebDriver instance: org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary(C:\Program Files\Mozilla Firefox\firefox.exe) on port 7055;
 Узнать, с какой версией браузера может работать драйвер можно, поискав в описании драйвера список поддерживаемых версий. Например, для хрома описание поддерживаемых версий можно найти здесь.



суббота, 15 марта 2014 г.

Решение проблемы нехватки места на диске с помощью Junction

    Иногда происходит так, что место на диске С:\ заканчивается в не очень подходящий момент. И если возможности ничего удалить нет, а место получить нужно, то ситуация не очень приятная. Да, во многих программах можно настроить папку установки и\или место хранения каких-то используемых файлов. Но это работает не для всех. А еще это может быть виртуальная машина, на которой ничего такого не стоит, но места уже нет на системном диске.

    В таком случае очень поможет поддержка символических ссылок на каталоги, которая уже довольно давно появилась в Windows (с версии Windows 2000).

    В чем суть этой технологии. На другом диске создается папка - копия существующей. А с исходного диска файлы удаляются и создается символическая ссылка. После этого при обращении пользователя\программы\системы к файлу на исходном диске происходит работа с этим файлом - "копией" (которая теперь является оригиналом). 

    Стандартными средствами Windows  этого сделать нельзя. Но есть бесплатная программа Junction, которую можно скачать здесь. С помощью неё можно легко и просто создать символическую ссылку на папку. Это консольное приложение с очень небольшим набором команд, в которых сложно запутаться.
    Рассмотрим на примере задачу, решение которой и привело меня к этой утилите.
   Есть виртуальная машина с дисками С  и D. На ней стоит Hudson. По умолчанию он свои проекты складывает C:\Documents and Settings\<username>\.hudson. 



    Проект в svn по размеру огромный, поэтому при попытке его выкачать Hudson столкнулся с тем, что место на диске С закончилось. А на диске D места много. Самый простой способ в этой ситуации - создать символическую ссылку с  C:\Documents and Settings\<username>\.hudson.  например на  E:\hudson. Тогда все файлы будут доступны по старым ссылкам на диск С, но фактически они будут храниться ( и занимать место) на диске D. 
    Итак, наконец, последовательность действий:
1. Скачиваем Junction
2. Распаковываем архив в любую папку
3. Открываем cmd (Нажимаем Win+R, в открывшееся окно пишем cmd, нажимаем enter)
4. Копируем все файлы из "C:\Documents and Settings\<username>\.hudson" в "E:\hudson"
5. Удаляем "C:\Documents and Settings\<username>\.hudson"
6. Выполняем команду junсtion "C:\Documents and Settings\<username>\.hudson" "E:\hudson"

    Директория "C:\Documents and Settings\<username>\.hudsonсоздастся при успешном выполнении команды. 

   Если после запуска ошибок не появилось, то можно убедиться в успешности переноса перейдя в "C:\Documents and Settings\<username>\.hudson" и увидев там все файлы, находящиеся в исходной папке на диске D.

Чтобы удалить привязку выполняем команду junction -d "C:\Documents and Settings\<username>\.hudson".

    Какие могут возникнуть проблемы:
1. 'junction' is not recognized as an internal or external command,
operable program or batch file. - при возникновении такой ошибки нужно 
1.1. или открыв cmd перейти в папку с распакованным junction (выполнить cd <junctiondir>)
1.2. или при выполнении команды указывать полный путь до файла, например
"C:\Program Files\Junction\junction.exe" "C:\dir" "D:\dir"
2.  Error setting junction for c:\dir: The data present in the reparse point buffer is invalid. - эта ошибка происходит при неправильном указании пути - проверьте, что пути указаны правильно, а если они с пробелами, то в кавычках.

четверг, 6 февраля 2014 г.

Генерация JAXB-классов по xsd или xml

Иногда случаются ситуации, когда необходимо написать JAXB-классы для xml, а если повезло, то по xsd.
Есть, конечно, плагины для Eclipse и наверняка много других способов, но на мой взгляд проще всего поступить так.

1. Генерация JAXB из xml

Если в наличие есть только  xml, то придется сначала получить из него xsd. Это можно сделать вручную, конечно (особенно если файл не очень сложный), но быстрее файл схемы также сгенерировать. Неплохой онлайн-инструмент для генерации xsd  по  xml находится здесь:  http://www.freeformatter.com/xsd-generator.html

Хотя иногда он ошибается, так что лучше проконтролировать, что схема получилась полной.

Получив, наконец, с помощью этого или любого другого инструмента xsd идем и выполняем действия, описанные в пункте 2

2. Генерация JAXB из xsd

Берем свой  xsd  файл (например, он называется  xsd.xsd ) и идем в директорию, куда установлена  Java. Примерно сюда: C:\Program Files\Java\jdk1.7.0_40\bin

Открываем там командную строку (например, зажимая шифт кликаем правой кнопкой и в открывшемся меню нажимаем что-нибудь похожее на Open command window here).

Далее выполняем несложную команду > xjc.exe xsd.xsd

В случае успеха в консоли увидим, что парсинг схемы и генерация классов прошли успешно.

 
Идем в директорию и забираем получившиеся файлы себе в проект. 

Ну и да, скорее всего, если вы попали на эту статью, то знаете, что такое JAXB, зачем он нужен и как его использовать. Но если вдруг что-то позабылось, то освежить память можно здесь:

Page Object генератор для Selenium тестов

Когда нужно автоматизировать тестирование приложения с большим количеством страниц, бывает довольно утомительно описывать их вручную.
Очень удобный, простой и бесплатный сервис доступен по ссылке:
http://whispering-retreat-7160.herokuapp.com/generator

Он может генерировать Selenium Page Objects по html коду или по ссылке на нужный ресурс.
Поддерживаемые генератором языки: Java, C#, PHP, Ruby.

Работает он так:
1. Копируете-вставляете html-код
2. Выбираете целевой язык: Java, C#, PHP или Ruby
3. Пишете нужные Вам селекторы через ";", например //a;//input
4. Нажимаете на кнопку Generate

5. На выходе получаете свой Page Object:
public class CustomPage {

 @FindBy(id="paramField")
 private WebElement paramField;

 @FindBy(id="code")
 private WebElement code;

 @FindBy(id="description")
 private WebElement description;

}

И все, копируете его себе, переименовываете и радуетесь жизни!

Автор активно работает над своим сервисом, скоро обещает генерировать и некоторые методы, а не только поля.

понедельник, 15 апреля 2013 г.

Добавление сертификата к jvm


При запуске Java-программы (приложения, автотеста и пр., которая работает с веб-сервисами) происходит ошибка:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

Это означает, что используемый сертификат нужно добавить в список доверенных сертификатов jvm. Для этого нужно в консоли выполнить команду:

keytool -import -noprompt -trustcacerts -alias <alias> -file <certificate> -keystore "<path\to\java\cacerts>"
Например:
keytool -import -noprompt -trustcacerts -alias alias -file C:\\something.crt -keystore "C:\Program Files (x86)\Java\jre7\lib\security\cacerts"

Если запросит пароль, то дефолтный пароль для хранилища "changeit".

Консоль при этом надо запускать от имени администратора, иначе может возникнуть ошибка доступа к файлу cacerts Access Denied.

Просмотреть список имеющихся сертификатов можно с помощью команды:

keytool -list -v  -keystore <keystore.file> -storepass <keystore.pass>
Для просмотра списка установленных сертификатов пароль не нужен (Можно просто нажать Enter, увидев в консоли запрос пароля)

вторник, 9 апреля 2013 г.

Где можно скачать браузеры разных версий

Часто для тестирования необходимы браузеры разных версий, а на официальном сайте их иногда сложно найти.
На сайте http://www.oldapps.com/category/browsers можно скачать разные версии для оффлайновой установки.
Также на этом сайте можно скачать и другие приложения разных версий.

понедельник, 8 апреля 2013 г.

Эмуляция нажатия клавиш Selenium


Для нажатия клавиш в автотестах можно использовать клас java.awt.Robot      
Нажатие ENTER  будет выглядеть следующим образом:

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);


При запуске BPWin требует SHW32.DLL

    Если после установки при запуске BPWin требует  SHW32.DLL то нужно переустановить программу, указав при запуске установщика режим совместимости с Windows XP. В этом случае он все распакует корректно.
   Искать эту dll отдельно не имеет смысла, после её добавления в системную папку появляются новые ошибки, например: "не хватает порядкового номера 294 в библиотеке SHW32.DLL"

Запрет обновления Chrome

    При использовании Selenium или других инструментов автоматизированного тестирования автоматическое обновление браузера может принести проблемы, связанные с тем, что обновление драйвера Selenium (или других плагинов) не успевает за обновлением браузера.
Чтобы запретить Chrome обновляться нужно выполнить в консоли следующие команды:


reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update" /v UpdateDefault /t REG_DWORD /d 0 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update" /v AutoUpdateCheckPeriodMinutes /t REG_DWORD /d 0 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update" /v DisableAutoUpdateChecksCheckboxValue /t REG_DWORD /d 1 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update" /v Update{8A69D345-D564-463C-AFF1-A69D9E530F96} /t REG_DWORD /d 0 /f


    После этого на вкладке Help будет написано, что обновление отключено администратором: