即使使用 @FindBy 批注时从列表中删除元素,我仍将列表的大小设为3。
当我执行不带@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();
}
}
答案 0 :(得分:0)
Selenium对PageFactory中的init WebElement和List字段使用惰性代理。
每次您使用columns
时,Selenium都会定位元素,并且由于页面th
上有3个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
,您可以找到信息here和有关com.sun.proxy.$Proxy
here的信息。
要从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());
}