使用 fixture 和 POM 时,cypress 返回 "undefined" 参数

cypress returning "undefined" argument when using fixture and POM

在修复了我的固定装置的一些问题后,我正在使用 POM 玩弄柏树脚本,但是每当我希望我的函数键入我的 JSON 文件中的一些数据时,我会收到以下消息

cy.type() can only accept a string or number. You passed in: undefined

这是我的代码,我确保遵循有关如何使用固定装置的正确说明

import loginPage from '../POM/pomtest.js'

const credentials = require('../../fixtures/loginTestCases.json')

/// <reference types= "cypress" />
describe("test suite", function(){
    let credentials;

    before(() => {
        cy.fixture('loginFixture').then((logindata) =>{
            credentials = logindata;
            return credentials
        });
    })

    beforeEach(() =>{
        loginPage.visit();
        cy.wrap(credentials).as('credentials')
    })

    it('incorrect username', function (){
        loginPage.clickLoginBtn()
        loginPage.typeUsername(this.credentials.usernameIncorrecto);
        loginPage.typePassword(this.credentials.passwordCorrecto);
        loginPage.clickLoginBtn();
        loginPage.elements.myNotes().should('have.text', this.credentials.loginFallido);
    })

    it('incorrect password', function (){
        loginPage.clickLoginBtn()
        loginPage.typeUsername(this.credentials.usernameCorrecto);
        loginPage.typePassword(this.credentials.passwordIncorrecto)
        loginPage.clickLoginBtn()
        loginPage.elements.myNotes().should('have.text', this.credentials.loginFallido)
    })

    it('Valid Login', function (){
        loginPage.clickLoginBtn()
        loginPage.typeUsername(this.credentials.usernameCorrecto);
        loginPage.typePassword(this.credentials.passwordCorrecto)
        loginPage.clickLoginBtn()
        loginPage.elements.myNotes().should('have.text', this.credentials.loginCorrecto)
    })
})

这是我的 POM 文件

class loginPage{
    elements = {
        usernameInput: () => cy.xpath("//input[@placeholder='Username']"),
        passwordInput: () => cy.xpath("//input[@name='login.password']"),
        loginBtn: () => cy.get('button').contains('Login'),
        errorMsg: () => cy.get('#login-error-message'),
        myNotes: () => cy.get('H2')
    }

    typeUsername(username){
        this.elements.usernameInput().type(username);
    }

    typePassword(password){
        this.elements.passwordInput().type(password);
    }

    clickLoginBtn(){
        this.elements.loginBtn().click();
    }

    visit(){
        cy.visit("http://testapp.galenframework.com/")
    }

    fillemail(value){
        let field = cy.xpath("//input[@placeholder='Username']")
        field.clear()
        field.type(value)
    }

    fillpassword(value){
        let field = cy.xpath("//input[@name='login.password']")
        field.clear()
        field.type(value)
    }
}
//export default loginPage
module.exports = new loginPage();

我在尝试键入 JSON 文件中的内容时遇到错误

[
  {
  "usernameIncorrecto": "incorrecto@gmail.com",
  "passwordIncorrecto": "incorrecta",
  "usernameCorrecto": "testuser@example.com",
  "passwordCorrecto": "test123",
  "loginFallido": "The username or password are incorrect",
  "loginCorrecto": "My Notes"
}
]

你的问题是你的 credentials 变量是一个数组,但你正试图直接访问变量没有的属性。 (此外,您调用的属性在对象上不存在,即使它们被正确引用也是如此。您应该切换到通过索引查找数据,或者在对象上使用名称 属性。

// accessing data via an index
    it('incorrect username', function (){
        loginPage.clickLoginBtn()
        loginPage.typeUsername(this.credentials[0]. usernameIncorrecto);
        loginPage.typePassword(this.credentials[0]. passwordIncorrecto);
        loginPage.clickLoginBtn();
        loginPage.elements.myNotes().should('have.text', this.credentials[0]. loginFallido);
    })

请注意上面我是如何使用 this.credentials[0] 访问您的 JSON 中的第一个对象的。使用此方法,您还可以在 it 块的开头声明一个变量以简化此操作。

it('incorrect username', function() {
  const creds = this.credentials[0];
  ...
  loginPage.typeUsername(creds.usernameIncorrecto);
  ...
})