Java Selenium - ExpectedCopnditions 存在通过但可见性失败

Posted

技术标签:

【中文标题】Java Selenium - ExpectedCopnditions 存在通过但可见性失败【英文标题】:Java Selenium - ExpectedCopnditions Presence Passes but Visibility Fails 【发布时间】:2021-04-18 07:59:05 【问题描述】:

我不明白。我已经搜索了 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(但我可以在屏幕上看到该元素)。

编辑:

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

当前元素属性:

已经查看了这些帖子:

Expected condition failed: waiting for visibility of element located by By.xpath

Selenium webdriver problem with: Expected condition failed: waiting for visibility of element located by(..)

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

Selenium: How selenium identifies elements visible or not? Is is possible that it is loaded in DOM but not rendered on UI?

isDisplayed() vs isVisible() in Selenium

【问题讨论】:

有趣。你试过了吗?***.com/questions/38038920/… 感谢您的回复。我没有专门检查那个帖子,但我目前正在使用元素的存在.. 【参考方案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()

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

元素展示度

isDisplayed() 的此实现符合 WebDriver Level 2 W3C Working Draft 中的规范,其中提到:

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

元素的可见性取决于感知可见的内容 到人眼。在这种情况下,元素的显示性并不 涉及到 visibility 或 display风格 属性。

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

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

这个函数通常暴露给带有 URI 模板的 GET 请求:

/session/session id/element/element id/displayed.

结论

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

将 CSS visibility 属性设置为 hiddendisplay 属性设置为none

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

【讨论】:

感谢您提供的信息。只是想知道您是否有解决该问题的方法?当规定的方法似乎不起作用时,我如何识别元素是否可见.. @EitelDagnin 除非我们知道您的正确用例以及基于文本的 html、代码试验和错误堆栈,否则推测究竟出了什么问题是不公平的。 @EitelDagnin 很高兴能为您提供帮助!如果我的answer满足了您的question,请点击我的answer旁边的空心复选标记acceptanswer i> 位于 votedown 箭头下方,因此复选标记变为 绿色 再次感谢您的快速回复。如果我要提供元素的标识属性,这对确定可能的解决方案有帮助吗? @EitelDagnin 我没有得到你的问题。简而言之,presenceOfElementLocated()visibilityOfElementLocated() 验证了一个元素的两个不同阶段。

以上是关于Java Selenium - ExpectedCopnditions 存在通过但可见性失败的主要内容,如果未能解决你的问题,请参考以下文章

java怎么安装selenium

java selenium怎么等待元素出现并设置一定时间

selenium 怎么使用java编写测试用例

java-selenium处理弹窗问题

使用 Java 的 Selenium WebDriver (Selenium 2) 中 selenium.refresh() 的等效代码

selenium+java启动Chrome