Как параметризовать Java-метод для итерации по элементам в таблице? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть таблица с названиями продуктов, локаторы которых отличаются только индексом.Я хотел бы использовать один метод для итерации всех элементов, потому что количество элементов может быть изменено до 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 голосов
/ 22 мая 2018

Просто добавьте к ответу @ ELEVATE, Вы можете найти элемент через className:

@FindBy(className = "product-name") 
private List<WebElement> tableItems;

или

@FindBy(xpath="//*[@class='product-name']")
private List<WebElement> tableItems;

, но это зависит от того, является ли это уникальным идентификатором ...

0 голосов
/ 22 мая 2018

Получить все элементы названия продукта в одном списке:

@FindBy(xpath="//*[@class=\"product-name\"]")
protected List<WebElement> productNameElements;

Затем в своем методе тестирования вы можете перебирать элементы (вы можете использовать цикл for с индексом int, если хотите):

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

Это должно быть проще в управлении, чем наличие отдельной переменной для каждого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...