【问题标题】:List size should be 2 but its giving 3 why?列表大小应该是 2 但它给 3 为什么?
【发布时间】:2019-03-09 14:39:47
【问题描述】:

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

【问题讨论】:

  • Selenium 注入哪种 List?可能是它是一个不可变的列表,您需要重新分配它。
  • @LppEdd,我猜 Selenium 注入可变列表不确定
  • 调试一下看看。如果您确定元素是正确的,这是唯一的原因。
  • @LppEdd,甚至官方文档也没有提到任何关于列表不变性的内容
  • 调试它。这是唯一真正的解决方案。

标签: java selenium


【解决方案1】:

Selenium 对 PageFactory 中的初始化 WebElement 和 List 字段使用惰性代理。
每次使用 columns 时 Selenium 都会定位元素,并且因为页面上有 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你可以找到here和关于com.sun.proxy.$Proxyhere的信息。

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

【讨论】:

  • 我的同一个列表不能给出修改后的列表。我可以在您提供的两个示例中看到这里使用了不同的列表。请澄清一下?
  • @BlueStar 我试图解释为什么即使你删除了 3 个项目,你也无法修改你的列表
  • ,所以唯一真正的解决方案是创建另一个列表并使用新创建的列表来获取修改后的结果,因为如果我们再次使用相同的列表,它将再次找到所有列。请回复谢谢。
  • @BlueStar 你从 xpath 中排除 Instructor
  • ,那么我将如何删除该元素,如果我排除它?我的任务是删除该元素,如果它仅等于“Instructor”,并且在某些情况下我可能没有讲师,所以我用过。
猜你喜欢
  • 2017-05-02
  • 2017-04-07
  • 2011-04-28
  • 2021-03-08
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2020-08-23
相关资源
最近更新 更多