1

我不明白.. 我已经搜索了 2 天的答案,但我找不到解决这个问题的单一解决方案。

代码如下所示(在 try catch 块中):

Presence = new WebDriverWait(Driver, custTimeout);
Presence.until(ExpectedConditions.presenceOfElementLocated(By.xpath(ElementXpath)));

单独的 try catch 块:

Visisble = new WebDriverWait(Driver, custTimeout);
Visisble.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(ElementXpath)));

这也显示为 FALSE:

foundElement.isDisplayed();

这失败了:

Clickable = new WebDriverWait(Driver, custTimeout);
Clickable.until(ExpectedConditions.elementToBeClickable(By.xpath(ElementXpath)));

现在,当元素在屏幕上可见并且如果我这样做可以单击时,PRESENCE 如何/为什么通过并且 VISIBILITY 失败:

ElementToClick.get(0).click();

所以基本上,元素是可见的并且元素是可交互的,但是“检查是否可见”失败并出现异常。

看到对“可见性”的检查基本上是在寻找元素的高度和宽度,我决定也通过以下方式手动检查:

ElementToClick.getAttribute("height");
ElementToClick.getAttribute("width");

这两个值都是 0(但我可以在屏幕上看到该元素)。

编辑:

那么,如果这些标准方法不起作用,我该如何确定元素是否可见?

当前元素属性:

在此处输入图像描述

已经检查了这些帖子:

预期条件失败:等待 By.xpath 定位的元素的可见性

Selenium webdriver 问题:预期条件失败:等待位于 (..) 的元素的可见性

https://sqa.stackexchange.com/questions/24459/selenium-webdriver-tests-sometimes-doesnt-find-elements

硒:硒如何识别可见或不可见的元素?是否有可能在 DOM 中加载但未在 UI 上呈现?

Selenium 中的 isDisplayed() 与 isVisible()

4

1 回答 1

1

PresenceOfElementLocated()

presenceOfElementLocated()是检查页面的 DOM 上是否存在元素的期望。这并不一定意味着该元素是可见的。

public static ExpectedCondition<WebElement> presenceOfElementLocated​(By locator)

Parameters:
locator - used to find the element
Returns:
the WebElement once it is located

可见性元素定位()

visibilityOfElementLocated()是检查元素是否存在于页面的 DOM 上并且可见的期望。可见性意味着元素不仅被显示,而且其高度和宽度都大于 0。

public static ExpectedCondition<WebElement> visibilityOfElementLocated​(By locator)

Parameters:
locator - used to find the element
Returns:
the WebElement once it is located and visible

元素展示度

此实现符合WebDriver Level 2 W3C 工作草案isDisplayed()中的规范,其中提到:

推荐的方法将给出元素可见性的简化近似值,但请注意它仅依赖于树遍历,并且仅涵盖可见性检查的子集。

元素的可见性由人眼感知可见的内容引导。在这种情况下,元素的显示性与 可见性显示样式属性无关。

推荐给实现者确定元素可见性的方法最初是由 Selenium 项目开发的,它基于对元素在树中的性质和关系的粗略近似。如果元素的任何部分在视口边界内的画布上绘制,则通常认为元素是可见的。

元素显示算法是一个布尔状态,其中 true 表示显示元素,false 表示不显示元素。要计算元素的状态,请调用 Call(bot.dom.isShown, null, element). 如果这样做不会产生错误,则返回此函数调用的返回值。否则返回错误代码未知错误。

此函数通常暴露给 GET 请求,其 URI 模板为:

/session/{session id}/element/{element id}/displayed.

结论

人眼感知可见的元素可以通过以下方式变为不可见:

  • 将 CSSvisibility属性设置为hidden
  • display属性设置为none

为元素本身或一个如果它的祖先。

于 2021-01-13T13:27:42.287 回答