5

我正在 Geb (WebDriver) 中建立一个测试,该测试需要使用没有提交按钮的表单。从用户的角度来看,使用起来就像输入搜索词并按键盘上的回车键一样简单。

以纯脚本形式使用 Geb,我可以通过将特殊键代码附加到正在输入的文本中来解决此问题,如下所示:

import org.openqa.selenium.Keys

$('input[id=myInputField]') << "michael"+Keys.ENTER

这很好用。但是如果我想使用 Geb 推荐的页面对象模式 (http://www.gebish.org/manual/0.7.1/pages.html#the_page_object_pattern),我看不出我应该做什么。我在 EmployeeSearchPage 对象的内容部分定义什么来复制丢失的 searchButton 及其告诉 Geb 如何处理结果页面的“to”对象引用?

class EmployeeSearchPage extends Page {
    static url = "http://localhost:8888/directory/"
    static at = { title == "Employee Directory" }
    static content = {
        searchField { $("input[id=myInputField]") }
        // THE FOLLOWING BUTTON DOESN'T EXIST IN MY CASE
        searchButton(to: EmployeeListPage) { $("input[value='SUBMIT']") }
    }
}

我意识到我可以在表单中添加一个提交按钮来进行测试,并使用 CSS 将其置于用户视图之外,但为什么我必须让应用程序适应测试呢?事情应该反过来。

我一直在评估许多 Web 测试框架,发现这种类型的表单对其中许多人来说是个问题——至少就他们的文档而言。

有任何想法吗?谢谢!

4

2 回答 2

7

你不需要使用js集成来实现你想要的。

您还可以在页面类上定义方法,而不仅仅是内容。您可以实现一个提交方法,该方法将通过以下方式执行您正在寻找的内容:

class EmployeeSearchPage extends Page {
    static url = "http://localhost:8888/directory/"
    static at = { title == "Employee Directory" }
    static content = {
        searchField { $("input[id=myInputField]") 
    }

    void submitForm() {
        searchField << Keys.ENTER
        browser.page EmployeeSearchResultsPage
    }
}

然后使用它:

to EmployeeSearchPage
searchField << 'michael' // searchField = 'michael' would have the same effect
submitForm()
于 2013-01-08T13:06:58.253 回答
1

Geb 支持在浏览器上下文中执行 JavaScript,详细信息可以在 Geb 文档中找到。

您可以使用它来提交表单,就像在 webapp 本身中使用 JavaScript 提交表单一样。例如,如果您使用 jQuery,它会很简单:

js.exec('$("#myForm").submit()')
于 2013-01-08T07:56:31.987 回答