Selenium Webdriver:如何检查特定屏幕上是不是存在 ui 元素,无论它当前是不是可见/可点击

Posted

技术标签:

【中文标题】Selenium Webdriver:如何检查特定屏幕上是不是存在 ui 元素,无论它当前是不是可见/可点击【英文标题】:Selenium Webdriver: How to check if a ui element exists on specific screen regardless of if it currently visible/hittableSelenium Webdriver:如何检查特定屏幕上是否存在 ui 元素,无论它当前是否可见/可点击 【发布时间】:2020-01-06 13:19:02 【问题描述】:

我正在使用 AppiumDriver 和 MobileElement java 包(我正在用 Kotlin 编写)来测试一个 ios 应用程序,该应用程序已经使用 XCUITest 编写了测试。

我需要一个与 XCUIElement.exists() 在 XCUITest 中的行为相同的函数。如果所讨论的 UIElement 出现在屏幕上无论它是否可见/可点击,这将是一个返回 true 的函数。这方面的一个示例是嵌入在看不见的滚动视图中的 UI 元素(未滚动到)。它在页面上,但不可见也不可点击。

现在我有一个 UI 元素看不见的滚动视图,程序将挂起等待它们的可见性,直到我手动滚动滚动视图以将它们带入视图,此时它将通过测试。

我可以确认 MobileElement.->

isDisplayed()(根据我所见,这更像 isHittable() 而不是 exists())

isEnabled()

isSelected()

所有人都不做我想做的事,也不做任何事情:

driver.findElements(By.xpath("value")).size() != 0

如果我没记错的话,上面这行似乎在与 isDisplayed 完全相同的情况下返回 true。

编辑:一些用户建议由于延迟加载,元素可能还不存在,这就是为什么 driver.findElements(By.xpath("value")).size() != 0 行不工作。作为对此的回应,我在 iOS 应用程序中添加了代表滚动视图的 div 图像。在用户手动向下滚动以使其在请求超时之前可见之前,仍然无法找到突出显示的 UI 元素。

【问题讨论】:

我的猜测是,在您滚动之前,这些元素可能实际上并不存在。查找“延迟加载”以获取更多信息。您能否在开发控制台中验证它们在滚动之前确实存在? 它们似乎存在。我在 appium 中属性检查器的“应用程序源”部分查看了我的应用程序,可以看到元素实际上就在那里,嵌入在滚动视图中,即使它们当前没有滚动到。我不确定这是否证明元素实际上在 DOM 中,但我觉得确实如此。我已经编辑了我的原始问题以包含此图像。 【参考方案1】:
driver.findElements(By.xpath("value")).size() != 0

是测试元素是否存在的正确方法。这不会检查可行性,它只是获取当前 DOM 中与定位器匹配的所有元素。即使您将隐式等待(如有必要)定义为元素的存在,也仅此而已。

【讨论】:

在这种情况下,您所说的“生存能力”是什么意思?我知道页面上有一个元素,因为如果我向下滚动,则 mobileElement.isDisplayed 返回 true 但使用您概述的代码会做同样的事情。如果我在它周围放一个Assert.assertTrue( . ),它将等待大约 30 秒并失败。在这 30 秒内,它正在隐式等待满足条件(永远不会)。 @HumanZeroHumanZero 如果页面有延迟加载并且元素在滚动到它之前没有添加到 DOM 中,则默认情况下加载的元素将可见。它失败了,因为该元素还不存在。但是如果元素总是存在于 DOM 中,driver.findElements 会定位它并返回它,即使它不可见。 那么问题是 XCUITest 能够识别 UI 元素的存在,即使它当前不在屏幕上。似乎这不是 selenium webdriver 能够做到的事情? (在 iOS 和 android 上都试过)。这可能是因为测试是如何从设备本身内部进行的,而 appium 的命令来自外部来源?不知道我是否完全理解。 @HumanZeroHumanZero Selenium 能够定位当前不在屏幕上的元素。但它们必须在 DOM 中。如果元素在滚动(延迟加载)之前不存在,它就不存在。最好的例子是带有style="visibility: hidden;" 的元素,findElements() 将找到它,而isDisplayed() 将返回 false。 对不起,我想我没有说清楚。如果 XCUITest 能够在不可见的情况下定位元素,并且 Appium 使用 XCUITest 作为 UI 自动化框架,那么无论其可见性如何,UI 元素都应该存在于 DOM 中吗?我是不是误会了什么?【参考方案2】:

要检查存在,即元素的存在,无论元素是否可见 / 可击打,您有为presenceOfElementLocated() 诱导WebDriverWait,您可以使用以下Locator Strategy:

new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("value"))).size() != 0

【讨论】:

您好,感谢您的回答,但不幸的是,这似乎做同样的事情 - 只有当元素显示在屏幕上时才返回 true。如果不是,则超时。我得出这个结论的方式是,当我给出一个我知道是可见的元素的 id 时——它会找到它。当我给它一个不可见元素的 id 时,它会等待整整 20 秒并超时。

以上是关于Selenium Webdriver:如何检查特定屏幕上是不是存在 ui 元素,无论它当前是不是可见/可点击的主要内容,如果未能解决你的问题,请参考以下文章

如果站点使用 Ajax,如何检查 Selenium WebDriver?

在 Python 中,如何检查 Selenium WebDriver 是不是已退出?

如何根据特定参数在 selenium webdriver 的文本框中插入值

如何使用 Selenium WebDriver 检查元素是不是可点击

如何使用 Selenium WebDriver 检查单选按钮?

如何使用 selenium webdriver 检查按钮是不是可点击