0

我是赛普拉斯的新手,正在尝试在 POM 上创建框架。我已按照这些步骤创建框架

  1. 使用名为'locators.json' 的文件创建对象存储库,该文件中的数据如下所示
{
    "RxClaims_LoginPage":
    {
        "UserName":"#f0",
        "Password":"#f1",
        "SignInButton":"#xlg0003"
    }
}
  1. 在 Integration>Examples 下,我创建了名为OR_Approch.js的测试,看起来像
/// <reference types="Cypress" />

import ORLoginPage from '../PageObjects/OR_Login'

describe('OR_Approach',function(){

    it('RxClaimsLogin', function()  {
        const login = new ORLoginPage();
        cy.visit('/')
        cy.wait(2000)
        login.EnterData_In_UserName()
        login.Password()
        login.SignInButton()
      })

})

3.我在 Integration>POM 下创建了另一个文件夹,其中包含所有 POM - 其中一个名为OR_Login.js看起来像

class ORLoginPage{


    EnterData_In_UserName()
    {
        cy.fixture('example').then(function (dataJson) {
            this.testData = dataJson;
        })
        cy.fixture('locators').then(function (oRdata) {
            this.objRep = oRdata;
        })  
        cy.enterDatainTextBox(this.objRep.RxClaims_LoginPage.UserName,this.testData.UserName)
        return this
    }  
    Password(){
        return 'cy.enterDatainTextBox(this.objRep.RxClaims_LoginPage.Password,this.testData.Password)'
    }
    SignInButton(){
        return 'cy.clickOnObject(this.objRep.RxClaims_LoginPage.SignInButton)'
    }

}
export default ORLoginPage;
  1. 在 Support commands.js下包含自定义方法,如下所示
 Cypress.Commands.add('enterDatainTextBox', (textBoxElePath, textValue) => { 
 
     cy.get(textBoxElePath).type(textValue)
  })

所以我的问题是我想访问 OR_Login.js 中所有函数的locators.js数据。我已经尝试过beforeEach测试文件的方法,它工作正常,但是当我在像OR_Login.js这样的任何类中使用它时它不起作用。请提出一些建议,以便可以在 POM 类文件中读取固定装置的数据。

4

2 回答 2

0

将 POM 与 Cypress 一起使用的问题在于,它与 Mocha 挂钩(例如beforeEach(),对于可读测试非常有用)。

但是类有构造函数,可以用来填充你的this.testData.

class ORLoginPage{

  constructor() {
    cy.fixture('example').then(function (dataJson) {
      this.testData = dataJson;
    })
    cy.fixture('locators').then(function (oRdata) {
      this.objRep = oRdata;
    })  
  }

  EnterData_In_UserName() {
    cy.enterDatainTextBox(this.objRep.RxClaims_LoginPage.UserName, this.testData.UserName)
    return this
  }  

  Password() {
    ...
  }

  SignInButton(){
    ...
  }

}
export default ORLoginPage;

是异步的cy.fixture(),因为它读取文件,所以使用init()方法可能会更好。

这对于您在 POM 中的任何异步命令都很有用。

class ORLoginPage{

  init() {
    return new Promise((resolve, reject) => {
      cy.fixture('example').then(function (exampleData) {
        this.testData = exampleData
        cy.fixture('locators').then(function (locatorData) {
          this.objRep = locatorData;
          resolve(true)
        })
      })
    }
  }
  ...
/// <reference types="Cypress" />

import ORLoginPage from '../PageObjects/OR_Login'

describe('OR_Approach',function(){

  it('RxClaimsLogin', async function()  {  // add async to the test

    const login = new ORLoginPage();
    await login.init()

    cy.visit('/')
    cy.wait(2000)
    login.EnterData_In_UserName()
    login.Password()
    
    await login.SignInButton()   // may be useful to await other async methods
  })
})
于 2022-02-22T21:09:29.047 回答
0

beforeEach()方法不起作用,OR_Login.js因为它不是测试文件,并且 mocha 没有执行该文件。

相反,您可以简单地将 JSON 文件作为变量导入OR_Login.js并使用该变量。

// OR_Login.js
const locators = require('./path/to/locators.json');

class ORLoginPage {
...
Password(){
        return cy.enterDatainTextBox(locators.RxClaims_LoginPage.Password,locators.Password)
    }
...
}

如果您有将根据类更改的动态数据,您还可以使用构造函数创建您的类,该构造函数将其指向locators.json文件中的正确数据。

尽管如此,赛普拉斯强烈建议您不要将 POM 与赛普拉斯一起使用。如果您确实选择继续使用赛普拉斯的 POM,我强烈建议您在测试中执行的所有函数都包含在执行代码的类中(而不是cy.在测试中混合和您的类),以及研究如何更好地将命令相互链接起来,以便它们在同一个 cypress 命令链中执行。

于 2022-02-22T14:29:41.263 回答