Selenium:如何验证元素是否存在

Selenium:如何验证元素是否存在,selenium,selenium-webdriver,Selenium,Selenium Webdriver,场景:我有一个场景,比如在登录到某个页面后,一个配置文件更新按钮间歇出现,我需要点击它。事情是这样的,如果那个按钮会出现,我必须点击,否则我必须离开那个部分继续。我已经编写了一个逻辑来处理这种情况,如下所示 public boolean isElementPresent(By locatorKey) { try { getDriver().findElement(locatorKey); return true; } catch (org.openqa.selenium.NoSuchEl

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

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分钟


有没有什么有效的方法可以在不等待一分钟的情况下处理这种情况以获取状态?

使用method
findElements
,并检查返回的列表是否为空:

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

请注意,此处不需要使用
try/catch
子句。

巴拉克·马诺斯(barak manos)对您的问题有一个完全可行的答案,但如果您希望避免布尔反转,这里有一个替代方案:

public boolean isElementPresent(By locatorKey){
    return (getDriver().findElements(locatorKey).size() > 0);
}
与他的解决方案一样,不需要try/catch,因为如果找不到定位器或定位器已过时,findElements()只会返回一个空列表


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

是否使用隐式等待?换句话说,您的代码中是否有一行类似于
driver.manage().timeouts().implicitlyWait(60000)
?如果是这样的话,这就是为什么你要等很长时间才能返回的原因。代码应该不会花一分钟。事实上,它可能会立即执行,然后返回false,因为元素还没有出现。您的问题可能在其他地方。隐式等待听起来是一个可行的罪魁祸首。我最初使用的
size()>0
。然后有人写道我可以使用
isEmpty()
,所以我认为它“语义上”更好。在这两种情况下,结果在正确性和性能方面都是相同的。这并不重要,但在您的解决方案中实际发生了
布尔值的反转。考虑到方法的上下文(isElementPresent,如果存在则表示true,否则表示false),我不同意您对反转点的看法。为了在找到元素时返回true(并且列表不是空的),必须使用!操作人员如果列表包含值,则size()>0仅返回true,这意味着已找到定位器的一个或多个实例。在这种情况下,这一切都归结为偏好。如果某个特定的方法对您有效,可读性强,易于管理,那么这就是最好的方法。我只是想提出一个替代方案。