Функция ExpectedConditions.or не работает должным образом - PullRequest
1 голос
/ 19 сентября 2019

Я должен проверить интернет-магазин.Пользователи могут добавлять товары в свою корзину.Когда корзина пуста, создается специальный раздел с идентификатором «пустая корзина».Если корзина не пуста, идентификатор этого раздела становится «корзиной».

Я использую Java и Selenium 3.9

Это мои два селектора

@FindBy(how = How.CSS, using = "#empty-basket > section")
private WebElement conteneur_panier_vide;

@FindBy(how = How.CSS, using = "#basket > section:nth-child(1)")
private WebElement conteneur_panier_non_vide;

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

this.wait.until(
    ExpectedConditions.or(
        ExpectedConditions.visibilityOf(conteneur_panier_vide),
        ExpectedConditions.visibilityOf(conteneur_panier_non_vide)
    )
);

Однако, это дает мне ошибку

org.openqa.selenium.TimeoutException: ожидаемое условие не выполнено: ожидание вхотя бы одно условие должно быть действительным

Удивлен, я пробовал это:

this.wait.until(ExpectedConditions.visibilityOf(conteneur_panier_vide))

на странице с пустой корзиной.Это работает, WebElement найден.

Я тогда попробовал это:

this.wait.until(
    ExpectedConditions.or(
        ExpectedConditions.visibilityOf(conteneur_panier_vide),
    )
);

И это также работает.Это означает, что добавление несуществующего элемента к «или» нарушает его, что в точности противоположно тому, что должно быть.

Кто-нибудь имеет представление о том, почему мой код не работает?


Редактировать: решено!

Проблема заключалась в том, что искомый элемент отсутствовал на странице при вызове функции or, что приводило к неисправности, упомянутой выше.

Я просто положил

this.wait.until(ExpectedConditions.urlContains(MY_CART_URL));

, что обеспечивает наличие одного из двух разделов.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Я решил проблему и отредактировал вопрос, чтобы люди знали.

TL; DR: мне потребовалась некоторая задержка перед вызовом функции or, и я сделал это, подождав, пока URL не будетправильный.

0 голосов
/ 20 сентября 2019

Есть две вещи, которые вы можете сделать, чтобы убрать это:

  1. Создать селектор CSS, который соответствует обоим элементам
  2. Использовать ExpectedConditions.visibilityOfElementLocated(By.css(...)) вместо более сложного or
// CSS selectors can be separated by a comma (,)
String cssSelector = "#empty-basket > section, #basket > section:nth-child(1)";

this.wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(cssSelector));

Ваша первоначальная проблема заключалась в том, что использование атрибутов conteneur_panier_vide и conteneur_panier_non_vide заставляло Selenium пытаться их получить.Вам просто нужно дождаться появления любого из элементов.

0 голосов
/ 19 сентября 2019

Вы создали экземпляр своего объекта ожидания?Вы не указали свою среду, но вот что я делаю в

C # var wait = new WebDriverWait( Driver, TimeSpan.FromSeconds( 10 ) );

Java WebDriverWait wait = new WebDriverWait(driver, 20);

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