java.lang.AssertionError при утверждении текста с Safari, но проходит с Chrome и FireFox с помощью Selenium TestNG - PullRequest
0 голосов
/ 25 января 2019

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

HTML:

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

Ошибка Safari:

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);
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Очевидно, что в вашем кодовом блоке нет ошибки, но существует ситуация 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);
}

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

0 голосов
/ 25 января 2019

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

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

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

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

...