首页 > 解决方案 > 如何在 PageObjectModel 模式中创建用于检查网页上的 webElement 存在的实用方法

问题描述

我想创建一个实用方法来检查 POM 框架中 webPage 上的 webElement 存在。我可以使用 driver.findelements(By.(xpath)/Id/css stc) 的逻辑并检查大小。如果大小 >0 元素存在。但是在这种情况下,我不能将 PageFactory Webelement 作为参数传递,因为 findelements 仅将 String 作为参数,而不是 webelement 。所以我想将 pagefactory webelement 传递给实用程序方法并检查是否存在 webelement

标签: selenium-webdriver

解决方案


我假设您正在使用 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()

推荐阅读