未找到窗口的Geb测试

时间:2014-05-05 14:20:14

标签: java selenium geb jbehave

在我们的应用程序中是一个简单的输入字段,当按下回车键时将打开一个新窗口。通过简单的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语句。 有什么想法吗?

1 个答案:

答案 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()会抛出NoSuchWindowExceptionwaitFor()闭包内强加另一个循环。如果找到窗口,则返回true,waitFor()将完成。