Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static ExpectedCondition<List<WebElement>> listNthElementHasText(final By elementsLocator, final int index, final String text) {
- if (text.isEmpty() || index < 0) {
- throw new IllegalArgumentException("Expected text shoul be not empty \nIndex should be >= 0");
- }
- /*
- should
- поправь слово
- */
- ***************************************
- //сравни форматирование
- public static ExpectedCondition<List<WebElement>> exactTextsOf(final By elementsLocator, final String... texts) {
- if (texts.length == 0) {
- throw new IllegalArgumentException("Array of expected texts is empty.");
- }
- return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
- List<String> actualTexts;
- public List<WebElement> apply(WebDriver driver) {
- List<WebElement> elements = driver.findElements(elementsLocator);
- actualTexts = getTexts(elements);
- if (actualTexts.size() != texts.length) {
- return null;
- }
- for (int i = 0; i < texts.length; i++) {
- if (!actualTexts.get(i).equals(texts[i])) {
- return null;
- }
- }
- return elements;
- }
- public String toString() {
- return "texts of list located" + elementsLocator + "\n should equals : " + Arrays.toString(texts) + "\n actual texts are " + actualTexts;
- }
- });
- }
- // и вот так
- public static ExpectedCondition<List<WebElement>> exactTextsOf(final By elementsLocator, final String... texts) {
- if (texts.length == 0) {
- throw new IllegalArgumentException("Array of expected texts is empty.");
- }
- return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
- List<String> actualTexts;
- public List<WebElement> apply(WebDriver driver) {
- List<WebElement> elements = driver.findElements(elementsLocator);
- actualTexts = getTexts(elements);
- if (actualTexts.size() != texts.length) {
- return null;
- }
- for (int i = 0; i < texts.length; i++) {
- if (!actualTexts.get(i).equals(texts[i])) {
- return null;
- }
- }
- return elements;
- }
- public String toString() {
- return "texts of list located" + elementsLocator + "\n should equals : " + Arrays.toString(texts) + "\n actual texts are " + actualTexts;
- }
- });
- }
- //пропуски строк - тоже могут помогать или мешать воспринимать код
- //используй их )
- //каждый блок = своя законченная мысль
- //блоки - разделяй пропусками строк, а внутри блока - не делай их
- //примени этот подход ко всему своему коду
- //пропускать более одной строки - смысла нету
- ********************************************************************************************************
- //у кондишена elementWithCssClass - код рабочий, но имеет ряд недостатков, которые делают код неоптимальным
- //ошибки в коде есть, но они не приведут к неверной работе, к неэффективной - приведут
- //сравни apply - реализованный и который я предлагаю
- //реализованный сейчас
- public WebElement apply(WebDriver driver) {
- List<WebElement> elements = driver.findElements(elementsLocator);
- for (WebElement element : elements) {
- actualClasses.add(element.getAttribute("class"));
- for (int i = 0; i < actualClasses.size(); i++) {
- String actualClass = actualClasses.get(i);
- String[] actualCssClasses = actualClass.split("\\s");
- for (int j = 0; j < actualCssClasses.length; j++) {
- if (cssClass.equals(actualCssClasses[j])) {
- return elements.get(i);
- }
- }
- }
- return null;
- }
- return null;
- }
- //и вот такой вариант
- public static ExpectedCondition<WebElement> elementWithCssClass(final By elementsLocator, final String cssClass) {
- return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
- List<String> actualClasses;
- public WebElement apply(WebDriver driver) {
- List<WebElement> elements = driver.findElements(elementsLocator);
- for (WebElement element : elements) {
- actualClasses.add(element.getAttribute("class"));
- }
- for (int i = 0; i < actualClasses.size(); i++) {
- String actualClass = actualClasses.get(i);
- String[] actualCssClasses = actualClass.split("\\s");
- for (int j = 0; j < actualCssClasses.length; j++) {
- if (cssClass.equals(actualCssClasses[j])) {
- return elements.get(i);
- }
- }
- }
- return null;
- }
- public String toString() {
- return String.format("\nList of elements located:", elementsLocator, "%s\n should contain element with css class: %s\n", cssClass, "while actual classes are", actualClasses);
- }
- });
- }
- //сначала - собрали actualClasses
- //потом - их обходим
- //а сейчас - на каждом шаге сборки actualClasses - мы их все обходим
- //подумай сколько обходов будет, если нужный нам элемент - например пятый в списке
- **************************************************************************************************
- public class ToDoMvcPage {
- static By tasks = byCss("#todo-list>li");
- public static void clearCompleted() {
- /*
- вспомни первую работу на курсе по пейджам-модулям
- там мы для пейджей-модулей - не использовали Page в имени класса пейджа
- Пейджи-модули и их нейминг
- Пейдж-модули удобно называть без слова Page в конце
- потому что если ты будешь использовать несколько пейдж-модулей в одном тесте
- то желательно обращаться к их методам через имя класса пейдж-модуля
- чтобы видеть где с каким пейджом идет работа
- и когда ты будешь писать
- TodoMVCPage.givenAtAll()
- то это явно не так прикольно как
- TodoMVC.givenAtAll()
- правда?
- (так обращаться - важно, когда есть несколько пейджей,
- а если он один - то можно без ущерба для точности -
- заимпортить статически все методы и при вызове - не указывать им класса пейдж-модуля)
- вот это Page в конце - это дань общим conventions (или общепринятым предпочтениям)
- при именовании классов в мире ООП
- ми же тут юзаем подход "Модульного Программирования", потому тут этого "лишнего слова"
- не нужно
- А то, что это все же пейдж - скажет нам имя пекеджа - pages
- */
- *******************************************
- static By tasks = byCss("#todo-list>li");
- public static void clearCompleted() {
- $(byCss("#clear-completed")).click();
- }
- public static By addTask = By.cssSelector("#new-todo");
- /*
- технически - порядок методов и полей в классе - может быть любым
- но проще работать с кодом - когда поля - объявлены рядом
- */
- ***********************************
- $(byCss("#toggle-all"))
- /*
- можно реализовать метод $, принимающий в качестве параметра css селектор
- тогда тут код упростится до $("#toggle-all")
- */
- ******************************************
- public static void delete(String taskText) {
- hover($(elementWithText(tasks, taskText)));
- $(byCss(".destroy")).click();
- }
- /*
- нам нужна не первая попавшаяся кнопка .destroy
- а кнопка у таски с таким-то текстом
- мы это уже обсуждали)
- в методе toggle - ты реализовал верно
- */
- **********************************************
- public static void toggle(String taskText) {
- $(elementWithText(tasks, taskText)).findElement(byCss(".toggle")).click();
- }
- /*
- а в тексте самого задания - предлагалось организовать методы
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
- и
- $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
- чтобы вместо
- $(elementWithText(tasks, taskText)).findElement(byCss(".toggle"))
- использовать
- $(elementWithText(tasks, taskText), ".toggle")
- по сути - в таком методе $
- мы именно это и будем делать - что ты реализовал
- сначала - получим родительский элемент - через использование переданного кондишена в ожидании
- затем - у родительского элемента получим его подчиненный элемент и его вернем
- т к такой код будет нужен несколько раз - разумно реализовать и использовать такие методы
- */
- ***************************************************************
- public static WebElement startEdit(String oldTaskText, String newTaskText) {
- doubleClick($(elementWithText(tasks, oldTaskText)));
- //к даблклику - вопросов нет
- $(elementWithCssClass(tasks, "editing"));
- //мы получили редактируемую таску, но ничего с ней не сделали, просто получили
- setValue($(byCss("edit")), newTaskText);
- //а тут - работаем с первым найденным элементом $(byCss("edit")
- //кстати - посмотри на селенидовский код
- //какой мы селектор использовали для элемента
- //ты ошибся в селекторе тоже
- //получи такой элемент - у таски в режиме редактирования
- //и именно его и нужно будет вернуть
- //опять отсылаю к селенидовскому коду
- return $(elementWithText(tasks, "editing"));
- }
- ************************************************************
- public static void assertVisibleTasksEmpty(int expectedSize) {
- assertThat(sizeOfVisible(tasks, expectedSize));
- }
- /*
- я могу вызвать так проверку - assertVisibleTasksEmpty(5)
- как тебе?
- мне кажется - этот метод надо вот так вызывать - assertVisibleTasksEmpty()
- ведь пусто = размер равен нулю и только нулю, тут нет вариантов)
- */
- ******************************
- public void clearData() {
- ((JavascriptExecutor)getDriver()).executeScript("localStorage.clear()");
- }
- /*
- Реализуй в ConciseAPI - метод executeJavaScript
- чтоб ему в качестве значения параметра - передали строку - JavaScript команду
- а тут метод - будешь использовать
- */
- ******************************************
- private JavascriptExecutor js;
- /*
- зачем такая переменная?
- */
- ***********************
- @Before
- public void setTimeout() {
- Configuration.timeout = 30;
- }
- /*
- вроде для todoMvc - хватало 4 секундного таймаута)
- зачем такой большой?
- и еще - согласно задания - нужно было использовать версию задания Smoke: E2E + F (там где был е2е и несколько фиче-тестов
- это критично подправить
- */
- **************************************
- public static WebElement $(By elementLocator) {
- return assertThat(visibilityOfElementLocated(elementLocator));
- }
- public static WebElement $(ExpectedCondition<WebElement> conditionToWaitElement) {
- return assertThat(conditionToWaitElement);
- }
- /*
- теперь в методе $(By elementLocator)
- можно использовать вызов $(ExpectedCondition<WebElement> conditionToWaitElement)
- return $(visibilityOfElementLocated(elementLocator));
- */
- ***************************************
- public static void setValue(WebElement element, String task) {
- Actions actions = new Actions(getDriver());
- element.clear();
- element.sendKeys(task);
- }
- /*
- зачем тут Actions actions = new Actions(getDriver());?
- */
- *********************************
- public static void hover(WebElement element) {
- Actions action = new Actions(getDriver());
- action.moveToElement(element).perform();
- }
- /*
- все же корректнее - не action, а actions
- мы же создаем объект типа Actions
- кстати, можно реализовать метод actions()
- и его переиспользовать
- */
Advertisement
Add Comment
Please, Sign In to add comment