selenium-webdriver - 如何在 PageObjectModel 模式中创建用于检查网页上的 webElement 存在的实用方法
问题描述
我想创建一个实用方法来检查 POM 框架中 webPage 上的 webElement 存在。我可以使用 driver.findelements(By.(xpath)/Id/css stc) 的逻辑并检查大小。如果大小 >0 元素存在。但是在这种情况下,我不能将 PageFactory Webelement 作为参数传递,因为 findelements 仅将 String 作为参数,而不是 webelement 。所以我想将 pagefactory webelement 传递给实用程序方法并检查是否存在 webelement
解决方案
我假设您正在使用 Java 来回答这个问题,并且您的代码如下所示:
@FindBy(id = "foo")
WebElement element;
您会发现创建一个执行此操作的实用程序方法是有问题的,因为WebElement
对象不提供提取用于生成它的定位器的方法。你有几个我能想到的选择。
选项1
更改您的 PageFactory 实现以生成WebElement
列表而不是单个WebElement
@FindBy(id = "foo")
List<WebElement> allElements;
allElements.get(0)
这样做的缺点是,当您在页面对象中使用它时,您显然需要执行以从该对象中获取初始元素。
选项 2
从 PageFactory 切换到使用 Query 对象。这是我编写的一个小型库,用于解决我在使用 Java PageFactory 时遇到的各种问题。代码在 Github 上可用,库在 Maven Central 上可用(有关使用说明,请参阅 Github 上的 README.md,设置与 PageFactory 非常相似)。这将使您可以像这样定义元素:
Query query = new Query().defaultLocator(By.id("foo"));
您现在可以使用上述对象提取 WebElement 或 Webelements 列表:
WebElement soloElement = query.findWebElement();
List<WebElement> allElements = query.findWebElements();
因此,对于您的特定问题,您可以执行如下检查:
if(query.findWebElements().size() > 0){
//Do Something
}
它还可以让您提取原始定位器以用于实用程序功能,或在需要时显式等待
By originalLocator = query.by()
推荐阅读
- laravel - 使用 CircleCI 和 Laravel 6 Composer 安装失败
- css - 将大内容与小内容对齐
- sed - sed 用等号替换文本 =
- asp.net - 在 webform 中显示从 REST web 服务检索到的 base64 图像
- go - 如何在应用程序端记录 Cassandra 查询?
- api - Sitecore RESTful API 身份验证不返回令牌
- ios - 更改框架源代码时更新应用程序内的框架
- asp.net-core - Azure,错误 403 - 禁止:需要客户端证书
- php - Mysql SELECT函数在字段列表中返回未知列错误
- oracle - 触发器中忽略的 SQL 语句?