Geb 测试:如何点击控制器动作的 link?

Geb testing: How to click the link of a controller action?

我正在为 Grails 应用程序完成 Geb 测试的一部分,但在文档中找不到它(尽管我可能忽略了一些东西)。您如何 select 并单击控制器操作的 link ?这是具有控制器操作的表单元素 link(我不得不重命名一些东西...)

是elementId的问题还是需要找别的地方?通常我可以用 # select 或就好了。很难在文档中找到示例。非常感谢任何帮助或指导。

(使用 Grails 2.4.3、Geb 9.3 和 Firefox 37.0.2)

表单项:

    <li id="formItemID">
        <g:link elementId="linkId" controller="controller" action="linkAction">Link Text HERE</g:link>
    </li>

Geb 测试:

def "test controller action link"(){
    when:
    go linkURL here 
    $('#linkId').click()  // this won't hit
    then:
    $('.some kind of panel-heading').value('something value...')

}

查看 firebug(或 chrome 开发控制台,或其他)中呈现的 HTML。

渲染了什么?

<li id="formItemID">
    <a id="linkId" href="http://localhost:8080/controller/linkAction">Link Text HERE</g:link>
</li>

如果看起来像这样,那么您应该可以使用您提供的代码片段点击 link。

$('#linkId').click()

或者,您可以尝试以下方法:

$("a", id: "linkId").click()
$("li", id: "formItemID").find("a")[0].click()

通常,我会这样创建 links:

<a id="myId" href="${createLink(controller: 'myController', action: 'myAction')}">link text</a>

所以我更确定渲染的 HTML 输出是什么。

编辑:

创建 geb 测试的一些技巧

  • 使用 GGTS 中的调试器。在您的测试方法中放置一个断点,并尝试使用 Display View.
  • 引用 DOM 部分的不同方法
  • 当您弄清楚如何与特定 UI 组件(如 JQGrid table、Select2 下拉列表等)交互时,将此功能封装在实用程序方法中
  • 对于新用户注册、密码重置等顺序流程,再次将它们封装在实用程序方法中。您将真正减少测试中的膨胀,如果注册(或其他)过程发生变化,您只需在一个地方更改测试。
  • 尽量避免使用 Thread.sleep(),它是通往不稳定测试世界的单程票。如果您需要等待某些 ajax 完成,请创建一个等待加载微调器消失的实用方法,并从您的测试中调用它。