我工作的自动化测试,我能够得到的元素列表,我需要在页面上使用下列内容:有没有办法限制页面对象中元素列表的大小?
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手机应用程序的,我们最终希望能够在测试开始时随机选择一种语言。
在我们提出您问的问题之前,您的网页上存在166个重复ID的问题(除非我误解)。如果那是真的,你需要与你的开发者聊天。 http://softwareengineering.stackexchange.com/questions/127178/two-html-elements-with-same-id-attribute-how-bad-is-it-really – jibbs
在FindBys之后附加[CacheLookup]。这会缓存结果并且不会再次搜索元素。如果你对这个元素的Ajax调用有些问题,你可能会遇到缓存问题。如果你想减少一组结果,你需要微调你的定位器策略,或者让你的开发者按照上面的建议添加独特的ID。只是一个想法也许使用xpath定位器,并寻找按特定的字母集开始的文本,如a,b,c,d ... – Grasshopper
@jibbs这是我实际上要求他们这样做,以便我可以得到在我的页面对象中使用单个ID的整个菜单元素列表。 – Blink