Почему использование списка элементов в Selen не будет работать, но если я использую WebDriver, он работает - PullRequest
0 голосов
/ 17 января 2019

У меня есть этот код, который находит элементы div в DOM, я использовал селен, чтобы найти элементы на странице HTML:

package com.indeni.automation.ui.model.alerts;

import com.indeni.automation.ui.model.PageElement;
import com.indeni.automation.ui.selenium.DriverWrapper;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import java.util.List;

public class FilterBar extends PageElement {

    private List<WebElement> edgeDropDownMenus = driver.findElements(By.cssSelector("div.dropdown-menu.left"));
    private List<WebElement> middleDropDownMenus = driver.findElements(By.cssSelector("div.combo-menu.left"));

    public FilterBar(DriverWrapper driver){
        super(driver);
    }

    public void clickOnIssuesDropDownMenu(){
        clickButton(edgeDropDownMenus.get(0));
    }
}

А это функция clickButton:

protected void clickButton(WebElement bthElm){
        bthElm.click();
        printClick(bthElm);
    }

Я получаю следующую ошибку:

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0

но если я использую следующую строку кода, это работает:

clickButton(driver.findElements(By.cssSelector("div.dropdown-menu.left")).get(0));

Но я хочу использовать первый элегантный способ, но не могу понять, почему я получаю это сообщение об ошибке и как это исправить.

1 Ответ

0 голосов
/ 18 января 2019

Мне жаль говорить, что первый подход не элегантен. Неправильно найти элемент при инициализации класса. Когда класс инициализирован, эти элементы были недоступны. Таким образом, список будет в основном пустым. Если вы попытаетесь получить доступ к любому элементу из списка, он выдаст исключение.

При втором подходе вы находите элемент непосредственно перед тем, как щелкнуть по нему. В тот раз это дарит, так что работает. Это правильный способ сделать это.

Если вы хотите что-то элегантное, попробуйте что-то вроде этого. С FindBy мы находим элемент, только когда он требуется. Не тогда, когда класс инициализируется. Это элегантно, и это также будет работать.

public class FilterBar extends PageElement {


    @FindBy(css = "div.dropdown-menu.left" )
    private List<WebElement> edgeDropDownMenus;

    @FindBy(css = "div.combo-menu.left")
    private List<WebElement> middleDropDownMenus;

    public FilterBar(DriverWrapper driver){
        super(driver);
        PageFactory.initElements(driver, this);
    }

    public void clickOnIssuesDropDownMenu(){
        clickButton(edgeDropDownMenus.get(0));
    }

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