使用页面对象模型处理导航的最佳方法是什么(java)

时间:2018-03-13 16:38:56

标签: java selenium serenity-bdd

我对页面对象模式比较新。处理标题导航的最佳方法是什么?我不希望每个部分有多个方法或使用枚举来存储定位器。这种方法有意义,还是有更好的选择?

这是我使用Serenity BDD的代码:

HeaderNavigationPage

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();
}

}

LoginSteps

公共类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());

}

1 个答案:

答案 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);
}