Selenium Webdriver 和 PageFactory 初始化 List<WebElement> 元素

问题描述 投票:0回答:7

我搜索了谷歌代码上托管的 Selenium Webdriver APi 文档。当前使用 PageFactory 来初始化我的 Page 对象,但在初始化 WebElement 列表时遇到问题。

我需要的是一种初始化元素列表的方法,最好是下拉选择框的列表。

我已经查看了对 @Findsby 和 @ByChained 的 API 引用,但仍然无法找出初始化下拉选择框列表的最佳方法。我可以为每个元素都有一个单独的 WebElement 并获取 ID,但我想初始化列表选择列表

目前我使用以下内容:

public class PageObject {

        @FindBy(id="element_id")
        private WebElement element;

        public getElement() {
          return element;
        }
}

有什么方法可以使用与我寻求的类似的东西:

public class PageObject {   

    @FindBys(className="selectItmes")
    private List<WebElement> selects;

    public List<WebElement> getSelects() {
      return selects;
    }  
}

或者我必须为每个元素使用一个 Web 元素吗? :(

更新

任何人都知道如何使用 PageFactory 并初始化 List 元素;使用 FindsBy 注释。我找不到任何方法来做到这一点,但 selenium google 文档网站上有 google 问题,说这已在 Java api 绑定和版本 2.12 中修复,因为它在 2.11 中被错误地禁用了......我仍然可以' t 初始化一个列表。 =/

webdriver selenium-webdriver
7个回答
8
投票

该功能最近已在 Selenium 2.0 中添加。检查这个问题。现在已经修复了。

根据文档,您可以执行类似的操作,

@FindAllBy(className="selectItmes") 
List<WebElement> selects;

如果您对代码感兴趣,请检查this out


4
投票

这是我在测试框架中所做的标准解决方案,直到 @FindAllBy 在 Selenium 库中不起作用:

private List<WebElement> selects;

public List<WebElement> getSelects() {
      selects = getDriver().findElements(By.xpath("..."));
      return selects;
    } 

1
投票

您可以相当轻松地找到选择选项,您所要做的就是使用 Webdriver.Support dll 参考。这使您可以访问 SelectElement 类。这是一个简单的例子:

IWebElement element = driver.FindElement(By.TagName("select"));

SelectElement select = new SelectElement(element);
int options = element.FindElements(By.TagName("option")).Count();
select.SelectByIndex(new Random().Next(1, options - 1));

上面的代码找到 select 元素,获取该 select 元素中选项的计数,然后随机选择一个。

代码可能略有不同,因为我的代码是用 C# 编写的


0
投票
      @FindBys(@FindBy(xpath="//span[@class='ng-binding']"))

        private List<WebElement> AllData;

        public List<WebElement> getAllData() {
            return AllData;
        }

0
投票

我像这样解决这个问题:

@FindBy(id="element_id")
public List<WebElement> selects;

您现在拥有具有该 ID 的所有 Web 元素的列表。

然后,您只需从列表中抓取该元素,就像抓取任何其他 PageFactory WebElement 列表一样。


0
投票

我知道这是一个老问题,但因为类似的问题浪费了很多时间。最后的问题是我从未真正初始化过列表。所以这不起作用:

    @FindBy(css = .randomlocator)
    private List<WebElement> list;

但这有效:

    @FindBy(css = .randomlocator)
    private List<WebElement> list= new ArrayList<>();

也许会对某人有所帮助。


0
投票

你能帮我吗,我在 selenium c# 上遇到这个问题

System.ArgumentException:成员类型“List

1' is not IWebElement or IList<IWebElement> at SeleniumExtras.PageObjects.DefaultPageObjectMemberDecorator.CreateObject(Type memberType, IElementLocator locator, IEnumerable
1 bys,布尔缓存) 在 SeleniumExtras.PageObjects.DefaultPageObjectMemberDecorator.Decorate(MemberInfo 成员,IElementLocator 定位器) 在 SeleniumExtras.PageObjects.PageFactory.InitElements(对象页面,IElementLocator 定位器,IPageObjectMemberDecorator 装饰器) 在 SeleniumExtras.PageObjects.PageFactory.InitElements(对象页面,IElementLocator 定位器) 在 SeleniumExtras.PageObjects.PageFactory.InitElements(ISearchContext 驱动程序,对象页面)

© www.soinside.com 2019 - 2024. All rights reserved.