【问题标题】:Selenium: How to verify whether an Element is PresentSelenium:如何验证元素是否存在
【发布时间】:2025-12-28 00:25:14
【问题描述】:

场景:我有一个场景,比如登录到某个页面后,会间歇性地出现一个配置文件更新按钮,我需要点击它。事情就像那个按钮会出现我必须点击否则我必须离开那部分并继续。我已经编写了一个逻辑来处理这种情况,如下所示。

public boolean isElementPresent(By locatorKey) {
 try {
 getDriver().findElement(locatorKey);
 return true;
 } catch (org.openqa.selenium.NoSuchElementException e) {
 return false;
 }
 }

如果该元素出现,它将返回 true,否则将返回 false.. 上面的代码工作正常......但问题是它需要大约一分钟才能返回 true 或 false..假设我使用过我的脚本中有五个地方所以不必要我脚本正在等待 5 分钟......我也尝试了下面的代码

getDriver().findElement(locator).isDisplayed();

但我面临同样的问题...代码工作正常,但返回命令也需要大约 1 分钟...

是否有任何有效的方法来处理这种情况而无需等待一分钟即可获得状态?

【问题讨论】:

  • 你在使用隐式等待吗?换句话说,您的代码中是否有一行看起来像driver.manage().timeouts().implicitlyWait(60000)?如果是这样,这就是您等待返回的时间如此之长的原因。
  • 该代码应该不会花一分钟时间。事实上,它可能会立即执行,然后返回 false,因为该元素尚未出现。您的问题可能出在其他地方。
  • 隐式等待在这里听起来是一个可行的罪魁祸首

标签: selenium selenium-webdriver


【解决方案1】:

改用findElements方法,检查返回的列表是否不为空:

return !getDriver().findElements(locatorKey).isEmpty();

请注意这里不需要try/catch 子句。

【讨论】:

    【解决方案2】:

    barak manos 对您的问题有一个完全可行的答案,但如果您想避免布尔反转,这里有一个替代方案:

    public boolean isElementPresent(By locatorKey){
        return (getDriver().findElements(locatorKey).size() > 0);
    }
    

    与他的解决方案一样,不需要 try/catch,因为 findElements() 如果找不到定位器或已经过时,只会返回一个空列表。

    再一次,在这里不要贬低巴拉克马诺斯。这只是另一种解决方案。

    【讨论】:

    • 我最初使用的是size() > 0。然后有人写道我可以使用isEmpty(),所以我认为它“语义上”更好。在这两种情况下,就正确性和性能而言,结果都是相同的。这并不重要,但boolean 反转实际上发生在您的解决方案中。
    • 鉴于方法的上下文,我不得不在反转点上不同意你的观点(isElementPresent,如果存在则表示为真,否则为假)。为了在找到元素时返回 true(并且列表不为空),必须使用 ! 反转布尔值。操作员。 .size() > 0 如果列表包含值,则仅返回 true,这意味着已找到一个或多个定位器实例。在这种情况下,这一切都归结为偏好。如果一种特定的方法对您有用、可读且易于管理,那么这就是最好的方法。我只是想提出一个替代方案。