(Ожидание не работает) Селен Java <a>Элемент не взаимодействует - PullRequest
0 голосов
/ 02 февраля 2020

Да, уже пробовал со всеми видами ожидания.

Я должен нажать на большой блок "Платье" на этом сайте: http://automationpractice.com/index.php

I МОЖЕТ получить элементы / a> и / li> с помощью Xpath, но ни один из них никогда не будет «кликабельным» или «видимым»

Следующее работает, но мне нужно более «похожее» решение

((JavascriptExecutor)driver).executeScript("arguments[0].click();", driver.findElement(By.xpath("//a[@title=\"Dresses\"]")));

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

1 Ответ

0 голосов
/ 02 февраля 2020

Проблема в том, что есть два элемента, которые соответствуют вашему локатору. Поскольку вы используете .findElement (в единственном числе), он возвращает первый, который оказывается скрытым, и остается скрытым, если вы не наведите первый навигационный элемент «Женщины».

Существует два способа Чтобы обойти это:

  1. Сохраните тот же локатор, используйте .findElements (множественное число) и щелкните второй элемент.

    driver.findElements(By.xpath("//a[@title='Dresses']")).get(1).click();
                                                          ^ gets the second element, the first is index 0.
    
  2. Измените свой локатор, чтобы найти уникальный элемент, который вы хотите.

    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("#block_top_menu > ul > li > a[title='Dresses']"))).click();
    

Я предпочитаю второе, потому что вы можете добавить ожидание, а также потому, что это селектор CSS. Селекторы CSS более совместимы, более гибки, легче читаются (более простой синтаксис) и т. Д. c.


Дополнительные примечания. Чтобы избежать этой проблемы, всегда проверяйте локаторы в браузер. Я использую Chrome, потому что считаю его самым простым и мощным в использовании. Вы можете открыть devtools используя F12. Нажмите ES C, если консоль не отображается. В консоли вы можете проверить XPath с помощью $x(), например, $x("//a[@title='Dresses']") возвращает 2 элемента. Вы можете проверить CSS селекторов, используя $$(), например, $$("#block_top_menu > ul > li > a[title='Dresses']") возвращает только один элемент.

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