Как определить аннотацию @findBy в подклассе с помощью PageFactory?

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

person Emmanuel    schedule 19.06.2019    source источник


Ответы (1)


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

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

или XPath

 [FindsBy(How = How.XPath, Using = "//input[@id='user'] | //input[@id='UserName']")]  
person Dazed    schedule 19.06.2019
comment
Спасибо @Dazed за ваш ответ. Я думаю, что это могло бы решить мою проблему, но, следуя вашему подходу, как я могу это сделать, когда один и тот же IWebElement ссылается на идентификатор на одной странице и на CssSselector на другой? Экзамен: [FindsBy(How = How.CssSelector, Using = ".dp-button")] public IWebElement SubmitButton [FindsBy(How = How.Id, Using = "login-btn")] public IWebElement SubmitButton - person Emmanuel; 21.06.2019
comment
Может ли быть что-то подобное? [FindsBy (How = How.CssSelector | How.Id, Using = .dp-button | login-btn)] Я очень признателен, если кто-нибудь может мне помочь :) - person Emmanuel; 22.06.2019
comment
зачем нужны два разных локатора? XPath или CSS могут найти и то, и другое. - person Dazed; 23.06.2019