【发布时间】:2015-07-25 00:43:44
【问题描述】:
我正在使用 PageFactory 在 Selenium WebDriver for C# 中构建页面对象模型。
不幸的是,我发现FindsByAttribute 不会初始化SelectElement(HTML <select> 标记/下拉菜单)。到目前为止,我已经碰巧或提出了一些解决它的想法,但没有一个是理想的:
-
PageFactory和FindsByAttribute是sealed,所以我不能通过继承它们来强制它。 - 在每个方法中手动从
IWebElement实例化SelectElement是相当混乱和重复的。它还忽略了PageFactory中明显的内置等待并抛出NoSuchElementExceptions,除非我每次执行此操作时都添加等待 - 这将需要在整个地方重复定位器,从而破坏(部分)目的POM。 - 用
SelectElement属性包装每个IWebElement属性不会那么混乱,但仍然存在与上述相同的等待问题。
目前最好的选择是#3,并为SelectElement 编写一个包装器,它只是为每个方法添加一个等待。虽然这个解决方案会工作,但它会大量增加每个页面的代码,而不是这个(假设的)漂亮代码:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
public SelectElement MonthDropdown;
我被一个 wrapper 包装器困住了(我宁愿避免这种情况),并且:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
private IWebElement _monthDropdown;
public Selector MonthDropdown
{
get { return new Selector(MonthDropdown, Wait); }
}
Selector 是 SelectElement 包装器,它还必须接受 IWait<IWebDriver> 以便它可以等待,并在我每次访问它时实例化一个新的 Selector。
有更好的方法吗?
编辑: 昏昏欲睡地输入了错误的访问修饰符。固定的。谢谢,@JimEvans。
【问题讨论】:
-
非常感谢您提出这个问题和回答。 +1
标签: c# selenium drop-down-menu selenium-webdriver pageobjects