selenium - 如何使用一个Geb模块作为另一个Geb模块中的内容并验证内容?

标签 selenium spock geb

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

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 }
    }
}

然后是 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
    }
}

如何确保它验证 HomePage 类中定义的内容以及向下遍历模块层次结构?我拥有代码的方式(如上所述),我可以将选择器更改为不正确的值,但它仍然不会使测试失败。

由于这是一个单页面应用程序,我想避免使 HomePage 类过长,因此通过使用模块将页面的部分和功能分解为逻辑部分对我来说是有意义的。我更喜欢通过聚合来关联模块,而不是通过扩展更高级别(或包含)的模块来组合,并且它应该能够通过聚合模块的层次结构向下验证内容是有意义的,但请让我知道如果我的假设是错误的。如果我的假设是错误的,我应该如何处理这个问题并避免将所有内容都包含在 HomePage 类中?

谢谢, 史蒂夫

最佳答案

我会直接将每个模块添加到您的页面中,而不是拥有巨大的模块继承链,并且您的页面仅包含单个模块。

然后,您可以将每个模块添加到页面“静态”检查以确认它们已显示,但是此检查不会确认模块内的所有内容均已显示。

如果您想这样做,那么您需要单独检查每个元素,例如:

myModule.myButton.displayed

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

myModule.anotherModule.yetAnotherModule.myButton.displayed

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

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

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

关于selenium - 如何使用一个Geb模块作为另一个Geb模块中的内容并验证内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44779402/

相关文章:

java - Selenium 测试在并行执行时被第二个 session 覆盖

gradle - 通过Gradle使用Geb/Spock进行多个浏览器测试:使用geb.env属性

groovy - 如何使用 GEB 提交表单下载文件

javascript - 使用 Cucumber + capybara + selenium 测试 Rails 应用程序会导致空白页

java - 是否可以在移动仿真中使用 Edge?

python - 如何在 python selenium-webdriver 中获取标题

java - Spock:在 stub 中返回输入参数

unit-testing - Grails升级2.2-> 2.3.7后,Spock测试失败

unit-testing - 使用 spy 模拟方法在测试中的服务(单元测试)中返回的值

grails - 如何通过Geb和Spock通过Grails测试? (使用grails功能测试开发)