有没有办法限制页面对象中元素列表的大小?

时间:2016-11-29 19:23:14

标签: c# selenium automation

我正在进行自动化测试,我可以使用以下内容在页面上获取所需的元素列表:

using System.Collections.Generic;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;

namespace iOSAutomation.PageObjects
{
    public class CCLMenu
    {
        private IWebDriver driver;

        // Menu element buttons
        [FindsBy(How = How.Id, Using = "btn_MenuElement")]
        public IList<IWebElement> menuElement_buttons;


        // Constructor
        public CCLMenu(IWebDriver driver)
        {
            this.driver = driver;
            PageFactory.InitElements(driver, this);
        }
    }
}

这会获得166个元素的列表,但需要一段时间才能找到它们并从列表中选择一个来单击。以下是测试样本:

[TestMethod]
public void SelectCCLOptions()
{
    //...

    // THIS CURRENTLY GETS A LIST OF 166 ELEMENTS; TODO - Find a way to limit list size
    Debug.WriteLine("Array count: " + cclMenu.menuElement_buttons.Count);
    Assert.IsTrue(isElementPresent(driver, cclMenu.menuElement_buttons.ElementAt(1), 60), "Unable to find country menu element button on " + cclMenu.ToString());
    cclMenu.menuElement_buttons.ElementAt(1).Click();

    //...
}

我想知道是否有办法限制页面对象中初始化列表的大小,因为我只需要大约30个这些元素,这将大大加快测试速度。我已经尝试在调用new之前直接在页面对象构造函数中使用PageFactory.InitElements(...)关键字初始化具有特定容量的列表,但似乎每次驱动程序查找元素时都会实例化一个新列表,这样这样做没有影响。

有任何建议或甚至可能吗?

编辑:这适用于iOS手机应用程序,我们最终希望能够在测试运行开始时随机选择一种语言。

1 个答案:

答案 0 :(得分:2)

您似乎只对第二个元素感兴趣。 我建议创建以下属性:

public IWebElement CountryMenu {
    get {
        return driver.FindElement(By.CssSelector(".btn_MenuElement:nth-of-type(1)"));
    }
}

&#34;:第n的式&#34;是一个css选择器,用于通过索引获取集合中的元素。

或者,您可以创建一个方法来按索引检索项目:

public IWebElement GetMenu(int index) {
    return driver.FindElement(By.CssSelector(
        string.Format(".btn_MenuElement:nth-of-type({0})", index)
    ));
}

*注意:我使用的是class而不是id,因为拥有多个具有相同id的元素是没有意义的。

相关问题