在我们的应用程序中是一个简单的输入字段,当按下回车键时将打开一个新窗口。通过简单的geb测试,我可以写下这个:
withNewWindow({ inputField << Keys.ENTER }, wait:true){ at(TargetPage) }
但是现在我们引入了jbehave,结果我们得到了测试步骤(在我看来,如果我们使用spock或任何其他框架,它将是相同的。)
现在我们的测试将成为:
class StartPageSteps extends GebTest {
@When("enter is pressed")
void pressEnter() {
at StartPage
inputField << Keys.ENTER
}
@Then("target page was opened")
void targetPageWasOpened() {
withWindow({$('title').text() == 'title'}){at(TargetPage)}
}
}
还有单独的类来描述页面(简化版本):
class StartPage extends Page {
static at = { title == "StartPage" }
static url = "..."
static content = {
inputField { $("input")}
}
}
class TargetPage extends Page {
static at = { title == "title"}
}
但这失败了org.openqa.selenium.NoSuchWindowException: Could not find a window that would match the specification
我可以看到新窗口是如何打开的,标题是正确的。我还尝试了其他属性来定位窗口并使用了wait语句。
有什么想法吗?
答案 0 :(得分:2)
您需要使用Page.getTitle()
来检索当前页面标题,$('title')
无法正常工作。你的代码应该是:
@Then("target page was opened")
void targetPageWasOpened() {
withWindow({title == 'title'}) {at(TargetPage)}
}
修改强>
如果窗口是异步打开的,那么您可以通过waitFor()
调用来包装代码。
@Then("target page was opened")
void targetPageWasOpened() {
waitFor {
withWindow({ isAt TargetPage }) { true }
}
}
isAt()
会抑制任何断言错误,如果您不在TargetPage
,则会返回false。如果找不到包含该页面的窗口,则withWindow()
会抛出NoSuchWindowException
在waitFor()
闭包内强加另一个循环。如果找到窗口,则返回true,waitFor()
将完成。