Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static WebElement setValue(WebElement element,String specifiedCss, String value) {
- element.findElement(byCss(specifiedCss)).clear();
- element.findElement(byCss(specifiedCss)).sendKeys(value);
- return element;
- }
- /*
- нам не надо такого умного)
- мухи - отдельно, котлеты - отдельно
- по крайней мере тогда, когда это в наших силах)
- да, у нас есть задача - получить внутренний элемент, дождавшись выполнения кондишена для внешнего элемента
- и это мы решаем в методе $
- тут - мы реализуем ввод нового значения для конкретного вебэлемента
- очистили поле
- и ввели новое значение
- все)
- вот эти кусочки - findElement(byCss(specifiedCss))
- и этот параметр - specifiedCss
- тут не нужны
- а как будешь вызывать такой метод - укажешь вебэлемент
- не
- setValue(
- $(listElementWithCssClass(tasks, "editing")),
- ".edit",
- newTaskText + Keys.ENTER
- );
- а
- setValue(
- $(listElementWithCssClass(tasks, "editing"), ".edit"),
- newTaskText + Keys.ENTER
- );
- */
- *****************************
- public static ExpectedCondition<WebElement> listElementWithCssClass(final By elementsLocator, final String expectedCss) {
- /*
- что это - expectedCss ?
- это - недостаточно точно
- expectedCssClass - будет точно
- */
- return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
- List<WebElement> actualElements;
- String currentCssClass;
- ....
- public String toString() {
- return String.format("elements ['%s'] should have CSS class ['%s'], while actual classes are ('%s') "
- , actualElements.toArray().toString(), expectedCss, currentCssClass);
- }
- /*
- сначала поговорим про бантики )
- предположи - что это не ты писал кондишен
- ты вообще не понимаешь как он работает
- и тебе надо - по тексту сообщения об ошибке - разобраться
- прежде всего = что мы проверяем
- что какой-то из элементов списка [такого-то = найденного по такому-то локатору = elementsLocator]
- содержит CSS класс [такой-то = expectedCssClass]
- если проверка не прошла - что еще мы захотим узнать?
- помимо описания - что мы проверяем
- нам будет интересно - а что же по факту в списке элементов было
- т е - фактические значения атрибута class - для каждого(!!!) из элементов списка
- эта информация поможет нам понять - почему же мы не нашли - что искали
- теперь разбираем
- про локатор - не сказали
- зато вывели actualElements.toArray().toString()
- ты смотрел - что мы так навыводим?
- будет ли польза от данной информации?
- как смотреть - можно реализовать заведомо падающуюу проверку такого кондишена
- про то, что проверяем - ну... были не точны в формулировке
- сейчас
- elements ['%s'] should have CSS class ['%s']
- надо
- element of list located ['%s'] should have CSS class ['%s']
- мелочь вроде бы, а смысл меняется
- про факт - смотри сам - выводим currentCssClass
- это - данные о последнем проверенном элементе
- сомнительная польза - если в списке было несколько элементов
- ниже - про алгоритм самой проверки
- */
- *************
- public WebElement apply(WebDriver driver) {
- WebElement currentElement;
- actualElements = driver.findElements(elementsLocator);
- for(int i=0; i < actualElements.size(); i++) {
- currentElement = actualElements.get(i);
- currentCssClass = currentElement.getAttribute("class");
- /*
- в первом цикле - обходе списка ведэлементов
- ты можешь получить в список строк - значения атрибута "class"
- для всех элементов списка
- и уже далее - оперировать этим списком - как описанием факта
- обходи полученный список значений атрибута "class"
- когда будешь обходить такой список -
- по индексу получить соответствующий веб элемент ты сможешь
- */
- if(contains(currentCssClass, expectedCss))
- /*
- сомневаюсь - что такой метод contains еще где-то понадобится
- не стоит в данном случае это выносить в универсальный метод
- а если и выносить - то формулировать надо бы поточнее
- isWordContainedInPhrase
- */
- ********************************
- public static boolean contains(String currentString, String expectedCss) {
- ...
- /*
- когда ты объявляешь метод и придумываешь имена методу и его параметрам
- отвлекись от контекста, в котором ты будешь применять такой метод
- сейчас все названия должны точно описывать то, что делает сам метод
- а не как и при каки обстоятельствах он будет использоваться
- и вообще не нужно - чтобы эти имена параметров или метода как-то отражали обстоятельства использования такого метода
- речь про решаемую задачу и ни про что больше
- а мы решаем задачу вот такую
- у нас есть строка - слова, разделенные пробелами = фраза
- у нас есть цель - узнать, встречается ли в фразе искомое слово
- т е решаем задачу - содержится ли слово(word) в фразе (phrase) - isWordContainedInPhrase
- мы не говорим ни про какие css классы в нашем универсальном методе
- а когда мы вызываем метод - вот тут уже мы уточняемся
- передавая значения в качестве параметров
- if (isWordContainedInPhrase(expectedCssClass, currentCssClass)) ...
- если же ты такого рода код не выносишь в универсальый метод - то, конечно,
- используй имена переменных, наиболее точно отражающих контекст
- */
- ***************************************
- public static ExpectedCondition<WebElement> listElementWithExactText(final By elementsLocator, final String expectedText) {
- ...
- public String toString() {
- return String.format("elements of list located ['%s'] should have text ['%s']. " +
- "Actual texts are: ['%s']",elementsLocator, expectedText, Arrays.toString(actualTexts.toArray()));
- }
- /*
- с реализацией - ок
- фразу - подправь
- не elements of list
- а element of list
- нам достаточно - чтобы лишь один из элементов списка имел такой-то текст
- Arrays.toString(actualTexts.toArray())
- да, будет ок
- но - можно проще
- actualTexts.toString()
- или
- String.join(",", actualTexts)
- */
- *****************************************
- public static ExpectedCondition<List<WebElement>> exactTextOf(final By elementsLocator, final String... expectedTexts) {
- return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
- private List<String> elementsTexts;
- public List<WebElement> apply(WebDriver driver) {
- elementsTexts = new ArrayList<>();
- ...
- for (int i = 0; i < innerElements.size(); i++) {
- elementsTexts.add(innerElements.get(i).getText());
- }
- /*
- метод getTexts() используй
- */
- ********************************************
- public static ExpectedCondition<List<WebElement>> exactTextsOfVisible(final By elementsLocator, final String... expectedTexts) {
- ...
- for (int i = 0; i < elementsTexts.size(); i++) {
- if (!elementsTexts.get(i). equals(expectedTexts[i])) {
- return null;
- }
- }
- /*
- Такого рода код используется в 2-ух кондишенах
- можно вынести в метод boolean isContainedInList(String text, List<String> list)
- а терерь посмотри на isWordContainedInPhrase
- не узнаешь похожие черты? )
- подумай как переиспользовать в isWordContainedInPhrase метод isContainedInList
- */
- public String toString() {
- return String.format("elements of list located ['%s'] should have ('%s') visible ('%s') texts, " +
- "while actual visible texts are ('%s')",
- elementsLocator,expectedTexts.length ,elementsTexts.toArray().toString(), Arrays.toString(expectedTexts));
- }
- /*
- тут лучше написать не про видимые тексты, а про видимые элементы
- и точнее, и лаконичнее
- visible elements of list located ['%s']
- should have texts (%s)
- while actual texts are (%s)
- не надо ничего про количество элементов писать - expectedTexts.length
- это бесполезная информация
- в контексте данной проверки
- напоминаю - .toArray().toString() - получишь некрасивую строку
- если пишешь кондишен
- всегда проверяй его
- в ситуации - когда проверка должна пройти
- и в ситуации - когда должна упасть
- прежде всего - это должно происходить (проверка - правильно отрабатывает)
- и сразу же - проверяй выводимую фразу - при падении проверки
- если этого не делать - лучше вообще кондишены не писать
- т к потом - мы считаем - что мы можем кондишен использовать
- и используем) уже не вникая в детали работы кондишена
- можно таких делов наворотить с непроверенными кондишенами - мало не покажется)
- */
- ****************************************
- actualElements = driver.findElements(elementsLocator);
- List<WebElement> currentVisibleElements = getVisibleElements(actualElements);
- /*
- уже или actual или current
- употребляешь синонимы - для обозначения чего-то фактического
- мне больше нравится actual
- то же самое про expected значения
- то используешь expected, то нет
- тоже - лучше бы одинаково
- точнее - использовать expected
- именно в кондишенах
- т к внутри кондишена мы оперируем как actual, так и expected значениями
- хорошо бы видеть это не напрягая мозги - что есть что
- */
- ********************************************
- assertThat(ExpectedConditions.textToBe(todoCount, Integer.toString(count)));
- /*
- заимпорти статически ExpectedConditions.textToBe
- и в коде используй textToBe
- метод assertThat - предполагает - что ему дадут кондишен на вход
- потому - и textToBe - достаточно однозначно
- и потому же - в документации селениде советуют кондишены импортить статически
- */
- ***********************************************
- public static void assertTasks(String... expectedTaskTexts)
- public static void assertVisibleTasks(String... expectedTaskTexts)
- /*
- а вот тут бы - я бы про expected ничего не писала
- внутри метода - нету кода про actual и expected
- потому - можно и не уточняться
- настаивать не буду
- у тебя - то так, то так)
- прими для себя решение)
- */
- ****************************
- public static void assertTasksSizeOf(int size) {
- assertThat(sizeOf(tasks, size));
- }
- public static void assertNoTasks() {
- assertTasksSizeOf(0);
- }
- /*
- я бы не стала реализовывать отдельно - assertTasksSizeOf
- т к - штука не востребованная
- если у тебя есть таски в списке - проверка размера списка - недостаточно точна
- т к чтоб было точно - надо проверять тексты тасок
- а если тасок нет - то вариант assertNoTasks() - вполне OK и максимально KISS
- кстати, название assertTasksSizeOf - странноватое
- с точки зрения английского - фраза некорректно построена
- assertSizeOfTasks / assertSizeOfTaskList / assertTasksSize / assertTaskListSize
- тоже далеко не идеальніе варианты, но лучше
- мы в имени кондишена писали SizeOf в расчете на первый параметр - Of чего = локатор списка элементов
- ну и получали формулировку - размер Of(чего) того-то
- то же самое про assertVisibleTasksSizeOf
- */
Advertisement
Add Comment
Please, Sign In to add comment