Невозможно найти элемент с помощью className в Selenium и Java

Я хотел найти элемент веб-страницы, используя имя класса в Selenium. Это веб-элемент, который я пробовал:

<button class="signup-button b green">Get Started!</button>

Когда я попробовал этот способ, мне не удалось найти кнопку;

driver.findElement(By.className("signup-button")).click();

Но, используя селектор css, как показано ниже, он работал;

driver.findElement(By.cssSelector("button.signup-button")).click();

По какой причине это иногда работает, а иногда не работает?

2 ответа

Решение

Поскольку вы можете найти следующий элемент:

<button class="signup-button b green">Get Started!</button>

с помощью:

driver.findElement(By.cssSelector("button.signup-button")).click();

но не смог найти тот же элемент, используя:

driver.findElement(By.className("signup-button")).click();

Это потому, что были другие элементы, которые отображаются в HTML DOM с className какsignup-button даже перед желаемым элементом, который может быть невидимым по дизайну.

В идеале вы также должны иметь возможность использовать стратегию локатора на основе xpath:

driver.findElement(By.xpath("//button[@class='signup-button' and text()='Get Started!']")).click();

Лучшие практики

Но в соответствии с передовой практикой вам необходимо использовать WebDriverWait дляelementToBeClickable()и вы можете использовать любую из следующих стратегий локатора:

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.signup-button"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='signup-button' and text()='Get Started!']"))).click();
    

Ссылки

Вы можете найти пару соответствующих обсуждений в:

Вам нужно использовать относительный xpath, если у вас не может быть локаторов, таких как id и имя класса. Можете ли вы попробовать с помощью //button[contains(text(),"Get Started!")] Этот xpath

Другие вопросы по тегам