Регистрация  |  Вход

Тестирование Salesforce с помощью Selenide (вопросы-ответы)

Привет всем.

Дошли наконец руки до тестирования фронтенда. Откладывал до последнего эту тему, пока уже вообще не приперло и без нормального тестирования фронтенда стало совсем сложно делать что-то серьезное дальше.

Спасибо нашему коллеге Андрею (автору Selenide) за отличный минимальный пример как быстро начать с тестированием. Подробнее здесь - https://salesforce-developer.ru/selenide-salesforce-testirovanie-frontenda
(статья будет по мере накопления знаний расширяться)

Эту ветку я создал чтобы выкладывать здесь вопросы и делаться решениями.

Привет всем.

Дошли наконец руки до тестирования фронтенда. Откладывал до последнего эту тему, пока уже вообще не приперло и без нормального тестирования фронтенда стало совсем сложно делать что-то серьезное дальше.

Спасибо нашему коллеге Андрею (автору Selenide) за отличный минимальный пример как быстро начать с тестированием. Подробнее здесь - https://salesforce-developer.ru/selenide-salesforce-testirovanie-frontenda
(статья будет по мере накопления знаний расширяться)

Эту ветку я создал чтобы выкладывать здесь вопросы и делаться решениями.

И первый вопрос.

Как в тесте открыть страницу по относительному URL
/apex/MyPage

Дело в том что после входа со страницы логин базовый URL величина динамическая и хардкодить ее нельзя.

Я попробовал по простому как написано в документации указать относительный ULR, но меня перекинуло на какую-то странный адрес начинающийся с http://localhost:8080 плюс относительный мой относительный URL.

Вопрос, как мне в тестах получить URL из браузера куда меня редиректит после логина? (лучше конечно получить его в виде текста, чтобы потом проще было использовать).
Или как заставить Selenide использовать URL после редиректа в качестве базового для относительных URL?

И первый вопрос.

Как в тесте открыть страницу по относительному URL
/apex/MyPage

Дело в том что после входа со страницы логин базовый URL величина динамическая и хардкодить ее нельзя.

Я попробовал по простому как написано в документации указать относительный ULR, но меня перекинуло на какую-то странный адрес начинающийся с http://localhost:8080 плюс относительный мой относительный URL.

Вопрос, как мне в тестах получить URL из браузера куда меня редиректит после логина? (лучше конечно получить его в виде текста, чтобы потом проще было использовать).
Или как заставить Selenide использовать URL после редиректа в качестве базового для относительных URL?

Еще небольшой вопрос

По умолчанию в примере используется Firefox в качестве браузера для тестов - но он у меня отваливается при запуске. Пока не гуглил в чем может быть причина, но если есть информация куда можно посмотреть буду признателен.

Пока настроил чтобы тесты использовали Chrome в качестве браузера для запуска тестов (тоже пришлось немного помучатся пока нашел как его подключить).

Еще небольшой вопрос

По умолчанию в примере используется Firefox в качестве браузера для тестов - но он у меня отваливается при запуске. Пока не гуглил в чем может быть причина, но если есть информация куда можно посмотреть буду признателен.

Пока настроил чтобы тесты использовали Chrome в качестве браузера для запуска тестов (тоже пришлось немного помучатся пока нашел как его подключить).


Такой еще вопрос

Я так понимаю что Selenide построен на базе Selenium WebDrive. Есть ли возможность из тестов Selenide обращаться к возможностям WebDrive API напрямую. Вот к примеру если я что-то не могу найти в документации Selenide, но нахожу в документации к WebDrive как мне использовать возможности последнего?

Такой еще вопрос 

Я так понимаю что Selenide построен на базе Selenium WebDrive. Есть ли возможность из тестов Selenide обращаться к возможностям WebDrive API напрямую. Вот к примеру если я что-то не могу найти в документации Selenide, но нахожу в документации к WebDrive как мне использовать возможности последнего?

Dmitry Shnyrev
использовать WebDrive API напрямую

Нашел ответ
здесь https://github.com/codeborne/selenide/wiki/How-Selenide-creates-WebDriver

import static com.codeborne.selenide.WebDriverRunner.getWebDriver;
getWebDriver().getCurrentUrl();

[quote="Dmitry Shnyrev"]использовать WebDrive API напрямую[/quote]
Нашел ответ :)
здесь https://github.com/codeborne/selenide/wiki/How-Selenide-creates-WebDriver

[code]import static com.codeborne.selenide.WebDriverRunner.getWebDriver;
getWebDriver().getCurrentUrl();[/code]


В общем текущий URL нашел как получить, но теперь такая проблема нарисовалась.

После сабмита формы и следующей командой получить текущий URL видно что URL промежуточный, т.е. браузер не успевает отработать все редиректы.

Как дождаться всех редиректов прежде чем выполнить следующую команду?

Ответ:
Нашел ответ в документации
in most cases you don't need this method because all should- methods wait too.
Т.е. чтобы дождаться окончания редиректов необходимо чтобы была хотя бы одна команда с
.shouldBe(visible)

В случае с SF после сабмита формы логина нужно дождаться пока нас не перекинет на страницу
https://eu5.salesforce.com/home/home.jsp
отловить это можно например так

$("#home_Tab").shouldBe(visible);

и уже после этого можно получать текущий URL в браузере и использовать его в качестве baseUrl.

В общем текущий URL нашел как получить, но теперь такая проблема нарисовалась.

После сабмита формы и следующей командой получить текущий URL видно что URL промежуточный, т.е. браузер не успевает отработать все редиректы. 

Как дождаться всех редиректов прежде чем выполнить следующую команду?

[color=red]Ответ[/color]:
Нашел ответ в документации
[b]in most cases you don't need this method because all should- methods wait too.[/b]
Т.е. чтобы дождаться окончания редиректов необходимо чтобы была хотя бы одна команда с 
.shouldBe(visible)

В случае с SF после сабмита формы логина нужно дождаться пока нас не перекинет на страницу
https://eu5.salesforce.com[b]/home/home.jsp[/b]
отловить это можно например так
[code]$("#home_Tab").shouldBe(visible);[/code]

и уже после этого можно получать текущий URL в браузере и использовать его в качестве baseUrl.

Dmitry Shnyrev
Пока настроил чтобы тесты использовали Chrome в качестве браузера для запуска тестов (тоже пришлось немного помучатся пока нашел как его подключить

Подключается либо через командную строку, либо через build.properties

[quote="Dmitry Shnyrev"]Пока настроил чтобы тесты использовали Chrome в качестве браузера для запуска тестов (тоже пришлось немного помучатся пока нашел как его подключить[/quote]

Подключается либо через командную строку, либо через build.properties

Это да, только еще не лишим будет упомянуть что chromedriver необходимо отдельно скачать (он по ходу по умолчанию не имет в комплекте). В итоге конечно, делов то на 1 минуту, просто кто не в курсе придется немного погуглить.

Это да, только еще не лишим будет упомянуть что chromedriver необходимо отдельно скачать (он по ходу по умолчанию не имет в комплекте). В итоге конечно, делов то на 1 минуту, просто кто не в курсе придется немного погуглить.

Вопрос:
Как в Selenide можно вызывать javascipt функции на странице, или исполнять произвольный код?
Просто появилась отличная идея перенести часть функционала из selenide на страницу в специальные функции.
Это значительно ускорит разработку тестов.

Ответ: (хорошая кстати методика получается - появился вопрос - напиши, нашел ответ первым - сразу тут и вариант решения напиши. Все советую!)

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.JavascriptExecutor;
import static com.codeborne.selenide.WebDriverRunner.getWebDriver;

webDriver = getWebDriver();

if (webDriver instanceof JavascriptExecutor) {
((JavascriptExecutor) webDriver).executeScript("alert('hello world');");
}

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html

Вопрос:
Как в Selenide можно вызывать javascipt функции на странице, или исполнять произвольный код?
Просто появилась отличная идея перенести часть функционала из selenide на страницу в специальные функции. 
Это значительно ускорит разработку тестов.

[color=red]Ответ:[/color] (хорошая кстати методика получается - появился вопрос - напиши, нашел ответ первым - сразу тут и вариант решения напиши. Все советую!)

[code]import org.openqa.selenium.WebDriver;
import org.openqa.selenium.JavascriptExecutor;
import static com.codeborne.selenide.WebDriverRunner.getWebDriver;

webDriver = getWebDriver();

if (webDriver instanceof JavascriptExecutor) {
   ((JavascriptExecutor) webDriver).executeScript("alert('hello world');");
}[/code]

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html

Вопрос:
как дождаться выполнения и получить какой-то результат из javascript в Selenide.

Ответ: Вот и весь ответ в документации (ссылка выше)

java.lang.Object executeScript(java.lang.String script,
java.lang.Object... args)
Executes JavaScript in the context of the currently selected frame or window. The script fragment provided will be executed as the body of an anonymous function.
Within the script, use document to refer to the current document. Note that local variables will not be available once the script has finished executing, though global variables will persist.

If the script has a return value (i.e. if the script contains a return statement), then the following steps will be taken:

For an HTML element, this method returns a WebElement
For a decimal, a Double is returned
For a non-decimal number, a Long is returned
For a boolean, a Boolean is returned
For all other cases, a String is returned.
For an array, return a List<Object> with each object following the rules above. We support nested lists.
Unless the value is null or there is no return value, in which null is returned
Arguments must be a number, a boolean, a String, WebElement, or a List of any combination of the above. An exception will be thrown if the arguments do not meet these criteria. The arguments will be made available to the JavaScript via the "arguments" magic variable, as if the function were called via "Function.apply"

Parameters:
script - The JavaScript to execute
args - The arguments to the script. May be empty
Returns:
One of Boolean, Long, String, List or WebElement. Or null.

Вопрос:  
как дождаться выполнения и получить какой-то результат из javascript в Selenide.

[color=red]Ответ:[/color] Вот и весь ответ в документации (ссылка выше)

[i]java.lang.Object executeScript(java.lang.String script,
                             java.lang.Object... args)
Executes JavaScript in the context of the currently selected frame or window. The script fragment provided will be executed as the body of an anonymous function.
Within the script, use document to refer to the current document. Note that local variables will not be available once the script has finished executing, though global variables will persist.

[color=red]If the script has a return value (i.e. if the script contains a return statement), then the following steps will be taken:[/color]

For an HTML element, this method returns a WebElement
For a decimal, a Double is returned
For a non-decimal number, a Long is returned
For a boolean, a Boolean is returned
For all other cases, a String is returned.
For an array, return a List<Object> with each object following the rules above. We support nested lists.
Unless the value is null or there is no return value, in which null is returned
Arguments must be a number, a boolean, a String, WebElement, or a List of any combination of the above. An exception will be thrown if the arguments do not meet these criteria. The arguments will be made available to the JavaScript via the "arguments" magic variable, as if the function were called via "Function.apply"

Parameters:
script - The JavaScript to execute
[color=red]args - The arguments to the script. May be empty[/color]
Returns:
[color=red]One of Boolean, Long, String, List or WebElement. Or null.[/color][/i]

Вот небольшой эксперимент который отлично отвечает на все предыдущие вопросы

Object res = ((JavascriptExecutor) webDriver).executeScript("return arguments;", "doom1", "doom2", 1111);
System.out.println("XXXXX res - "+res);

Что мы здесь видим?
в javascript мы просто возвращаем arguments (это стандартная переменная содержащая список всех аргументов в js функции)
аргументы, которые передаются в наш javascript - "doom1", "doom2", 1111

А вот и вывод в консоли
XXXXX res - [doom1, doom2, 1111]

Вот небольшой эксперимент который отлично отвечает на все предыдущие вопросы

[code]
Object res = ((JavascriptExecutor) webDriver).executeScript("return arguments;", "doom1", "doom2", 1111);
System.out.println("XXXXX res - "+res);
[/code]

Что мы здесь видим?
в javascript мы просто возвращаем arguments (это стандартная переменная содержащая список всех аргументов в js функции)
аргументы, которые передаются в наш javascript - "doom1", "doom2", 1111

А вот и вывод в консоли
[b]XXXXX res - [doom1, doom2, 1111][/b]

Короче, это круто!
Вот такая интересная архитектура родилась в голове.
Всю бизнес логику тестов располагаем тут же на странице в специальные функции - скорость разработки и отладки увеличивается в разы (по сравнению с java).
А Selenide уже используем чтобы добраться до этих функций, запустить их, проконтролировать результат выполнения.

Конечно получается франкенштейн, но на первый взгляд должно работать круто.

Еще единственный момент остался - на стороне Selenide отлавливать результаты выполнения асинхронных js функций. Но я уже предчувствую что это известная задача и решения должно существовать.

Короче, это круто!
Вот такая интересная архитектура родилась в голове.
Всю бизнес логику тестов располагаем тут же на странице в специальные функции - скорость разработки и отладки увеличивается в разы (по сравнению с java).
А Selenide уже используем чтобы добраться до этих функций, запустить их, проконтролировать результат выполнения.

Конечно получается франкенштейн, но на первый взгляд должно работать круто.

Еще единственный момент остался - на стороне Selenide отлавливать результаты выполнения асинхронных js функций. Но я уже предчувствую что это известная задача и решения должно существовать.

В принципе можно так делать. Но это действительно франкенштейн.

Прежде всего плохо то, что в продакшиновском коде будут какие-то JavaScript функции, необходимые только для тестирования. Тогда какой-нибудь хакер сможет их вызывать и в продакшине.

Если конкретно вам JavaScript нравится больше, чем Java, то стоит изначально писать тесты на JavaScript. Для этого тоже есть библиотеки - вот тут целый список: http://phantomjs.org/headless-testing.html

Пишите тесты на JavaScript, запускаете тоже на JavaScript (NodeJS) - тогда вам вообще не понадобится нелюбимая Java. :)

В принципе можно так делать. Но это действительно франкенштейн.

Прежде всего плохо то, что в продакшиновском коде будут какие-то JavaScript функции, необходимые только для тестирования. Тогда какой-нибудь хакер сможет их вызывать и в продакшине.

Если конкретно вам JavaScript нравится больше, чем Java, то стоит изначально писать тесты на JavaScript. Для этого тоже есть библиотеки - вот тут целый список: http://phantomjs.org/headless-testing.html

Пишите тесты на JavaScript, запускаете тоже на JavaScript (NodeJS) - тогда вам вообще не понадобится нелюбимая Java. :)

Dmitry Shnyrev
Вот небольшой эксперимент который отлично отвечает на все предыдущие вопросы

Object res = ((JavascriptExecutor) webDriver).executeScript("return arguments;", "doom1", "doom2", 1111);
System.out.println("XXXXX res - "+res);

Кстати, в Selenide можно вызывать JavaScript чуть проще.
Вот так:

import static com.codeborne.selenide.Selenide.executeJavaScript;

return executeJavaScript("return arguments[0].innerText", element);

[quote="Dmitry Shnyrev"]Вот небольшой эксперимент который отлично отвечает на все предыдущие вопросы

[code]
Object res = ((JavascriptExecutor) webDriver).executeScript("return arguments;", "doom1", "doom2", 1111);
System.out.println("XXXXX res - "+res);
[/code]
[/quote]

Кстати, в Selenide можно вызывать JavaScript чуть проще.
Вот так:

[code]
import static com.codeborne.selenide.Selenide.executeJavaScript;

return executeJavaScript("return arguments[0].innerText", element);
[/code]

Андрей Солнцев
Если конкретно вам JavaScript нравится больше, чем Java, то стоит изначально писать тесты на JavaScript.

Я не сильно разбирался в JS библиотеках для тестрования.
Единственное что понял (на примере Jasmine), что все такого рода тест фреймворки предназначены чтобы подгружать и дергать js функции.
Но проблема в том что надо протестировать чужие библиотеки. доступ к js которых нет.
Ну и само тестирование внутри SF, который тоже подгружает тонну своего JS тоже не совсем понятно как делать с помощью этих фреймворков (я пока не рассматривал запуск под NodeJS, а только из под самого браузера).
Selenide пока отлично справляется.
На счет фрайнкинштейна и наличия тестовых функций в проде согласен, надо подумать.

[quote="Андрей Солнцев"]Если конкретно вам JavaScript нравится больше, чем Java, то стоит изначально писать тесты на JavaScript.[/quote]
Я не сильно разбирался в JS библиотеках для тестрования.
Единственное что понял (на примере Jasmine), что все такого рода тест фреймворки предназначены чтобы  подгружать и дергать js функции.
Но проблема в том что надо протестировать чужие библиотеки. доступ к js которых нет.
Ну и само тестирование внутри SF, который тоже подгружает тонну своего JS тоже не совсем понятно как делать с помощью этих фреймворков (я пока не рассматривал запуск под NodeJS, а только из под самого браузера).
Selenide пока отлично справляется.
На счет фрайнкинштейна и наличия тестовых функций в проде согласен, надо подумать.


Вот кстати интересная информация про phantomeJS.
Не сталкивался пока с таким.

Вот кстати интересная информация про phantomeJS.
Не сталкивался пока с таким.

Что мне нравится при использовании selenide (selenium webdriver) то что можно видеть как идут тесты - открывается браузер и все действия можно просто визуально контролировать. Так же понравилось что в случае ошибки сохраняется скриншот страницы. Я думаю это полезно!

Что мне нравится при использовании selenide (selenium webdriver) то что можно видеть как идут тесты - открывается браузер и все действия можно просто визуально контролировать. Так же понравилось что в случае ошибки сохраняется скриншот страницы. Я думаю это полезно!

Dmitry Shnyrev
на стороне Selenide отлавливать результаты выполнения асинхронных js функций.

Погуглил этот момент.
Вот понравилась эта статья - просто и по делу.
http://blog.activelylazy.co.uk/2010/05/05/testing-asynchronous-applications-with-webdriver/

В двух словах все сводится к 3 основным методам:
1. ставить sleep на время работы асинхронного запроса - большая проблема что мы не можем гарантировать что запрос успеет завершится за это время.
2. периодически опрашивать наличие элемента на странице, который должен появиться после выполнения асинхронного запроса.
3. на самой странице завести глобальную переменную, которая будет содержать состояние асинхронного запроса и в тестах периодически опрашивать ее с помощью выполнения js кода из selenide.

[quote="Dmitry Shnyrev"]на стороне Selenide отлавливать результаты выполнения асинхронных js функций.[/quote]
Погуглил этот момент.
Вот понравилась эта статья - просто и по делу.
http://blog.activelylazy.co.uk/2010/05/05/testing-asynchronous-applications-with-webdriver/

В двух словах все сводится к 3 основным методам:
1. ставить sleep на время работы асинхронного запроса - большая проблема что мы не можем гарантировать что запрос успеет завершится за это время.
2. периодически опрашивать наличие элемента на странице, который должен появиться после выполнения асинхронного запроса.
3. на самой странице завести глобальную переменную, которая будет содержать состояние асинхронного запроса и в тестах периодически опрашивать ее с помощью выполнения js кода из selenide.

Не могу найти в документации Selenide следующие вопросы

1. как мне проверить что количество элементов больше определенного. Т.е. есть таблица но не изветсно сколько там строк, но должно быть только 3 например.

2. как мне просто сравнить 2 числа и выкинуть ошибку. Что-то по типу assertEquals(2,2)?

Не могу найти в документации Selenide следующие вопросы

1. как мне проверить что количество элементов больше определенного. Т.е. есть таблица но не изветсно сколько там строк, но должно быть только 3 например.

2. как мне просто сравнить 2 числа и выкинуть ошибку. Что-то по типу assertEquals(2,2)?

Dmitry Shnyrev
2. периодически опрашивать наличие элемента на странице, который должен появиться после выполнения асинхронного запроса.

Правильная статья.
Хорошая новость в том, что в Selenide это уже реализовано. А именно, второй подход.
Любой вызов проверки типа

$("#username").shouldBe(visible);
периодически опрашивает элемент, пока он не станет видимым. Набор проверок Selenide значительно богаче, чем просто "isDisplayed": там можно проверять и на наличие текста, и значения, и css класса и ещё много чего.

[quote="Dmitry Shnyrev"]2. периодически опрашивать наличие элемента на странице, который должен появиться после выполнения асинхронного запроса. [/quote]

Правильная статья. 
Хорошая новость в том, что в Selenide это [b]уже реализовано[/b]. А именно, второй подход.
Любой вызов проверки типа [code]$("#username").shouldBe(visible);[/code] периодически опрашивает элемент, пока он не станет видимым. Набор проверок Selenide значительно богаче, чем просто "isDisplayed": там можно проверять и на наличие текста, и значения, и css класса и ещё много чего.

Андрей Солнцев
периодически опрашивает элемент, пока он не станет видимым.

А как долго он опрашивает. Вот скажем у меня этот элемент не появится вообще не странице. Когда Selenide закончит опрашивать?

[quote="Андрей Солнцев"]периодически опрашивает элемент, пока он не станет видимым.[/quote]
А как долго он опрашивает. Вот скажем у меня этот элемент не появится вообще не странице. Когда Selenide закончит опрашивать?

Dmitry Shnyrev
1. как мне проверить что количество элементов больше определенного. Т.е. есть таблица но не изветсно сколько там строк, но должно быть только 3 например.

2. как мне просто сравнить 2 числа и выкинуть ошибку. Что-то по типу assertEquals(2,2)?

1. Двойной доллар возвращает массив элементов. У него тоже есть методы для проверок. Примерно так:

$$("table#transactions tbody tr").shouldHave(size(3));

или так:

$$("table#transactions tbody tr").shouldHave(texts("Vasja", "Petja", "Katja"));

2. Ну так assertEquals(2,2) для этого и есть. Или я не понял вопроса?

[quote="Dmitry Shnyrev"]1. как мне проверить что количество элементов больше определенного. Т.е. есть таблица но не изветсно сколько там строк, но должно быть только 3 например.

2. как мне просто сравнить 2 числа и выкинуть ошибку. Что-то по типу assertEquals(2,2)?[/quote]

1. Двойной доллар возвращает массив элементов. У него тоже есть методы для проверок. Примерно так:
[code]$$("table#transactions tbody tr").shouldHave(size(3));[/code]

или так:

[code]$$("table#transactions tbody tr").shouldHave(texts("Vasja", "Petja", "Katja"));[/code]

2. Ну так assertEquals(2,2) для этого и есть. Или я не понял вопроса?

Dmitry Shnyrev
2. как мне просто сравнить 2 числа и выкинуть ошибку. Что-то по типу assertEquals(2,2)?

С этим вроде тоже разобрался

Используем возможности jUnit

import static org.junit.Assert.*;
assertEquals(2, 3);

или с понятным сообщением

assertEquals("Cool assertion error message here.", 2, 3);

https://github.com/junit-team/junit/wiki/Assertions

[quote="Dmitry Shnyrev"]2. как мне просто сравнить 2 числа и выкинуть ошибку. Что-то по типу assertEquals(2,2)?[/quote]
С этим вроде тоже разобрался

Используем возможности jUnit

[code]
import static org.junit.Assert.*;
assertEquals(2, 3);
[/code]

или с понятным сообщением
[code]
assertEquals("Cool assertion error message here.", 2, 3);
[/code]

https://github.com/junit-team/junit/wiki/Assertions

Андрей Солнцев
2. Ну так assertEquals(2,2) для этого и есть. Или я не понял вопроса?

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

[quote="Андрей Солнцев"]2. Ну так assertEquals(2,2) для этого и есть. Или я не понял вопроса?[/quote]
Не, все правильно. Просто мне например не всегда надо проверять именно элементы, а нужно проверять результаты каких-то вычислений в тесте. Просто по умолчанию assertEquals недоступен, надо было откуда-то его подгрузить.

Dmitry Shnyrev
А как долго он опрашивает. Вот скажем у меня этот элемент не появится вообще не странице. Когда Selenide закончит опрашивать?

Вопрос решился сам

[junit] FAILED
[junit] Element not found {.open-price-grid-modal}
[junit] Expected: visible

Браузер повисел каких-то секунды 3 и выдал такую ошибку.

[quote="Dmitry Shnyrev"]А как долго он опрашивает. Вот скажем у меня этот элемент не появится вообще не странице. Когда Selenide закончит опрашивать?[/quote]
Вопрос решился сам :)

[b][junit] FAILED
[junit] Element not found {.open-price-grid-modal}
[junit] Expected: visible[/b]

Браузер повисел каких-то секунды 3 и выдал такую ошибку.

Dmitry Shnyrev
А как долго он опрашивает. Вот скажем у меня этот элемент не появится вообще не странице. Когда Selenide закончит опрашивать?

По умолчанию - до 4 секунд. Этот таймаут можно менять:

Configuration.timeout = 8000;

[quote="Dmitry Shnyrev"]А как долго он опрашивает. Вот скажем у меня этот элемент не появится вообще не странице. Когда Selenide закончит опрашивать?[/quote]
По умолчанию - до 4 секунд. Этот таймаут можно менять:

[code]Configuration.timeout = 8000;[/code]

А есть ли какой-нибудь простой способ проконтролировать что выбрал $ или $$
Вот сейчас у меня такая ситуация выбираю с помощью $$ все tr в таблице и мне возвращает 4 элемента (проверяю с помощью .size()) но на самом деле их должно быть 3. Пытаюсь воспроизвести тоже самое на консоли браузера через jQuery и мне возвращает 3 элемента, как и должно быть.

Вообще было бы идеально (если есть такая возможность) приостановить работу тестов и дать доступ к консоли браузера (Chrome в моем случае) чтобы я мог посмотреть что там творится с переменными и какой-нибудь командой из консоли опять же продолжить тесты. Типа такой отладки в тестах.

Ну или хотя бы в удобном виде (html кусок в виде текста) вывести в консоль с помощью println().

Или может есть какие нибудь другие способы?

А есть ли какой-нибудь простой способ проконтролировать что выбрал $ или $$
Вот сейчас у меня такая ситуация выбираю с помощью $$ все tr в таблице и мне возвращает 4 элемента (проверяю с помощью .size()) но на самом деле их должно быть 3. Пытаюсь воспроизвести тоже самое на консоли браузера через jQuery и мне возвращает 3 элемента, как и должно быть.

Вообще было бы идеально (если есть такая возможность) приостановить работу тестов и дать доступ к консоли браузера (Chrome в моем случае) чтобы я мог посмотреть что там творится с переменными и какой-нибудь командой из консоли опять же продолжить тесты. Типа такой отладки в тестах.

Ну или хотя бы в удобном виде (html кусок в виде текста) вывести в консоль с помощью println().

Или может есть какие нибудь другие способы?

Вот такую статью нашел, но ничего похожего на мой вариант там нет
http://www.assertselenium.com/webdriver/webdriver-wait-commands/
продолжаю искать.

Чтобы немного понятнее еще выразиться - я имею в виду функционал похожий на breakpoint.
Поставил такой, дошло выполнение до этого места и браузер замер (работай с ним). потом нажал "продолжить" чтобы продолжить выполнение тестов.

Вот такую статью нашел, но ничего похожего на мой вариант там нет
http://www.assertselenium.com/webdriver/webdriver-wait-commands/
продолжаю искать.

Чтобы немного понятнее еще выразиться - я имею в виду функционал похожий на breakpoint.
Поставил такой, дошло выполнение до этого места и браузер замер (работай с ним). потом нажал "продолжить" чтобы продолжить выполнение тестов.

Dmitry Shnyrev
А есть ли какой-нибудь простой способ проконтролировать что выбрал $ или $$

Конечно есть. Тебе не надо ничего делать, он сработает сам по себе. Когда любая проверка падает, Selenide выводит содержимое элемента. Допустим, если такая проверка:

$("h2").shouldHave(text("expected text"));

упала, то ты увидишь такое сообщение об ошибке:

Element should have text 'expected text' {h2}
Element: '<h2>Dropdown list</h2>'
Screenshot: http://ci.org/build/reports/tests/firefox/1.jpg
Timeout: 1.500 s.

То же самое и с $$ - в ошибке будет видно, какие 4 элемента нашёл Selenide.

А breakpoint можно легко поставить прямо с самом тесте. Запускаешь тест из IDEA или Eclipse, ставишь breakpoint - отлаживай на здоровье.

[quote="Dmitry Shnyrev"]А есть ли какой-нибудь простой способ проконтролировать что выбрал $ или $$ [/quote]

Конечно есть. Тебе не надо ничего делать, он сработает сам по себе. Когда любая проверка падает, Selenide выводит содержимое элемента. Допустим, если такая проверка:
[code]$("h2").shouldHave(text("expected text"));[/code]

упала, то ты увидишь такое сообщение об ошибке:
[code]Element should have text 'expected text' {h2}
Element: '<h2>Dropdown list</h2>'
Screenshot: http://ci.org/build/reports/tests/firefox/1.jpg
Timeout: 1.500 s.[/code]

То же самое и с $$ - в ошибке будет видно, какие 4 элемента нашёл Selenide.

А breakpoint можно легко поставить прямо с самом тесте. Запускаешь тест из IDEA или Eclipse, ставишь breakpoint - отлаживай на здоровье. 

Андрей Солнцев
А breakpoint можно легко поставить прямо с самом тесте. Запускаешь тест из IDEA или Eclipse, ставишь breakpoint - отлаживай на здоровье.

А кстати вопрос - без IDEA никак нельзя в java брейкпоинты поставить и на них останавливаться? ну скажем я сейчас использую Sublime Text для редактирования тестов и ant для запуска. Все пока что в арсенале - пока по простому делаю.

[quote="Андрей Солнцев"]А breakpoint можно легко поставить прямо с самом тесте. Запускаешь тест из IDEA или Eclipse, ставишь breakpoint - отлаживай на здоровье.[/quote]
А кстати вопрос - без IDEA никак нельзя в java брейкпоинты поставить и на них останавливаться? ну скажем я сейчас использую Sublime Text для редактирования тестов и ant для запуска. Все пока что в арсенале - пока по простому делаю.

Dmitry Shnyrev
А кстати вопрос - без IDEA никак нельзя в java брейкпоинты поставить и на них останавливаться?

Боюсь, что нельзя. А зачем? IDEA (ну или Eclipse) специально для этого создана. Бесплатна. Очень удобна. Зачем от неё отказываться? Неудивительно, что у вас Java медленно продвигается. :)

[quote="Dmitry Shnyrev"]А кстати вопрос - без IDEA никак нельзя в java брейкпоинты поставить и на них останавливаться?[/quote]

Боюсь, что нельзя. А зачем? IDEA (ну или Eclipse) специально для этого создана. Бесплатна. Очень удобна. Зачем от неё отказываться? Неудивительно, что у вас Java медленно продвигается. :)

у нас java вообще никак не продвигается, а у меня конкретно, вообще нездоровое к ней отношение
Но намек понял, пошел устанавливать IDEA.
Кстати, благодаря знакомству с Selenide наконец-то начал въезжать в принцип работы Selenium и его WebDrive. Это многого стоит. В принципе такие же тесты можно писать и на python (что мне ближе, но не ближе остальной команде) и на nodeJs.
Но все же Selenide подкупает своим расширенным набором вспомогательных методов. Я так понимаю что Selenide не просто удобный проксик для транслирования вызовов в сам webdrive, но и удобный комбайн для автоматизации рутинных задач в одну две команды.

:) у нас java вообще никак не продвигается, а у меня конкретно, вообще нездоровое к ней отношение :D 
Но намек понял, пошел устанавливать IDEA. 
Кстати, благодаря знакомству с Selenide наконец-то начал въезжать в принцип работы Selenium и его WebDrive. Это многого стоит. В принципе такие же тесты можно писать и на python (что мне ближе, но не ближе остальной команде) и на nodeJs.
Но все же Selenide подкупает своим расширенным набором вспомогательных методов. Я так понимаю что Selenide не просто удобный проксик для транслирования вызовов в сам webdrive, но и удобный комбайн для автоматизации рутинных задач в одну две команды.

Сорри за ламерский вопрос

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

Вот создал проект

Как правильно настроить конфигурацию на запуск?

Можно просто поделиться ссылкой на статью

Сорри за ламерский вопрос :)

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

Вот создал проект

[img]/pics/78/original_2015-06-14_10-03-57.png[/img]

Как правильно настроить конфигурацию на запуск?

Можно просто поделиться ссылкой на статью :) 

Нашел в документации к IDEA вот такой способ

Надо отрыть по View | Ant Build
добавить файл build.xml ( зеленый крестик )
и запустить ui-test

https://www.jetbrains.com/idea/help/ant.html

ЗЫ. правда не могу понять куда выводится информация которую в видел в консоли. Чего-то не хватает.

Нашел в документации к IDEA вот такой способ

[img]/pics/79/original_2015-06-14_10-26-10.png[/img]

Надо отрыть по View | Ant Build
добавить файл build.xml ( зеленый крестик )
и запустить ui-test

https://www.jetbrains.com/idea/help/ant.html

ЗЫ. правда не могу понять куда выводится информация которую в видел в консоли. Чего-то не хватает.

Нашел куда выводятся сообщения из Ant
Messages (Alt+0)

Нашел куда выводятся сообщения из Ant
Messages (Alt+0)

[img]/pics/80/original_2015-06-14_10-39-17.png[/img]

В общем что-то у меня подозрение, что это что-то не то
По ходу надо как-то запускать jUnit напрямую, а не дергать ant.

В общем что-то у меня подозрение, что это что-то не то :D 
По ходу надо как-то запускать jUnit напрямую, а не дергать ant.

Dmitry Shnyrev
В общем что-то у меня подозрение, что это что-то не то
По ходу надо как-то запускать jUnit напрямую, а не дергать ant.

Да, точно, надо запускать JUnit напрямую. Через ANT тоже можно, но это франкенштейн.

Для этого в настройках проекта надо указать, что папка "ui-test" - типа "tests".
Вот здесь описано с картинками: http://devcolibri.com/864

И потом на любом тесте правой кнопкой мышки -> run -> tests (продвинутый вариант - Ctrl+Shift+F10).

[quote="Dmitry Shnyrev"]В общем что-то у меня подозрение, что это что-то не то :D 
По ходу надо как-то запускать jUnit напрямую, а не дергать ant.[/quote]

Да, точно, надо запускать JUnit напрямую. Через ANT тоже можно, но это франкенштейн. :)

Для этого в настройках проекта надо указать, что папка "ui-test" - типа "tests". 
Вот здесь описано с картинками: http://devcolibri.com/864

И потом на любом тесте правой кнопкой мышки -> run -> tests (продвинутый вариант - Ctrl+Shift+F10).

Вроде сделал как по шагам.
Даже прикрутил ivyIDEA плагин чтобы зависимости в проекте разрулить (ошибки пропали)
Но все равно что-то да упустил.

Вот такая картина у меня

Вроде сделал как по шагам. 
Даже прикрутил ivyIDEA плагин чтобы зависимости в проекте разрулить (ошибки пропали)
Но все равно что-то да упустил.

Вот такая картина у меня

[img]/pics/81/original_2015-06-15_10-14-17.png[/img]

Сорри за жуниорские вопросы Но я думаю вы меня простите
Для 8 часов опыта работы с языком это нормально

Пошел немного в обход.
Сделал новый проект на базу maven по видео здесь

https://vimeo.com/107647158

Заставил тесты работать в Intelij IDEA, поправил структуру проекта, чтобы уже не основываться на примере для Salesforce отсюда https://github.com/selenide-examples/salesforce

После того как тесты заработали добавил из примера для Salesforce настройки для ant + ivy(поменял пути к исходникам).

Работает!

Самое приятное - что теперь можно отлаживать тесты с помощью встроенного в Idea дебагера - видны все переменные в тестах. НО что еще круче всего - это то что браузер на брейпоинте тоже замирает и можно открыв по F12 консоль работать со страницей через JS (опять же проконтролировать что там да как с DOM и JS)

Сорри за жуниорские вопросы :) Но я думаю вы меня простите :) 
Для 8 часов опыта работы с языком это нормально :)

Пошел немного в обход.
Сделал новый проект на базу maven по видео здесь

https://vimeo.com/107647158

Заставил тесты работать в Intelij IDEA, поправил структуру проекта, чтобы уже не основываться на примере для Salesforce отсюда https://github.com/selenide-examples/salesforce

После того как тесты заработали добавил из примера для Salesforce настройки для ant + ivy(поменял пути к исходникам).

Работает!

Самое приятное - что теперь можно отлаживать тесты с помощью встроенного в Idea дебагера - видны все переменные в тестах. НО что еще круче всего - это то что браузер на брейпоинте тоже замирает и можно открыв по F12 консоль работать со страницей через JS (опять же проконтролировать что там да как с DOM и JS)

Гуд!
Хотя я так и не понял, почему в первом случае не работало.

Гуд!
Хотя я так и не понял, почему в первом случае не работало.

Андрей, привет.

Вопрос. Перестали работать тесты причем на самом простом участке.
Не могу понять что за проблема. Единственное что меня за промежуток от того момента пока работало и перестало работать - поменял java c 8 версии на 7, но не хочется думать что в этом причина.

Вот лог ошибки

На скриншоте, что делает selenide четко видна ссылка с текстом по которому я ищу.
из лога достал Xpath по которому выполняется поиск и по нему элемент находится успешно

.//*/text()[normalize-space(.) = "Price Manager"]/parent::*

Что можно еще проверить? Куда посмотреть? Идеи закончились.

Андрей, привет.

Вопрос. Перестали работать тесты причем на самом простом участке.
Не могу понять что за проблема. Единственное что меня за промежуток от того момента пока работало и перестало работать - поменял java c 8 версии на 7, но не хочется думать что в этом причина.

Вот лог ошибки

[img]/pics/85/original_2015-08-18_15-24-13.png[/img]

На скриншоте, что делает selenide четко видна ссылка с текстом по которому я ищу.
из лога достал Xpath по которому выполняется поиск и по нему элемент находится успешно

.//*/text()[normalize-space(.) = "Price Manager"]/parent::*

Что можно еще проверить? Куда посмотреть? Идеи закончились.

По ходу разобрался в чем дело.
Увеличил таймаут до 16 сек и заработало. Странно конечно, но даже до 8 сек увеличение не помогло, хотя чисто субъективно, не было заметно чтобы тесты ждали эти 8 секунд после открытия страницы - тупо сразу после перехода вылетала ошибка.

По ходу разобрался в чем дело.
Увеличил таймаут до 16 сек и заработало. Странно конечно, но даже до 8 сек увеличение не помогло, хотя чисто субъективно, не было заметно чтобы тесты ждали эти 8 секунд после открытия страницы - тупо сразу после перехода вылетала ошибка.

Кому интересно и кто отважился вступить в мир тестирования UI
вот еще дополнительный материал для изучения.
http://habrahabr.ru/post/274071/

Кому интересно и кто отважился вступить в мир тестирования UI 
вот еще дополнительный материал для изучения. 
http://habrahabr.ru/post/274071/