我使用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
答案 0 :(得分:0)
使用or运算符如何?如果两者的登录名都相同,这只会将值发送到页面上的任何定位器。
[FindsBy(How = How.Id, Using = "user | UserName")]
或XPath
[FindsBy(How = How.XPath, Using = "//input[@id='user'] | //input[@id='UserName']")]