我在一个使用 Selenium 和 C# 的自动化项目中工作。我使用页面对象模式来定义每个页面(及其定位器),然后在 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; }
添加了一个新的登录页面,我必须同时保留(新登录和旧登录)并能够使用这两个页面运行测试。两个页面具有相同的元素(不是定位器),并且它们必须能够响应相同的方法,例如:login (user, pass) 想法是定义类的层次结构: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 UserName”与其相应的定位器关联/关联?
[FindsBy(How = How.Id, Using = "UserName")] --> in LoginPage Class
[FindsBy(How = How.Id, Using = "user")] --> in NewLoginPage Class