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.
结论
人眼感知可见的元素可以通过以下方式呈现为不可见:
将 CSSvisibility
属性设置为 hidden
将display
属性设置为none
对于元素本身或如果它的祖先则为一个。
【讨论】:
感谢您提供的信息。只是想知道您是否有解决该问题的方法?当规定的方法似乎不起作用时,我如何识别元素是否可见.. @EitelDagnin 除非我们知道您的正确用例以及基于文本的 html、代码试验和错误堆栈,否则推测究竟出了什么问题是不公平的。 @EitelDagnin 很高兴能为您提供帮助!如果我的answer满足了您的question,请点击我的answer旁边的空心复选标记acceptanswer i> 位于 votedown 箭头下方,因此复选标记变为 绿色。 再次感谢您的快速回复。如果我要提供元素的标识属性,这对确定可能的解决方案有帮助吗? @EitelDagnin 我没有得到你的问题。简而言之,presenceOfElementLocated()
和 visibilityOfElementLocated()
验证了一个元素的两个不同阶段。以上是关于Java Selenium - ExpectedCopnditions 存在通过但可见性失败的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 的 Selenium WebDriver (Selenium 2) 中 selenium.refresh() 的等效代码