无法在 Selenium 和 Java 中使用 className 定位元素

Posted

技术标签:

【中文标题】无法在 Selenium 和 Java 中使用 className 定位元素【英文标题】:Unable to locate element using className in Selenium and Java 【发布时间】:2020-11-06 21:59:33 【问题描述】:

我想在 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();

为什么有时能工作有时不能工作?

【问题讨论】:

请先检查您的页面没有 iFrame 元素。如果有,你应该在'findEelement'之前切换到所需的帧 【参考方案1】:

您可以找到以下元素:

<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 中还有其他元素呈现在 classNamesignup-button 甚至在所需元素之前,这可能是不可见的 设计。

理想情况下,您还应该能够使用基于xpath 的Locator Strategy:

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

最佳实践

但根据最佳实践,您需要将WebDriverWait 用于elementToBeClickable(),并且您可以使用以下任一Locator Strategies:

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

参考文献

您可以在以下位置找到一些相关讨论:

NoSuchElementException, Selenium unable to locate element

【讨论】:

感谢您的回答。我很满意。【参考方案2】:

如果你没有像 id 和 class name 这样的定位器,你需要使用相对 xpath 你可以试试 //button[contains(text(),"Get Started!")] 这个 xpath

【讨论】:

以上是关于无法在 Selenium 和 Java 中使用 className 定位元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium WebDriver 无法与 Firefox 20 连接

Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能

无法单击 Selenium 和 Java 的树视图

无法使用Selenium和Java 11导入org.openqa.selenium.WebDriver

无法使用 Selenium Java 提取手风琴中的段落文本

org.openqa.selenium.NoSuchElementException无法找到element:method“:”link text“,”selector“:”http://