为什么在selenium中使用元素列表是行不通的,但如果我使用WebDriver它就可以工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在selenium中使用元素列表是行不通的,但如果我使用WebDriver它就可以工作相关的知识,希望对你有一定的参考价值。

我有这个代码,在我使用selenium的dom中找到div元素,以便在html页面中查找元素:

package com.indeni.automation.ui.model.alerts;

import com.indeni.automation.ui.model.PageElement;
import com.indeni.automation.ui.selenium.DriverWrapper;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import java.util.List;

public class FilterBar extends PageElement {

    private List<WebElement> edgeDropDownMenus = driver.findElements(By.cssSelector("div.dropdown-menu.left"));
    private List<WebElement> middleDropDownMenus = driver.findElements(By.cssSelector("div.combo-menu.left"));

    public FilterBar(DriverWrapper driver){
        super(driver);
    }

    public void clickOnIssuesDropDownMenu(){
        clickButton(edgeDropDownMenus.get(0));
    }
}

这是clickButton函数:

protected void clickButton(WebElement bthElm){
        bthElm.click();
        printClick(bthElm);
    }

我收到以下错误:

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0

但如果我使用以下代码行,它的工作原理是:

clickButton(driver.findElements(By.cssSelector("div.dropdown-menu.left")).get(0));

但我想使用第一个优雅的方式,但我无法弄清楚为什么我收到此错误消息以及如何解决它。

答案

我很遗憾地说第一种方法并不优雅。在初始化类时找到元素是错误的。初始化类时,这些元素不可用。所以列表基本上是空的。如果您尝试访问列表中的任何元素,它将抛出异常。

在第二种方法中,您可以在单击它之前找到该元素。那个时候它呈现,所以它有效。这是正确的方法。

如果你想要一些优雅的东西,试试这样的东西。使用FindBy,我们只在需要时找到元素。不是在初始化类时。这很优雅,也可以使用。

public class FilterBar extends PageElement {


    @FindBy(css = "div.dropdown-menu.left" )
    private List<WebElement> edgeDropDownMenus;

    @FindBy(css = "div.combo-menu.left")
    private List<WebElement> middleDropDownMenus;

    public FilterBar(DriverWrapper driver){
        super(driver);
        PageFactory.initElements(driver, this);
    }

    public void clickOnIssuesDropDownMenu(){
        clickButton(edgeDropDownMenus.get(0));
    }

}

以上是关于为什么在selenium中使用元素列表是行不通的,但如果我使用WebDriver它就可以工作的主要内容,如果未能解决你的问题,请参考以下文章

Python Selenium查找随机生成的元素ID

使用selenium WebDriver查找元素

Python Selenium - 灵活列表中的所有选项

Selenium WebDriver:如何计算列表中 DIV 元素的数量

使用 Selenium 获取元素列表

选择第二个选项列表中的元素Selenium