Почему мой код генерирует разные результаты - PullRequest
0 голосов
/ 09 ноября 2019

Я изучаю автоматизацию с помощью Selenium (используя язык программирования Java) и работаю над тестовым примером. Последний шаг в моем случае включает проверку наличия кнопки на странице с помощью findElement.By.xpath, и у меня есть две версии этого шага. С любой версией весь мой тестовый пример проходит. Однако каждая из двух версий генерирует разные результаты. Если я использую первую версию с int, я получаю результат «Написать отзыв кнопка» не существует ». Если я использую вторую версию с логическим значением, я получаю «Кнопка« Написать отзыв »существует!»Поскольку тестовый пример пройден, и со второй версией, генерирующей результат «кнопка существует», проблема не может быть с xpath, поэтому проблема со второй версией, получающей неправильный результат, должна быть в логике, но я не могу сказать, что этоявляется.

Я несколько раз пытался перезапустить кейс, чтобы проверить, не в этом ли проблема, но результат тот же. Я пытался найти подобные проблемы в Интернете, но не могу найти ничего, что бы точно показало, как моя проблема не так.

int i = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size();
if (i > 0)  { System.out.println("'Write review button' exists!"); }
else        { System.out.println("'Write review button' does not exist :( ");

}

boolean reviewButtonPresent = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size() > 0;
if (reviewButtonPresent = true) { System.out.println("'Write review button' exists!"); }
else { System.out.println("'Write review button' does not exist :( "); }

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Есть некоторые различия между двумя блоками кода.


Очевидно, что ваш первый кодовый блок логически корректен, а именно:

  • Код:

    int i = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size();
    if (i > 0)  
        System.out.println("'Write review button' exists!"); 
    else
        System.out.println("'Write review button' does not exist :( ");
    
  • Вывод:

    Write review button' does not exist
    

Но это не идеально, что я объясню позже в этомобсуждение.


Ваш второй кодовый блок является битом обманчивым , так как он содержит два логических оператора в одной строке, и вы оставили его компилятору для выбора оператора Приоритет , который является явным отклонением от лучших практик. Возможно, вам повезло, поскольку > имел больший приоритет, чем =, как в:

boolean reviewButtonPresent = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size() > 0;

Решение

В идеалевам нужно:

  • Индуцировать WebDriverWait для visibilityOfAllElementsLocatedBy().
  • Вычислить size() через if()
  • Пример кода:

    if (new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@class='comments_advices']"))).size()>0) 
        System.out.println("'Write review button' exists!"); 
    else 
        System.out.println("'Write review button' does not exist :( ");
    

Outro

Operator Precedence:

Операторы в следующей таблице перечислены в порядке их приоритета. Чем ближе к вершине таблицы появляется оператор, тем выше его приоритет. Операторы с более высоким приоритетом оцениваются перед операторами с относительно более низким приоритетом. Операторы в одной строке имеют одинаковый приоритет. Когда операторы одинакового приоритета появляются в одном и том же выражении, правило должно определять, которое оценивается первым. Все бинарные операторы, кроме операторов присваивания, оцениваются слева направо;операторы присваивания оцениваются справа налево.

OperatorPrecedence

0 голосов
/ 09 ноября 2019

Два экземпляра кода, которые у вас есть, по сути одинаковы, и я не вижу причин, по которым они будут работать по-разному. Я думаю, что это проблема времени. Чтобы заставить его вести себя более последовательно, я бы добавил ожидание появления кнопки обзора. Поскольку кнопка может отсутствовать время от времени, она выдаст исключение тайм-аута, поэтому вам нужно будет отловить это, чтобы иметь чистый проход / неудачу для каждого запуска. Чтобы сделать это, я бы использовал приведенную ниже функцию, которая возвращает логическое значение в зависимости от того, существует элемент или нет после ожидания.

public static boolean elementExists(By locator, int timeout)
{
    try
    {
        new WebDriverWait(driver, timeout).until(ExpectedConditions.presenceOfElementLocated(locator));

        return true;
    } catch (Exception e)
    {
        return false;
    }
}

Приведенный выше метод проверяет наличие элемента, что означаетэто существует в DOM? Если вы хотите убедиться, что он действительно виден (а не только присутствует), вы можете изменить .presenceOfElementLocated() на .visibilityOfElementLocated().

Поскольку вы новичок в Selenium, я бы также порекомендовал вам использоватьобщая библиотека для выполнения ваших проверок, таких как JUnit или TestNG. Это избавит вас от необходимости писать свой собственный код для валидации и проходить процесс поиска ошибок в вашем собственном коде. Используя JUnit, вы должны использовать

Assert.assertTrue("Verify the review button exists", elementExists(By.xpath("//ul[@class='comments_advices']"), 10));

См. Документы JUnit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...