java.lang.AssertionError при утверждении текста в Safari, но проходит в Chrome и FireFox с использованием Selenium TestNG

У меня есть сценарий TestNG Selenium, который будет работать в Chrome и Firefox, но не работает при запуске в Safari. Я использую Assert для проверки имени, а в Safari его нет. Я все еще нуб, поэтому я не уверен, куда идти дальше. Спасибо за любую помощь

HTML:

<a href="https://xxxxxx/users/show/733981" target="_blank" xpath="1">Jeff Smith</a>

Ошибка сафари:

java.lang.AssertionError: expected [JEFF SMITH] but found [Jeff Smith]

Пробный код:

@Test(priority = 4)
public void VerifyGuest() {
    WebElement guestName = driver.findElement(By.xpath("//a[contains(text(),'Jeff Smith')]"));
    String expectedName = "JEFF SMITH";
    String actualName = guestName.getText();
    Assert.assertEquals(actualName, expectedName);
    System.out.println("Reservation Code Belongs to " + actualName);
}


person Java Noob    schedule 25.01.2019    source источник
comment
Я получаю ту же ошибку в Safari при использовании утверждения для проверки этого имени. ‹div class=tile_l xpath=1 style=outline: оранжевый пунктир 2px !important;› Майк Смит ‹/div›   -  person Java Noob    schedule 25.01.2019
comment
java.lang.AssertionError: ожидал [Майк Смит], но нашел [Майк Смит]   -  person Java Noob    schedule 25.01.2019
comment
В образце, который вы даете в 1-м комментарии, текст выглядит как пробелы Mike Smith , и в этом случае для равных естественно потерпеть неудачу.   -  person Todor Minakov    schedule 25.01.2019


Ответы (2)


По-видимому, в вашем блоке кода нет ошибки, но есть Catch-22 ситуация из-за того, что WebDriver использует собственные возможности браузера XPath< /а>.

Собственные возможности браузера XPath

На высоком уровне WebDriver везде, где это возможно, использует встроенные в браузер возможности XPath. В тех браузерах, в которых нет встроенной поддержки XPath, Selenium предоставляет собственную реализацию. Это может привести к неожиданному поведению из-за различий в различных механизмах XPath.

Browser_Native_Xpath_Capabilities

Например, для следующего фрагмента HTML:

<input type="text" name="example" />
<INPUT type="text" name="other" />

Если ваша строка кода:

List<WebElement> inputs = driver.findElements(By.xpath("//input"));

Будет найдено следующее количество совпадений:

Xpath_Native_Support

Решение

Поскольку элемент был идентифицирован на основе текста как Джефф Смит, вам необходимо сопоставить его с отображенным текстом, которым является Джефф Смит. сильный>. Таким образом, ваш эффективный блок кода будет:

@Test(priority = 4)
public void VerifyGuest() {
    WebElement guestName = driver.findElement(By.xpath("//a[contains(text(),'Jeff Smith')]"));
    String expectedName = "Jeff Smith";
    String actualName = guestName.getText();
    Assert.assertEquals(actualName, expectedName);
    System.out.println("Reservation Code Belongs to " + actualName);
}

Примечание. Идентификация элемента с помощью text() XPath и извлечение текста с помощью getText() не является правильным способом утверждения любого текста. Возможно, нужный элемент следует идентифицировать с какой-либо другой эффективной стратегией поиска.

person DebanjanB    schedule 25.01.2019
comment
Я пытался использовать Джеффа Смита (вместо ДЖЕФФ СМИТ). Safari пройдет, но это приведет к сбою Chrome и Safari - person Java Noob; 25.01.2019
comment
Могу ли я вместо этого использовать .getAttribute для получения информации о Джеффе Смите? - person Java Noob; 25.01.2019
comment
@JavaNoob Это то, что я точно объяснил на примере, цитируемом из документации. Поведение Safari и Chrome не задокументировано. Это в моем списке дел :) - person DebanjanB; 25.01.2019
comment
DOM для Safari и Chrome немного отличается. Может ли атрибут стиля вызывать проблему? Safari DOM: ‹a href=xxxxxx/users/show/733981 target=_blank xpath=1›Jeff Smith‹/a› Chrome DOM: ‹a href=xxxxxx/users/show/733981 target=_blank xpath=1 style=›Джефф Смит‹/a› - person Java Noob; 25.01.2019
comment
@JavaNoob Теперь вы попали в правильный аккорд. Очевидно, разные браузеры будут отображать HTML DOM по-разному. См.: Получение разницы в подсчете «Общего количества ссылок» на веб-странице с помощью Selenium и инструментов разработки браузера. Атрибуты style и xpath="1" здесь имеют значение. - person DebanjanB; 25.01.2019

ОБНОВЛЕНИЕ, с фактическим ответом.

Метод getText() (или команда веб-драйвера «getElementText») возвращает текст в том виде, в котором он был отображен (по крайней мере, согласно спецификациям, так и должно быть).
Страница, очевидно, применяет к тексту некоторые CSS-преобразования — значение узла пишется с заглавной буквы (Джефф Смит), но оно возвращается как JEFF SMITH (это то, что вы тоже видно в браузере, да?); это довольно легко сделать - с таким стилем, как text-transform: uppercase;.

Таким образом, Chrome и Firefox следуют спецификациям веб-драйвера, а Safari, очевидно, еще нет - он возвращает не обработанную форму, а ту, которая находится в источнике.

Поэтому, если вам нужно просто проверить содержимое элемента, я бы предложил нормализовать его текстовое значение — удалить лишние пробелы и преобразовать его в нижний регистр.
В Java это делается с помощью st.trim().toLowerCase(), где st — имя вашей строковой переменной.

person Todor Minakov    schedule 25.01.2019
comment
Как бы я это сделал? - person Java Noob; 25.01.2019
comment
Как убрать пробелы и строчные буквы? st.trim().toLowerCase(), где st — ваша строковая переменная. - person Todor Minakov; 25.01.2019
comment
@JavaNoob нашел вашу проблему, смотрите обновление ответа. - person Todor Minakov; 25.01.2019
comment
Спасибо, я найду решение для обрезки и дам вам знать, как оно работает. Спасибо за всю помощь, которую вы, ребята, правите! - person Java Noob; 25.01.2019
comment
Я изменил ожидаемое имя на jeff smith и добавил String factName = guestName.getText().trim().toLowerCase(); и это сработало как шарм. - person Java Noob; 25.01.2019
comment
Рад, что это сделал! Строго для обрезки - имейте в виду, что рендеринг html заменяет несколько пробелов одним - например. Java‹space›‹space›‹space›Noob отображается как Java‹space›Noob (кроме случаев, когда используется &nbsp;). Таким образом, вы должны приспособиться к этому, если они есть в вашей желаемой строке. - person Todor Minakov; 26.01.2019