列表大小应为2,但为什么要给出3?

时间:2019-03-09 14:39:47

标签: java selenium

即使使用 @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();
}
}

1 个答案:

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