我试图找出使Page对象简单的最佳方法,以及是否将所有逻辑放在其他地方。所有Selenium代码/功能是否应该在Page对象中,或者在我用来访问它的Step Definition方法中。
我有以下结构:
cucumber .特征文件
Given blablabla
Java/Kotlin步骤定义
@Given("^blablabla$") {
}
和页面对象文件
fun getOwnerFields(): MutableList<WebElement> {
return driver.findElements(By.if("owner-fields")
}
举个简单的例子。
现在,我不能与自己达成一致,也不能找到许多其他人的意见,是:
我应该在Step Definition类中还是在Page对象中执行页面操作-例如,单击按钮?
这一点:
@Given("^I click on the Next button$") {
startPage.nextButton().click()
}
PO:
fun nextButton(): WebElement {
return driver.findElement(By.id("next-button")
}
或:v
@Given("^I click on the Next button$") {
startPage.clickNextButton()
}
PO:
fun clickNextButton(): WebElement {
return driver.findElement(By.id("next-button").click()
}
我倾向于认为最好将所有页面和selenium代码保存在Page对象中。但在这种情况下,这会使PO更大,因为我需要不同的方法来进行点击、检查可见性、计数等。而如果所有这些都在步骤定义中完成,PO实际上可以只包含页面元素的getter和setter。
我知道这并不是那么重要,但是我倾向于用最好的和/或最干净的方式来组织我的代码。
1条答案
按热度按时间gcxthw6b1#
这确实是一个基于观点的问题。它取决于一系列因素,包括你的应用程序可以做什么,以及用户交互的灵活程度。
至于我,因为你的核心抽象被假设在Gherkin语句级别上,我想说我没有意义把很多抽象放在较低的级别上。
Button并不是一个很好的例子,因为通常你只能点击它,所以几乎没有其他类型的交互。但是对于其他元素,我的选择肯定会落在你的第一种方法。
这种方法可以让您专注于特定于步骤的逻辑,以便在步骤定义中可以清楚地看到那里发生了什么,而无需在类中进行额外的导航。