如何参数化java方法来迭代表中的元素?

时间:2018-05-22 13:14:19

标签: java selenium selenium-webdriver

我有一张桌子上有产品'定位符的名称仅与索引不同。我想使用一种方法来迭代所有元素,因为元素的数量可以更改为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; }

我该怎么做?我很感激你的帮助。

2 个答案:

答案 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;

但这取决于这是否是唯一标识符......