【发布时间】:2019-06-19 22:35:30
【问题描述】:
我在一个使用 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; }
添加了一个新的登录页面,我必须同时保留(新登录和旧登录),并且能够使用这两个页面运行测试。 两个页面都有相同的元素(不是定位器),并且它们必须能够响应相同的方法,例如:登录(用户,密码) 想法是定义类的层次结构: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
【问题讨论】:
标签: c# selenium findby page-factory