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());
}