我正在使用 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/