Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ToDoMVCTest
- /*
- Я бы все равно вынесла в пейдж-модуль все вспомогательное)
- это мелочь)
- по заданию этого не требовалось, но код от этого выиграл бы
- можешь это уже в конце выполнить
- */
- *******************************************
- @After
- public void clearData() {
- JavascriptExecutor js = (JavascriptExecutor)getDriver();
- js.executeScript("localStorage.clear()");
- }
- /*
- реализуй в ConciseAPI - метод executeJavaScript
- а тут его просто используй
- */
- ****************************************
- public static ExpectedCondition<WebElement> listElementWithText(List<WebElement> elements, String text) {//<-----------------1
- return new ExpectedCondition<WebElement>() {
- WebElement element;
- @Override
- public WebElement apply(WebDriver driver) {
- for (WebElement e : elements) {
- if (e.getText().equals(text)) {
- element = e;
- }
- }
- if (element == null) {//<-------------------2
- throw new NullPointerException();
- }
- return element;
- }
- };
- }
- /*
- 1
- почему этот кондишен реализовал с первым параметром - List<WebElement> elements?
- вспомни - для каких списков вебэлементов можно применять ждущие проверки кондишенов?
- почему мы в предыдущем задании кондишены реализовывали с параметром By locator ?
- как мы смогли отказаться от использования пейджей-модулей, которые создавали через PageFactory.initElements?
- 2
- Не ясно, для чего тебе вызывать NullPointerException)
- вспомни, что должен вернуть кондишен типа ExpectedCondition<WebElement>
- если проверка не прошла?
- а что должен вернуть - если проверка прошла?
- тут вызывать эксепшены ни к чему
- почитай вот это http://stackoverflow.com/questions/4715492/best-practise-in-catching-and-throwing-nullpointerexception
- чтоб просто разобраться
- чуть далее эту тему будем глубже разбирать
- пока просто чуть почитай)
- не страшно - если пока вопросы останутся
- и в принципе по алгоритму в apply
- мы в рамках прошлого задания достаточно долго равняли кондишен textsOf(By locator, String... texts)
- сначала в apply - собирали тексты всех элементов
- затем - работали именно с ними
- а в toString - выводили информацию о фактических текстах списка и ожидаемых текстах
- тут - задача очень похожа
- нужно этот кондишен привести в порядок)
- */
- *******************************************
- еще по кондишенам
- http://joxi.ru/82QYoQyI1GQOM2
- у тебя таких проблем нет?
- если есть - так объяви параметры метода как final
- если нет, то уточни - какую версию java SDK используешь
- https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
- раздел Accessing Local Variables of the Enclosing Scope, and Declaring and Accessing Members of the Anonymous Class
- http://blog.brendanlacanette.com/2015/08/variable-is-accessed-within-inner-class.html
- ******************************************
- private void toggle(String taskText) {
- $(findTaskByText(taskText), ".toggle").click();
- }
- private ExpectedCondition<WebElement> findTaskByText(String taskName) {
- return listElementWithText(tasks(), taskName);
- }
- /*
- а для чего тебе метод findTaskByText?
- сравни
- $(findTaskByText(taskText), ".toggle").click();
- и
- $(listNthElementHasText(tasks, taskText), ".toggle").click();
- где tasks = By.cssSelector("#todo-list>li");
- это как раз пример - когда не стоило реализовывать метод
- без него - код проще
- с ним - нет выигрыша
- лишь дольше придется разбирать - что на чем стояло )
- сам кондишен listElementWithText - как писала выше - требует доработки
- */
- ******************************************
- public static ExpectedCondition<List<WebElement>> conditionToWaitElements(By locator) {
- ...
- public static List<WebElement> $$(String cssSelector) {
- return assertThat(conditionToWaitElements(By.cssSelector(cssSelector)));
- }
- /*
- такой кондишен conditionToWaitElements тебе не нужен точно)
- еще раз посмотри на вот этот кусочек задания
- http://joxi.ru/BA0p30gsBjyy6A
- там даны подсказки - как реализовать метод и какие у него должны быть параметры
- что до самой реализации conditionToWaitElements
- чтобы условие кондишена было успешно віполнено - достаточно чтобы список элементов был не пуст
- но - это совершенно не значит - что так мы обеспечим надежное ожидание момента - что список догрузился...
- это уже так... по пути )
- тебе не нужен такой кондишен)
- а кроме того - в этом задании тебе не нужен он вообще)
- так что пока можно вообще этот метод не реализовывать - чтоб он тебя не смущал )
- */
- **********************************************************
- public static ExpectedCondition<List<WebElement>> textsOf(By locator, String... texts) {
- http://joxi.ru/5md7jYwtvBj8Vr
- /*
- для реализации assertVisibleTasks - нужен кондишен, аналогичный textsOf, но который работает только с видимыми элементами списка
- как реализуешь и убедишься в работоспособности - сразу вернись к коду и подумай - как можно было бы сделать код более DRY
- */
- **********************************************************
- public static ExpectedCondition<Boolean> empty(List<WebElement> list) {
- return new ExpectedCondition<Boolean>() {
- @Override
- public Boolean apply(WebDriver driver) {
- for (WebElement e : list) {
- if (e.isDisplayed()) {
- return false;
- }
- }
- return true;
- }
- };
- }
- /*
- тоже самое - про параметр List<WebElement> list
- кроме того - название кондишена и его реализация - вообще о разном
- в реализации - работаешь с видимыми элементами
- а в имени кондишена - это не уточняешь
- ты ранее уже реализовывал кондишен sizeOf
- https://bitbucket.org/markony647/sditpart
- перенеси его сюда
- доработай - чтобы кондишен этот был не ExpectedCondition<Boolean>
- а ExpectedCondition<List<WebElement>>
- так будет точно универсальнее
- а затем реализуй в рамках CustomConditions - статический метод ExpectedCondition<List<WebElement>> empty()
- в котором переиспользуй ранее реализованный sizeOf
- что-то такого плана
- public static ExpectedCondition<List<WebElement>> empty(final By elementsLocator) {
- return sizeOf(elementsLocator, 0);
- }
- это раз
- далее - тебе нужна такая же пара, но которая оперирует не всеми элементами списка
- а только видимыми элементами
- для этого реализуй sizeOfVisible и метод listOfVisibleIsEmpty
- а чтобы была одна логика в именах - лучше переименовать empty() в listIsEmpty
- так ты сможешь реализовать
- assertNoTasks() & assertNoVisibleTasks()
- */
- **********************************************************
- public WebElement hover(WebElement element) {
- /*
- метод вынеси в ConciseAPI - он универсальный
- */
- ******************************************************
- Выложил пока что костыльный вариант, он пока что:
- - неполный (только енд ту енд часть);
- /*
- в связи с реализацией остального - возникнут новые потребности
- например вот это
- tasks.find(cssClass("editing")).find(".edit").setValue(newTaskText)
- тебе понадобится кондишен listElementWithCssClass
- который в случае успешной проверки вернет элемент списка с ожидаемым классом
- и тебе понадобится метод setValue
- фактически - мы с помошью такого кондишена и метода
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
- реализуем вот это tasks.find(cssClass("editing")).find(".edit")
- а для реализации tasks.find(exactText(oldTaskText)).doubleClick(); - понадобится метод doubleClick
- */
- - черновой вариант, который нужно рефакторить (имена методов/ добавить сообщения об ошибках/ добавить перехватчик ошибок и пр);
- /*
- да, тут нужно будет поработать)
- не держи в тест-классе вспомогательных методов
- универсальное - в ConciseAPI
- вспомогательное для тестирования именно этого приложения - в пейдж
- */
- - есть костыльные моменты типа вызова tasks(), в некторых случаях и он не прокатывает, поэтому использую driver.findElements() ;
- /*
- и tasks(), и driver.findElements() - тебе категорически не нужны
- ты не учел кое-что очень важное )
- выше я намекала тебе на это
- если не догадаешься - приходи в слек, обсудим)
- */
- Детальное ревью в данном случае не нужно.
- Просто хочу понимать в верном ли направлении двигаюсь или концептуально все нужно переделывать :)
- /*
- Собственно, многие проблемы именно из-за того, что ты не учел это кое-что важное)
- */
Advertisement
Add Comment
Please, Sign In to add comment