Я работаю в проекте автоматизации с 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