如何使用PageFactory在子类中定义@findBy注释?

时间:2019-06-19 22:35:30

标签: c# selenium findby page-factory

我使用Selenium和C#从事自动化项目。 我使用Page Object模式来定义每个页面(及其定位符),然后在Test类中分别定义测试。 我有一个Page类,它是页面的基类,在这里我称之为: PageFactory.InitElements(webDriver,this);

并定义所有页面的通用方法。 然后每个页面都从Page继承,并使用@FindBy批注定义相应的元素:

[FindsBy (How = How.Id, Using = "UserName")]
public IWebElement UserName {get; set; }

[FindsBy(How = How.Id, Using = "UserPass")]
public IWebElement Password { get; set; }

[FindsBy(How = How.Id, Using = "login-btn")]
public IWebElement SubmitButton { get; set; }

添加了一个新的登录页面,我必须同时保留(新的和旧的登录名)并能够在两个页面上运行测试。 两个页面都具有相同的元素(而不是定位符),并且它们必须能够响应相同的方法,例如:登录(用户,通过) 想法是定义类的层次结构:BaseLogin(从Page继承),LoginPage和NewLoginPage(均从BaseLogin继承),其中可以在BaseLogin中定义元素(IWebElement)和通用方法。 然后在每个子类中,将每个元素与相应的定位器关联/关联。

这是为了避免在每个页面上重复允许我与该页面进行交互的代码。

public class BaseLoginPage : Page
{
 protected IWebElement UserName { get; set; }
 protected IWebElement Password { get; set; }
 protected IWebElement SubmitButton { get; set; }
}
    // BaseLogin just define the IWebElement without assign a specific locator.

如何将元素“ IWebElement用户名”与其对应的定位器相关联/关联?

[FindsBy(How = How.Id, Using = "UserName")]   --> in LoginPage Class
[FindsBy(How = How.Id, Using = "user")]       --> in NewLoginPage Class

1 个答案:

答案 0 :(得分:0)

使用or运算符如何?如果两者的登录名都相同,这只会将值发送到页面上的任何定位器。

 [FindsBy(How = How.Id, Using = "user | UserName")]

或XPath

 [FindsBy(How = How.XPath, Using = "//input[@id='user'] | //input[@id='UserName']")]