Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Снова проблемки с Кондишнами, в пер
- 1.
- public static ExpectedCondition<Boolean> textsOf(final List<WebElement> elements, final String...texts) {
- /*
- давай определимся с целями
- что мы хотим проверить
- что в списке элементов - столько элементов, сколько передано текстов на проверку (это первая часть проверки)
- и что текст элемента списка - соответствует тексту их переданных текстов
- текст нулевого элемента - нулевому переданному тексту
- текст первого элемента - первому переданному тексту
- и т д
- проверять соответствие текстов - будем проверкой на вхождение
- в тексте элемента содержится такой-то текст
- таким образом - наш кондишен - будет проверять
- количество
- порядок
- сами тексты
- что нам нужно выдать в сообщении об ошибке
- что проверяли - тексты
- для какой сущности проверяли - список веб-элементов такой-то
- ожидаемое положение дел - тексты, переданые в кондишен
- фактическое положение дел - тексты самих веб-элементов
- это все - нужно отразить в выражении, возвращаемом toString()
- т е - на момент вызова toString() - у тебя уже должен быть собран сипсок текстов = текксты веб-элементов из списка
- судя по предыдущей реализации этой работы и текущей реализации этих кондишенов - ты оперируешь
- @FindBy-аннотированным списком
- так аннотированные элементы и списки - переискиваются всегда, при обращении к ним
- а у тебя, в методе apply - есть задача - сравнить текущее состояние списка (то, которое есть на момент проверки)
- с ожидаемым
- причем - в случае неуспеха - мочь описать точно - что с чем мы проверяли
- потому - стратегия должна быть следующей
- в apply - сначала - собрать в список текстов - тексты элементов списка
- и затем - сравнивать элементы этого списка с ожидаемыми текстами
- так - мы будем оперировать неким зафиксированным состоянием списка вебэлементов
- и сможем его точно описать в toString
- */
- return new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver webDriver) {
- Iterator var2 = elements.iterator();
- while (var2.hasNext()) {
- /*
- вот такой цикл - да, его можно использовать
- только вот используешь ты его не совсем верно
- почитай - https://www.tutorialspoint.com/java/java_using_iterator.htm
- там есть и описание методов
- и пример использования
- а вообще - можно было бы воспользоваться более простым синтаксисом цикла
- для сбора текстов вебэлемента в список текстов - отлично подойдет вариант
- for(WebElement element:elements)
- для обхода собранного списка текстов и сравнения каждого текста с соответствующим текстом из texts
- for(int i=0; i<texts.length; i++)
- https://www.tutorialspoint.com/javaexamples/method_for.htm
- */
- WebElement elements = (WebElement) var2.next();
- /*
- называть переменную = элемент списка (не элементЫ, а элемент) = elements
- да еще и именем, которое совпадает с именем параметра - однозначный перебор
- тут ок - element
- */
- try {
- String e = elements.getText();
- return Boolean.valueOf(e.equals(texts)); <<<< не работает с equals, так как там содержится еще код,
- отлично работает с методом contains,
- но этот метод срабатывает только для строки и выкидывает ошибку при испольщзозовании varargs
- /*
- давай-ка разберем - что с чем сравниваешь
- ты сравниваешь текст такого-то элемента списка - с переданными текстАМИ
- texts = varargs parameter нашего метода
- считай - texts - это массив (ты с texts можешь работать внутри метода - как с обычным массивом
- http://www.linkex.ru/java/varargs.php
- http://stackoverflow.com/questions/2161912/why-varargs-should-be-the-last-in-method-signature
- http://www.java-tips.org/java-se-tips-100019/24-java-lang/481-using-the-varargs-language-feature.html
- At compile time a vararg is converted to an array.
- сравнивать одну строку с массивом строк - странно
- ну да, и то, и то = объекты
- и технически - да, мы любой объект с любым другим объектом можем сравнить
- вот только что нам это даст
- а метод contains для строки - требует параметра - строки
- чтоб ответить на вопрос - что вот эта строкА-значение параметра, входит ли в нашу строку
- т е - ты в качестве параметра для someString.contains - не можешь использовать texts
- т к это - не строка, а если говорить грубо = массив строк
- и тебе нужно - для текст i-го элемента сравнить с i-ым текстом из texts
- также - обрати внимание на имена переменных
- приемлемо давать однобуквенные имена - лишь переменным-счетчикам цикла
- остальные - должны быть осмысленными
- про логику проверки - читай выше, ее нужно подправить
- */
- } catch (StaleElementReferenceException var3) {
- return null;
- }
- }
- return Boolean.valueOf(false);
- /*
- раз у тебя кондишен - ExpectedCondition<Boolean>
- можно просто вернуть false
- как и выше - не нулл, а false
- boolean без проблем будет автоматом приведен к Boolean
- */
- }
- public String toString() {
- return "text of all elements " + elements;
- }
- /*
- про это тоже писала выше
- */
- };
- }
- *****************************************************************
- 2. Здесь проблема с поиском элемента, вместо темы письма находит текст "me" то есть address from
- public static ExpectedCondition<Boolean> listNthElementHasText(final List<WebElement> elements, final int index, final String texts) {
- /*
- что есть final String texts
- это - ожидаемый текст ( не текстЫ, а текст)
- поправь имя параметра
- по поводу твоего комментария - вместо темы письма находит текст "me" то есть address from
- надо смотреть - и контекст вызова кондишена (для какого списка вебэлементов ты вызываешь проверку
- и надо смотреть - как ты такие выводы делал - т к пока это тоже не ясно, а toString у кондишена - сейчас не информативный
- Если ты используешь для списка мейлов - тот же селектор, что и в аналогичном селенидовском задании
- и передаешь в качестве параметра - именно такой список
- то чтоб ты понимал - текст такого то мейла - это вот такая строка = разделенный переходами на новую строку кусок текста
- в который входит и address from в том числе
- */
- return new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver webDriver) {
- try {
- WebElement element = elements.get(index);
- String e = element.getText();
- /*
- имя переменной e - в данном случае плохой вариант
- используй осмысленное имя
- например - actualText
- */
- return Boolean.valueOf(e.contains(texts));
- /*
- можно просто - return (e.contains(texts));
- читать код с названиями, искаженно описывающими сущности - очень трудно
- это не просто придирки - уделяй внимание тому - что и как ты называешь
- часть проблем уйдет и при разработке
- думаю, ты и сам себя по дороге запутываешь)
- */
- } catch (StaleElementReferenceException var3) {
- /*
- про именование исключений
- посмотри
- https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
- https://en.wikibooks.org/wiki/Java_Programming/Throwing_and_Catching_Exceptions
- традиционно именуют исключения - не var3, а e, ex
- вот тут поподробнее информация - какие имена переменным-исключениям можно выбирать - исходя из причины/цели catch-блока
- https://google.github.io/styleguide/javaguide.html#s6.2-caught-exceptions
- также - тут нужно ловить и IndexOfBoundsException
- такое исключение возможно - при обращении к єлементу списка за его границами
- погугли про него
- */
- ********************
- public String toString() {
- return String.format("\ntext: %s\n of this elements is: %s\n", texts);
- }
- /*
- примени знания, изложенные выше, и для формирования выращения в toString этого кондишена
- */
- };
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment