在我们的应用程序中有一个简单的输入字段,按下回车键时将打开一个新窗口。通过简单的 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:找不到与规范匹配的窗口
我可以看到新窗口如何打开并且标题是正确的。我还尝试了其他属性来定位窗口并使用等待语句。
有什么想法吗?
最佳答案
您需要使用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()
将完成。
关于java - Geb 测试 withWindow 未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23474800/