如何将一个 Geb 模块用作另一个 Geb 模块中的内容并验证内容?

How to use a Geb module as content in another Geb module and verify content?

我正在使用 Geb (1.1.1) 和 Spock (1.1-groovy-2.4) 和 selenium 驱动程序 (2.53.1) 来测试 Angular 4 网络应用程序。如果我有一个单页 Web 应用程序,如果我想将内容设置为模块层次结构,我如何确保如果我导航到页面对象,它会查看模块层次结构并验证内容?例如,如果我有以下页面 class:

class HomePage extends Page {
    static url = 'home'
    static at = {
        title == 'Home Page' && mainViewModule.displayed
    }
    static content = {
        mainViewModule { module MainViewModule }
    }
}

然后 MainViewModule 定义如下:

class MainViewModule extends Module {
    static content = {
        mainView { $('div', class: 'main-view') }
        dashboardModule { module DashboardModule }
    }
}

然后是仪表板模块:

class DashboardModule extends Module {
    static content = {
        dashboard = { MainViewModule.find 'dashboard' }
        subModule1 = { module SubModule1 }
        subModule2 = { module SubModule2 }
    }
}

子模块通常如下所示:

class SubModuleX extends Module {
    static content = {
        ...
    }
}

如果我的测试(使用 Spock)执行以下操作:

class SomeSpec extends GebReportingSpec {
    def 'navigate to the home page'() {
        when:
        to HomePage

        then:
        at HomePage
    }
}

我如何确保它验证主页 class 中定义的内容以及模块层次结构中的内容?我拥有代码的方式(如上所述),我可以将选择器更改为不正确的值,但它仍然没有通过测试。

由于这是一个单页应用程序,我想避免使主页 class 过长,因此通过使用模块。我更喜欢通过聚合来关联模块,而不是通过扩展更高级别(或包含)的模块来组合,并且它应该能够通过聚合模块的层次结构向下验证内容是有道理的,但请让我知道如果我的假设是错误的。如果我的假设有误,我应该如何处理并避免在主页中包含所有内容 class?

谢谢, 史蒂夫

与其拥有巨大的模块继承链,让您的页面只包含一个模块,不如直接将每个模块添加到您的页面。

然后您可以将每个模块添加到您的页面"static at"检查以确认它们已显示,但是此检查不会确认模块中的所有内容都已显示。

如果您希望这样做,则需要单独检查每个元素,例如:

myModule.myButton.displayed

如果您有继承模块的模块,您最终会得到:

myModule.anotherModule.yetAnotherModule.myButton.displayed

但是,如果您的测试尝试与页面上不存在的模块内容进行交互,您的测试将失败,因此在页面 "at" 检查中加入大量断言似乎有点过分了。

为什么不创建您的页面,添加一些模块来拆分内容,然后创建一个快速冒烟测试来断言您关心的每个元素都存在?

否则,如果您使用 "at" 检查断言页面内容,则您 运行 导航到您页面的每个测试都将花费大量时间来断言所有内容都存在。

你可以这样做:

class HomePage extends Page {
    static url = 'home'
    static at = {
        title == 'Home Page' && mainViewModule.verify()
    }
    static content = {
        mainViewModule { module MainViewModule }
    }
}

然后在你的 mainViewModule 里面:

class MainViewModule extends Module {
    static content = {
        mainView { $('div', class: 'main-view') }
        dashboardModule { module DashboardModule }
    }

    def verify(){
        try{
            //assert content for this module here
            return dashboardModule.verify()
        }
        catch(GebAssertionError ae){
            return false
        }
    }
}

然后在 DashboardModule 中:

class DashboardModule extends Module {
    static content = {
        dashboard = { MainViewModule.find 'dashboard' }
        subModule1 = { module SubModule1 }
        subModule2 = { module SubModule2 }
    }
    def verify(){
        try{
            //assert content for this module here
            return subModule1.verify() && subModule2.verify()
        }
        catch(GebAssertionError ae){
            return false
        }
    }
}

我假设您可以遵循此处的模式,但如果您不能,请告诉我,我会进一步解释。