我正在使用 PageFactory 使用页面对象模型。
条件:如果我的搜索项目名称与列表项目匹配,我想单击该项目名称(WebElement)。它在普通的 java 类中工作正常,但在 PageObjectModel 中我想我在这里遗漏了一些东西。
页面对象类中的元素声明
@FindBy(xpath="....") List <WebElement> searchIteams;
public String selectItem(String searchItemName)
{
String itemInfo="";
for(WebElement listItem:searchIteams)
{
itemInfo=listItem.getText();
if(itemInfo.equals(searchItemName))
{
listItem.click();
break;
}
}
return itemInfo;
}
返回字符串与我在参数中传递的项目名称成功匹配。我不知道为什么我无法单击匹配的元素。
这是我的测试用例方法:
@Test (priority=2)
public void checkItemInResult()
{
try {
SearchResult sr= new SearchResult(driver);
String actualItem= sr.selectItem("Apple iPhone 14 Plus (256 GB) - Yellow");
assertEquals(actualItem.equals("Apple iPhone 14 Plus (256 GB) - Yellow"), true);
} catch (Exception e) {
Assert.fail();
}
}
Please help.
Thank you!
我每天都使用 POM 但不是
PageFactory
(见下面的注释)。如果是我,我会重写你的selectItem()
方法如下。
public void selectItem(String searchItemName) {
new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.elementToBeClickable(By.xpath(MessageFormat.format("//span[normalize-space()='{0}']", searchItemName)))).click();
}
使用此方法,您不需要断言返回的字符串,因为如果您成功单击该元素,您就知道它存在......不需要断言。
现在如果你想断言
searchItemName
没有出现在页面上,我会这样做......与上面相同但包裹在try-catch
中。
public void selectItem(String searchItemName) {
try {
new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.elementToBeClickable(By.xpath(MessageFormat.format("//span[normalize-space()='{0}']", searchItemName)))).click();
} catch (TimeoutException e) {
Assert.fail(MessageFormat.format("The <{0}> item does not exist on the page.", searchItemName));
}
}
注意:如果这是为了工作,您可能无法选择是否使用 PageFactory,但 Selenium 领导和开发人员警告不要使用它。
我遇到的一个主要问题
PageFactory
,除了开发人员的警告,是这样的情况,无法动态过滤获取的项目等