javascript - 当整个类运行时,Spock 非初始功能方法失败

标签 javascript jquery spock geb

我正在使用 Geb 和 Spock 一起测试前端应用程序。我对这两个工具都很陌生。我有一个扩展 GebReportingSpec 的 Spock 规范。

然后我有一个 setupSpec 可以登录应用程序并导航到特定页面。接下来是在网页上执行操作的各种功能方法(例如单击下拉菜单,然后选择一个选项)。

所有功能方法单独运行时均成功通过。第一个功能方法只是从下拉列表中选择一个值,并断言正确的字段显示为结果(所选选项控制哪些字段显示在页面上)。第二个功能方法无法从下拉列表中选择不同的选项,因此该方法的断言失败,因为它找不到字段。通过更新新字段的事件不会触发该选项。我的规范如下:

    class VerifyFields extends GebReportingSpec {
        def setupSpec() {
          // Log in
          via Dashboard
          loginForm.login("marco", "abc123")

          // Navigate to Page 1
          button1.click()
          button2.click()

          // Click Button 3
          button3.click()
    }

// This feature method passes successfully
    def "Verify Member fields exist"() {
        when: "User selects Member option for drop down 1"
        at Page1
        projSubject.click()
        projCoverMbrFields.projSubjectMbrOption.click()
        sleep(1500)

        then: "All expected member fields are displayed in the left panel"
        assert mbrName.present
    }

// This feature method fails when run after the first feature method
    def "Verify Provider fields exist"() {
        when: "User selects Provider option for subject type"
        at Page1
        projSubject.click()
        projCoverProvFields.projSubjectProvOption.click()
        sleep(1500)

        then: "All expected provider fields are displayed in the left panel"
        assert provName.present
    }

我尝试添加一些内容以使页面专注于如下所示的元素:

driver.findElement(By.className("projSubject")).click()
driver.findElement(By.cssSelector(".projSubjectoption[value='Provider']")).click()

并使用以下行将属性更改为 selected="selected":

$("select.projSubject option[value='Provider']").jquery.attr("selected", true)
projCoverProvFields.projSubjectProvOption.jquery.attr('selected', 'selected')

但我所做的一切都无法解决第二个功能方法无法成功触发下拉选择以更新页面上字段的问题。

最佳答案

您的错误可能是因为您正在运行 setupSpec(),它每个规范运行一次(而不是每个方法运行一次)。为了维护规范中所有方法的 session 并按顺序运行它们,您需要在类的顶部添加 @Stepwise spock 属性。

@Stepwise
class VerifyFields extends GebReportingSpec {
   ...
}

另一种选择是使用 setup() 而不是 setupSpec(),以下是差异:

def setup() {}          // run before every feature method
def setupSpec() {}     // run before the first feature method

通过使用 setupSpec(),它将在第一个功能方法之前运行,这就是两个测试可以单独工作的原因。尝试用 setup() 替换 setupSpec()。

请记住,运行 setup() 会增加您的总测试执行时间,因为您将对每个方法重复执行。如果可能的话我会使用@Stepwise。

关于javascript - 当整个类运行时,Spock 非初始功能方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46350698/

相关文章:

javascript - 为什么我的 "Back to Top"按钮在 Firefox 上失败?

javascript - 让 timeOut() 从数组中每秒播放一首歌曲

javascript - 一个 HTML 元素的多个选择器的简短语法

unit-testing - 用于 SQL 注入(inject)的 Grails Spock 编写单元/集成测试用例

javascript - 在jquery中获取div的值?

javascript - 缩小可能与其他脚本一起运行的 JavaScript 代码是否安全?

javascript - 当父 ul 设置溢出隐藏时,子 ul 不显示

javascript - 如何每 x 秒更改数组中 <li> 的内容?

spring - 使用 Spock 在 Spring 中测试 Mock Bean

grails - 在运行测试用例时,为属性指定了不存在的映射属性[none]