2016-11-29 33 views
0

我工作的自动化测试,我能够得到的元素列表,我需要在页面上使用下列内容:有没有办法限制页面对象中元素列表的大小?

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(); 

    //... 
} 

我想知道如果有一种方法来限制Page对象初始化,因为我只需要对这些元素的30名单的大小,它会显著加快考试。我试图在调用PageFactory.InitElements(...)之前直接在具有特定容量的Page Object构造函数中使用new关键字初始化列表,但似乎每次驱动程序查找元素时都会实例化一个新列表,因此这没有任何影响。

任何建议或甚至可能吗?

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

+0

在我们提出您问的问题之前,您的网页上存在166个重复ID的问题(除非我误解)。如果那是真的,你需要与你的开发者聊天。 http://softwareengineering.stackexchange.com/questions/127178/two-html-elements-with-same-id-attribute-how-bad-is-it-really – jibbs

+0

在FindBys之后附加[CacheLookup]。这会缓存结果并且不会再次搜索元素。如果你对这个元素的Ajax调用有些问题,你可能会遇到缓存问题。如果你想减少一组结果,你需要微调你的定位器策略,或者让你的开发者按照上面的建议添加独特的ID。只是一个想法也许使用xpath定位器,并寻找按特定的字母集开始的文本,如a,b,c,d ... – Grasshopper

+0

@jibbs这是我实际上要求他们这样做,以便我可以得到在我的页面对象中使用单个ID的整个菜单元素列表。 – Blink

回答

2

看起来你只对第二个元素感兴趣。 我建议创建以下属性:

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

“:第n-的型”是一个CSS选择器通过其索引得到一个集合中的元素。

或者,你可以创建一个方法,通过它的索引检索项目:

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

*注:我用类而不是ID,因为它没有任何意义具有相同ID的多个元素。

+0

我正在使用XCUITest'automationName'功能来支持10.1+自动化,而CSS选择器目前不支持。我应该尝试使用XPath的类似方法吗? – Blink

+0

我使用XPath实现了相同的逻辑,它工作正常。也比以前快得多。谢谢! – Blink

相关问题