Как определить аннотацию @findBy в подклассе, используя PageFactory? - PullRequest
1 голос
/ 20 июня 2019

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

1 Ответ

0 голосов
/ 20 июня 2019

Как насчет использования оператора или? Если логин для обоих одинаков, это просто отправит значение тому, что находится на странице.

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

или XPath

 [FindsBy(How = How.XPath, Using = "//input[@id='user'] | //input[@id='UserName']")]  
...