Я работаю в проекте автоматизации с 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; }
Была добавлена новая страница входа в систему, и я должен сохранить оба (новый и старый вход в систему) и иметь возможностьзапустить тесты с обеих страниц.Обе страницы имеют одинаковые элементы (не локаторы) , и они должны быть в состоянии отвечать на одни и те же методы , такие как: 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