Размер списка должен быть 2, но дает 3, почему? - PullRequest
1 голос
/ 09 марта 2019

Я получаю размер списка как 3, даже если удаляю элемент из списка, когда использую аннотацию @ FindBy .

Когда я выполняю свой код без аннотации @FindBy, я получаю правильный размер списка как 2.

Список состоит из следующих элементов: [Инструктор, курс, цена]

Пожалуйста, помогите мне, почему у меня такое поведение?

public class TestClass {

static WebDriver driver;

@FindBy(xpath = "//th")
public List<WebElement> columns;

List<WebElement> columnNames = new ArrayList<>();

public void initMethod() {
    PageFactory.initElements(driver, this);
}

public List<WebElement> getColumns() {
    // output of below line = Initial columns list size 3
    System.out.println("Initial columns list size " + columns.size());

    for (int i = 0; i < columns.size(); i++) {
        System.out.println(columns.get(i).getText());
        if (columns.get(i).getText().equals("Instructor"))
            columns.remove(i);
    }
    // output of below line = After modification column list size 3
    System.out.println("After modification column list size " + columns.size());
    return columns;
}

public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver", "F://chromedriver.exe");
    driver = new ChromeDriver();
    driver.get("http://www.qaclickacademy.com/practice.php");
    TestClass test = new TestClass();
    test.initMethod();
    test.getColumns();
}
}

1 Ответ

0 голосов
/ 09 марта 2019

Selenium использует ленивый прокси для полей init WebElement и List в PageFactory.
Элементы Selenium находят каждый раз, когда вы используете columns, а поскольку на странице 3 th элемента, columns возвращает все 3 элемента. @FindBy в основном заменяет driver.findElements():

// Here columns locating again on the page
System.out.println("Initial columns list size " + columns.size());
// It works same as code below
System.out.println("Initial columns list size " + driver.findElements(By.xpath("//th")).size());

// All places you use columns, columns locating elements again, and you code is same as here.
for (int i = 0; i < driver.findElements(By.xpath("//th")).size(); i++) {
    System.out.println(driver.findElements(By.xpath("//th")).get(i).getText());
    if (driver.findElements(By.xpath("//th")).get(i).getText().equals("Instructor"))
        driver.findElements(By.xpath("//th")).remove(i);
}
// output of below line = After modification column list size 3
System.out.println("After modification column list size " + driver.findElements(By.xpath("//th")).size());
return driver.findElements(By.xpath("//th"));

О PageFactory вы можете найти информацию здесь и о com.sun.proxy.$Proxy здесь .

Чтобы удалить элемент из columns, вы можете использовать один из следующих способов:

List<WebElement> columns1 = this.columns.stream()
        .filter(e -> !e.getText().equals("Instructor"))
        .collect(Collectors.toList());

List<WebElement> columns2 = new ArrayList<>();
columns.forEach(column -> {
    if (!column.getText().equals("Instructor"))
        columns2.add(column);
});

Ваш метод может быть:

public List<WebElement> getColumns() {
    return columns.stream()
            .filter(e -> !e.getText().equals("Instructor"))
            .collect(Collectors.toList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...