如何将一个 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
}
}
}
我假设您可以遵循此处的模式,但如果您不能,请告诉我,我会进一步解释。
我正在使用 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
}
}
}
我假设您可以遵循此处的模式,但如果您不能,请告诉我,我会进一步解释。