1

我在一个使用 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
4

1 回答 1

0

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

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

或 XPath

 [FindsBy(How = How.XPath, Using = "//input[@id='user'] | //input[@id='UserName']")]  
于 2019-06-19T23:12:07.170 回答