我对页面对象模式比较新。处理标题导航的最佳方法是什么?我不希望每个部分有多个方法或使用枚举来存储定位器。这种方法有意义,还是有更好的选择?
这是我使用Serenity BDD的代码:
public class HeaderNavigation extends PageObject{
@FindBy(xpath = "")
private WebElementFacade categoryMenu;
@FindBy(xpath = "(//button[contains(@title,'Sign In')])[1]")
private WebElementFacade signInButton;
@FindBy(xpath = "")
private WebElementFacade timeslotButton;
public WebElementFacade getCategoryMenu() {
return categoryMenu;
}
public WebElementFacade getSignInButton() {
return signInButton;
}
public WebElementFacade gettimeslotButton() {
return timeslotButton;
}
public void ClickOnHeaderNavItem(WebElementFacade element){
boolean elementVisible = element.isVisible();
if (!elementVisible) {
element.withTimeoutOf(30, SECONDS).waitUntilVisible();
}
element.click();
}
}
公共类LoginInSteps {
private HeaderNavigation headerNavigation;
private HomePage homePage;
private LoginPage loginPage;
@Step("The user is on login page")
public void OpenLoginPage() {
homePage.open();
headerNavigation.ClickOnHeaderNavItem(headerNavigation.getSignInButton());
}
答案 0 :(得分:0)
我发现我做得很好的是为任何类型的可重用元素创建一个类,比如导航栏,并在每个使用它的页面的构造函数中创建它,或者更好 - 如果你是为您的页面对象使用某种工厂。
我有一些像这样的方便的C#selenium代码,它应该得到重点。
可重复使用的MenuBar(与标题导航一样):
public class MenuBar
{
private readonly IWebDriver _driver;
public MenuBar(IWebDriver driver)
{
_driver = driver;
PageFactory.InitElements(driver, this);
}
[FindsBy(How = How.XPath, Using = "(//button[contains(@title,'Sign In')])[1]")]
public IWebElement LogInButton { get; set; }
public LoginPage ClickLogin()
{
LogInButton.Click();
// Page object chaining, you could use a void return type instead
return new LoginPage(_driver);
}
}
HomePage构造函数:
public class HomePage
{
private readonly IWebDriver _driver;
public HomePage(IWebDriver driver)
{
_driver = driver;
MenuBar = new MenuBar(driver);
}
public MenuBar MenuBar { get; }
}
用于测试:
[Test]
public void TestLogin()
{
var homePage = new HomePage(Driver);
var loginPage = homePage.MenuBar.ClickLogin();
loginPage.Login("username", "password");
Assert.True(someCondition);
}