我有一张桌子上有产品'定位符的名称仅与索引不同。我想使用一种方法来迭代所有元素,因为元素的数量可以更改为10,我需要全部通过它们。
@FindBy(xpath="(//*[@class=\"product-name\"])[2]")
protected WebElement productName1;
@FindBy(xpath="(//*[@class=\"product-name\"])[3]")
protected WebElement productName2;
@FindBy(xpath="(//*[@class=\"product-name\"])[4]")
protected WebElement productName3;
我想要参数化的方法是:
public String checkProductsInCart() {
wait.until(ExpectedConditions.visibilityOf(productName1));
String productName1String = productName1.getText();
return productName1String; }
我该怎么做?我很感激你的帮助。
答案 0 :(得分:2)
在单个列表中获取所有产品名称元素:
@FindBy(xpath="//*[@class=\"product-name\"]")
protected List<WebElement> productNameElements;
然后,在您的测试方法中,您可以迭代元素(如果您愿意,可以使用带有int索引的for循环):
List<String> productsInCart = new ArrayList<>();
for (WebElement element : productNameElements) {
productsInCart.add(nameOfProductInCart(element));
}
您可以更改检查方法,将WebElement
作为参数:
public String nameOfProductInCart(WebElement element) {
wait.until(ExpectedConditions.visibilityOf(element));
return element.getText();
}
或者,如果这不起作用(例如,因为产品列表需要时间来填充),您可以使用WebDriver
实例并以编程方式执行每项检查:
List<String> productNames = new ArrayList<>();
for (int i = 2; i <= 10; i++) {
WebElement element = driver.findElement(By.xpath("(//*[@class=\"product-name\"])[" + i + "]"));
wait.until(ExpectedConditions.visibilityOf(element));
productNames.add(element.getText());
}
更新:要回答评论中的问题,如果您想要元素而不是文本,则可以将元素本身存储在列表中:
List<WebElement> productNameElements = new ArrayList<>();
for (int i = 2; i <= 10; i++) {
WebElement element = driver.findElement(By.xpath("(//*[@class=\"product-name\"])[" + i + "]"));
wait.until(ExpectedConditions.visibilityOf(element));
productNameElements.add(element);
}
现在,您可以通过productNameElements
列表中的索引获取元素来单独访问这些元素:
productNameElements.get(0); // First item
这比管理每个项目的单独变量更容易管理。
答案 1 :(得分:0)
只是对@ ELEVATE答案的附录,你可以通过className找到元素:
@FindBy(className = "product-name")
private List<WebElement> tableItems;
或
@FindBy(xpath="//*[@class='product-name']")
private List<WebElement> tableItems;
但这取决于这是否是唯一标识符......