javascript - Hur åtgärdar man felet "TypeError: cy.[custom command] är inte en funktion"?


Jag har skrivit några funktioner i commands.js-filen för Cypress-automatiseringstestning, varav jag endast kan anropa en, det vill säga "login", men kan inte anropa andra funktioner från en annan .js-fil. Cypress Test Runner visar

"TypeError: cy.FillAddCaseDetails är inte en funktion"

describe('Adding a Case on CSS Poratal ', function() {

  before(function () {
    cy.login()    // calling login function successfully
  })

  it('open add case',function(){
    cy.wait(9000)
    cy.hash().should('contains','#/home')
    cy.wait(['@GETcontentLoad']);
    cy.wait(['@POSTcontentLoad']);
    cy.get('[uib-tooltip="Add Case"]').click({force:true})
    cy.log('clicked on Add case')
    cy.wait(3000) 
    cy.get('[ng-click="lookup.cancel()"]').click({force: true})
    cy.get('[ng-click="lookup.closeAddCase()"]').click({force: true})
    cy.get('[uib-tooltip="Add Case"]').click({force:true}) 
    cy.wait(3000)
    cy.get('[ng-model="lookup.selectedPartner"]',{force:true})
      .type(AddJob.JobData.Partner,{force: true}) 
    cy.xpath('//input[@ng-model="lookup.selectedPartner"]')
      .should('be.visible').then(() => {
        cy.FillAddCaseDetails()   // unable to call   
        cy.FillCustomerDetails()  // unable to call 
      })

Funktion:

Cypress.Commands.add("FillCustomerDetails", () => {

  cy.get('[ng-model="lookup.firstName"]')
    .type(AddJob.JobData.FirstName, { force: true}) 

  cy.get('[ng-model="lookup.lastName"]')
    .type(AddJob.JobData.LastName, { force: true })

  cy.get('[ng-model="lookup.customerPhone"]')
    .type(AddJob.JobData.CustomerPhone, { force: true })

  cy.get('[value="NEXT"]').click({ force: true })
})

förväntat: funktionen kommer att anropas
faktiskt: TypeError: cy.FillAddCaseDetails är inte en funktion

Svar #1

Detta är det översta resultatet för detta fel så jag skulle vilja lägga till vad jag gjorde för att fixa det. Detta är relevant för version >=10 och TypeScript. Problemet visade sig vara att supportFile-inställningen i cypress.config.ts var satt till false; jag ändrade min konfiguration till detta:

import cypress, { defineConfig } from 'cypress'

export default defineConfig({
  
  e2e: {
    'baseUrl': 'http://localhost:4200',
    supportFile: 'cypress/support/e2e.ts'
  },
  
  
})

Jag skapade de anpassade kommandona i commands.ts

declare namespace Cypress {
  interface Chainable<Subject = any> {
    /**
     * Custom command to select DOM element by data-cy attribute.
     * @example cy.dataCy('greeting')
    */
     clearIndexedDB(): Promise<void>
  }
}

Cypress.Commands.add('clearIndexedDB', async () => {
  const databases = await window.indexedDB.databases();

  await Promise.all(
    databases.map(
      ({ name }) => {
        if (!name) return
        return new Promise((resolve, reject) => {
          const request = window.indexedDB.deleteDatabase(name);

          request.addEventListener('success', resolve);
          request.addEventListener('blocked', resolve);
          request.addEventListener('error', reject);
        })
      },
    ),
  );
});

Sedan avkommenterade jag den här raden i min e2e.ts-fil

import './commands';

Svar #2

Om du lade till ditt anpassade kommando i support/commands.js-filen, måste du importera den filen från support/index.js-filen. Skapa support/index.js om den inte finns och lägg till raden import "./commands.js" i den.

Relaterade artiklar