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

How to define a @findBy annotation in a subclass, using PageFactory?

我在一个使用 Selenium 和 C# 的自动化项目中工作。 我使用页面对象模式来定义每个页面(使用它们的定位器),然后在测试 class 中分别定义测试。 我有一个页面 class,它是页面的基础 class,我在其中调用: PageFactory.InitElements (webDriver, 这个);

并定义所有页面的通用方法。 然后每个页面继承自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; }

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

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

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.

如何 associate/relate 元素 "IWebElement UserName" 及其对应的定位器?

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

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

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

或 XPath

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