Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static WebElement $(By elementsLocator, String text) {
- return assertThat(elementHasText(elementsLocator, text));
- }
- /*
- ну, если не знать задачки - догадаться будет не просто)
- что за метод
- что он принимает и как работает
- если уже такое реализовывать (я например - не уверена - что стоит)
- то вот так
- реализуем самый универсальный вариант
- public static WebElement $(ExpectedCondition<WebElement> conditionToWaitElement)
- который будет возвращать assertThat(conditionToWaitElement);
- в методе - public static WebElement $(By locator)
- уже используем ранее реализованный универсальный - $(visibilityOfElementLocated(locator));
- реализацию public static WebElement $(String cssSelector) - оставила бы как у тебя
- я бы на этом и остановилась)
- и там где нужно элемент получить по его тексту - вот так бы получала - $(elementHasText(tasks, "task1"));
- оно конечно - чуть длиннее чем $(tasks, "task1");
- но как-то попонятнее)
- и думать не нужно - как в методе параметры назвать )
- а если таки идти дальше, как ты пошел
- то изменить имена параметров - WebElement $(By elementsLocator, String elementText)
- будет чуть попонятнее
- а если учесть - что еще и вариант получения таски по ее классу нужен, и мы про текст - метод реализовали
- то почему бы и для такого варианта метод не реализовать - WebElement $(By elementsLocator, String elementCssClass)
- мне эти последние 2 метода кажутся слишком сложными
- я бы все равно заглядывала - как они реализованы
- так что - я б их не реализовывала
- настаивать не буду - чтоб и ты придерживался тех же взглядов
- оставишь - подравняй имена методов
- */
- *******************************************************
- public static WebElement $(By parentLocator, String text, By innerLocator) {
- return assertThat(waitParentElement(parentLocator, text, innerLocator));
- }
- /*
- сходу и не разберешься)
- как метод работает и чего он дожидается )
- */
- *********************************************
- public static ExpectedCondition<WebElement> waitParentElement(
- final By parentLocator
- , final String text
- , final By innerLocator) {
- ....
- if (parentElement.findElement(innerLocator) != null && parentElement.getText().equals(text)) {
- return parentElement.findElement(innerLocator);
- /*
- т е - по сути - что мы делаем
- ищем родительский элемент с таким-то текстом
- а когда нашли - получем его внутренний элемент по локатору
- так у нас уже все есть)
- кондишен elementHasText - найдет элемент
- а дальше - уточнимся
- т е - вот такой код - $(elementHasText(tasks, "task1")).findElement(...);
- а в самом задании было предложено - реализовать методы
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
- которые по сути - реализованы как $(conditionToWaitParentElement).findElement(...);
- т е - работаем так
- дожидаемся чего-то там для родительского элемента
- а затем - получаем внутренний элемент
- тут мы рассчитываем - что если наш элемент догрузился
- то уже его внутренний элемент - тоже
- допускаю - что так не всегда бывает
- в данном нашем случае - для todoMVC - это так
- а далее на курсе - мы и покрасивее версию реализуем
- и уйдем от не красивого)
- но это еще не скоро)
- резюме
- такой кондишен тебе не нужен
- а вот методы
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
- и
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
- нужны
- будешь потом их использовать в стиле $(elementHasText(tasks, "task1"), ".toggle")
- */
- // TODO: 26.01.2017 override toString()
- /*
- ага)
- если что-то не можешь назвать или описать - задумайся)
- часто бывает - что такого рода объект и не нужен
- либо вместо него нужно несколько разных, илбо еще что-то)
- следствие Single Responsibility Principle
- если он для класса не выполняется - будут такого рода затруднения)
- */
- ************************************************
- public static ExpectedCondition<WebElement> elementHasText(
- final By elementsLocator
- , final String expectedText) {
- ...
- public String toString() {
- return String.format("\nText of elements,"
- + "\nfound with elementsLocator - %s"
- + "\nShould be: %s"
- + "\nActual: text not found\n"
- , elementsLocator.toString()
- , expectedText);
- }
- /*
- реализация apply - да, все ок будет работать
- но вот сообщение в toString() - буду критиковать
- toString() - просто описание объекта
- неважно в какой момент
- указывая в выражении - Actual: text not found
- ты опираешься на свои зания, что toString() кондишена вызывается именно при падении проверки
- т е - реализуешь toString() - как зависимое от контекста вызова выражение
- избегай таких решений
- в toString() - просто опиши
- что проверяли
- для чего проверяли
- что ждали
- что оказалось в реальности
- как видишь - никаких выводов - что нашли/чего не нашли
- только рассказ про объект
- эта схема должна применяться для любого кондишена
- в данном случае - про реальность если рассказывать - то надо бы рассказать о текстах всех элементов
- */
- **********************************************************************
- public static ExpectedCondition<List<WebElement>> visibleTextOf(
- final By locator
- , final String... texts) {
- /*
- читаем имя кондишена = видимый текст (один) того-то
- а на самом деле - мы проверяем текстЫ видимых того-то = textsOfVisible(...
- или - точнее - exactTextsOfVisible (ну, у тебя реализован вариант textsOfVisible,
- хотя для текущей задачи уместнее біло реализовать exactTextsOfVisible
- имена параметров - тоже мало помогают
- By elementsLocator - было бы информативнее - так бы мы видели - что работаем с элементами(списком)
- форматирование - не стандартное, реформатируй код
- */
- return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
- private List<String> actualTexts = new ArrayList<String>();
- private List<WebElement> elements;
- public List<WebElement> apply(WebDriver driver) {
- actualTexts.clear();
- elements = driver.findElements(locator);
- for (WebElement element : elements) {
- if (!element.getText().equals("")) { // костылёк :) - наш локатор почему-то
- // при одной таске выгребает еще 2-ю пустую стрингу :(
- actualTexts.add(element.getText());
- }
- }
- /*
- реши задачу в 2 приема)
- сначала - получи список видимых элементов
- чтобы узнать - видим элемент или нет - проверяй - element.isDisplayed()
- element.getText() для невидимого элемента возвращает пусто
- https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/6415
- почитай обсуждение - в общем - это логично)
- какая разница, какой текст у не видимого элемента)
- его же не видно, он может быть вообще любым и никто разницы не оценит)
- потом - для списка видимых элементов получи их тексты
- т к получение текстов по списку веб-элементов - задача, которая нужна в нескольких кондишенах
- то вынеси этот метод в класс универсальных статических методов List<String> getTexts(List<WebElement> elements)
- и используй его
- решение задачи в 2 шага - позволит тебе переиспользовать
- и получение видимых элементов по списку вебэлементов
- и получение текстов элементов по списку вебэлементов
- */
- ************************************************************
- public static ExpectedCondition<List<WebElement>> sizeOfVisible(final By locator) {
- return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
- public List<WebElement> apply(WebDriver driver) {
- List<WebElement> elements = driver.findElements(locator);
- List<WebElement> visibleElements = new ArrayList<>();
- for (WebElement element : elements) {
- if (element.isDisplayed()) {
- visibleElements.add(element);
- }
- }
- return visibleElements;
- }
- });
- // TODO: 26.01.2017 override toString()
- }
- /*
- ну ок - собираешь список видимых элементов - это ок
- так а размер проверить?
- сейчас - вообще не важно какой размер у списка
- вернем его да и все
- а у кондишена цель = обедиться, что размер списка = ....
- только тут мы должны оперировать
- не всем списком элементов, найденных по локатору
- а лишь теми, которые видимы
- посмотри на ранее реализованный sizeOf
- и на toString() его - тоже посмотри
- */
- *********************************
- JavascriptExecutor js = (JavascriptExecutor) getDriver();
- ...
- js.executeScript("location.reload()");
- /*
- реализуй в ConciseAPI - метод executeJavaScript
- будешь в качестве параметра - передавать текст команды
- */
- ****************************************
- Actions ac = new Actions(getDriver());
- ac.moveToElement(focusOnDeletedTask).perform();
- /*
- реализуй в ConciseAPI методы
- actions()
- WebElement hover(WebElement element)
- метод будет выполнять действие над элементом
- и возвращать тот же элемент
- чтоб потом можно было такое писать hover($(...)).findElement(...)....
- doubleClick() - похоже релизуй
- */
- ******************************
- public void assertNoVisibleTasks() {
- assert assertThat(sizeOfVisible(tasks)).size() == 0;
- }
- /*
- вот это - если и работает
- то только благодаря быстрой загрузке приложения
- а общем случае - не должно)
- sizeOfVisible сейчас реализован так
- что уже после первого выполнения apply - ждущая проверка закончится
- после корректировки sizeOfVisible -
- тут код будет проще
- assertThat(sizeOfVisible(tasks), 0)
- ассерт проверять ассертом - не, так не надо)
- */
- ******************************************************
- public void assertItemsLeft(int itemsLeft) {
- assertThat(elementHasText(By.cssSelector("#todo-count>strong"), Integer.toString(itemsLeft)));
- }
- /*
- ну, оно может и работает)
- но на самом деле - тут такого не надо)
- нам не надо по селектору "#todo-count>strong"
- искать СПИСОК вебэлементов
- и выбирать среди них такой у которого текст = ...
- нам просто - нужно получить элемент по локатору и проверить его текст
- посмотри в сторону стандартных кондишенов)
- https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
- */
- ********************************************
- ublic WebElement startEdit(String oldTaskName, String newTaskName) {
- WebElement focusOnEditTask = $(tasks, oldTaskName);
- Actions ac = new Actions(getDriver());
- ac.doubleClick(focusOnEditTask)
- .sendKeys(Keys.chord(Keys.CONTROL, "a") + Keys.DELETE)
- .sendKeys(newTaskName).perform();
- return focusOnEditTask;
- }
- /*
- сложно)
- и не факт что работает
- посмотри - на селенидовскую версию этого метода
- сначала - мы даблкликали на таске с таким-то текстом
- потом - мы таску искали по классу editing
- и у нее - получали внутренний элемент ".edit"
- в котором - вводили текст
- про doubleClick - выше писала - реализуй метод
- аналогично тому, как ты с помощью кондишена elementHasText
- получаешь таску с таким-то текстом
- реализуй и примени кондишен elementHasCssClass
- и получи таску с таким-то классом
- по setValue - это последовательный вызов методов для веб-элемента
- clear
- sendKeys
- setValue - реализуй в ConciseAPI
- */
Advertisement
Add Comment
Please, Sign In to add comment