是否可以在单个测试中使用多个页面对象而不进行链接?

时间:2017-08-16 07:42:59

标签: javascript selenium nightwatch.js pageobjects cucumberjs

我有3个页面对象:main.js,login.js和menu.js,并假设它们的函数名称与文件名相同,这是一系列测试

  • main:main()
  • 登录:login()
  • menu:menu()

例如,我在main.js中有以下内容

module.exports={
  commands=[{
      main:function(){
        return this.click("@login")
      }
  }],
  elements:{
     login: {
       locateStrategy:'xpath'
       selector: ('//a[@name="Log in"]')
      }
  }
}

测试序列之一是主要的 - >登录 - >菜单。

我尝试了以下内容:

var main = client.page.main()
var login = client.page.login()
var menu=client.page.menu()
...
var ok=main.main()
if(!ok){
 return ok
}else {
 return login.login()&&menu.menu()
}

但不断收到错误消息:

{ status: -1,
  value:
   { error: 'invalid session id',
     message: 'No active session with ID null',
     stacktrace: '' },
  errorStatus: 6,
  error: '' }

如何通过调用页面对象来更改客户端? 和我的问题的任何合适的解决方案? 我已经检查了Multiple page objects in one test case,但这对我的情况并没有多大帮助,因为我必须多次重复使用这些对象。(不仅仅是A-> B-> C,可能是A-> C- > B或A-> C)

1 个答案:

答案 0 :(得分:0)

根据我上面提到的链接问题,我在每个页面对象中添加了额外的回调,从而找到了可行的解决方案。

Main.js:

module.exports={
  commands=[{
      main:function(callback){
        return this.click("@login")
                   .perform(callback)
      }
  }],
  elements:{
     login: {
       locateStrategy:'xpath'
       selector: ('//a[@name="Log in"]')
      }
  }
}

Login.js

module.exports={
      commands=[{
          login:function(callback){
            return this.setValue("@id",'admin')
                       .setValue("@pw",'admin')
                       .perform(callback)
          }
      }],
      elements:{
         id: {
           locateStrategy:'xpath'
           selector: ('//input[@name="id"]')
          }
          pw: {
           locateStrategy:'xpath'
           selector: ('//input[@name="password"]')
          }
      }
    }

Menu.js:

module.exports={
  commands=[{
      menu:function(callback){
        return this.waitForElementVisible("@welcome")
                   .perform(callback)
      }
  }],
  elements:{
     welcome: {
       locateStrategy:'xpath'
       selector: ('//a[@name="Welcome !"]')
      }
  }
}

在我的测试中:

var main=client.page.main()
var login=client.page.login()
var menu=client.page.menu()
...
return main.main(function(){
          login.login(function(){
            menu.menu(function(){})
          })
       })

不是我想要实现的方式(不是链接页面对象),但它以这种方式工作。