Javascript Spock非初始特性方法在将类作为一个整体运行时失败

Javascript Spock非初始特性方法在将类作为一个整体运行时失败,javascript,jquery,spock,geb,Javascript,Jquery,Spock,Geb,我正在使用Geb和Spock一起测试前端应用程序。这两种工具我都不熟悉。我有一个Spock规范,它扩展了GebReportingSpec 然后我有一个setupSpec,它登录到应用程序并导航到特定页面。接下来是在网页上执行操作的各种功能方法(例如单击下拉菜单,然后选择选项) 所有特征方法在自己运行时都会成功通过。第一个feature方法只是从下拉列表中选择一个值,并断言结果显示正确的字段(所选选项控制页面上显示的字段)。第二个feature方法无法从下拉列表中选择其他选项,因此该方法的断言将失

我正在使用Geb和Spock一起测试前端应用程序。这两种工具我都不熟悉。我有一个Spock规范,它扩展了GebReportingSpec

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

所有特征方法在自己运行时都会成功通过。第一个feature方法只是从下拉列表中选择一个值,并断言结果显示正确的字段(所选选项控制页面上显示的字段)。第二个feature方法无法从下拉列表中选择其他选项,因此该方法的断言将失败,因为它找不到字段。在更新新字段的事件未触发时选择该选项。我的规格如下:

    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()
$("select.projSubject option[value='Provider']").jquery.attr("selected", true)
projCoverProvFields.projSubjectProvOption.jquery.attr('selected', 'selected')
并使用以下行将属性更改为have select=“selected”:

driver.findElement(By.className("projSubject")).click()
driver.findElement(By.cssSelector(".projSubjectoption[value='Provider']")).click()
$("select.projSubject option[value='Provider']").jquery.attr("selected", true)
projCoverProvFields.projSubjectProvOption.jquery.attr('selected', 'selected')

但是,我所做的任何事情都无法解决第二个feature方法无法成功触发下拉选择以更新页面上的字段的问题。

您的错误可能是因为您正在运行setupSpec(),它将按规范运行一次(而不是按方法运行一次)。为了维护规范中所有方法的会话并运行它们,您需要在类的顶部添加@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(),它将在第一个feature方法之前运行,这就是为什么两个测试可以单独工作的原因。尝试将setupSpec()替换为setup()


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

将@Stepwise spock属性添加到我的类的顶部解决了这个问题!非常感谢你,我花了几个小时试图解决这个问题!没问题-很高兴这有帮助:)