预扫描网页进行动态测试

See*_*ker 8 cypress

寻找 @JeffTanner 提出的关于生成动态测试的问题明确答案。从这个问题和赛普拉斯样本中,很明显我们需要知道生成它们之前所需的测试数量。

问题

我们有一个网页,其中包含一个医疗保健分析数据表,该数据在一天中刷新多次。每次刷新团队都必须检查数据,为了分配工作,我们将每一行作为单独的测试运行。但行数每次都不同,这意味着我必须计算行数并在每次运行时更新系统。寻找一种以编程方式获取行数的方法。

HTML 是 的表格<tbody><tr></tr></tbody>,因此以下内容足以获取计数,但我无法在 中运行它beforeEach(),抛出的错误是“未找到测试”

let rowCount;

beforeEach(() => {
  cy.visit('/analytics')
  cy.get('tbody tr').then($els => rowCount = $els.length)
})

Cypress._.times(rowCount => {
  it('process row', () => {
    ...
  })
})
Run Code Online (Sandbox Code Playgroud)

Fod*_*ody 7

before:run事件在测试开始之前触发,您可以在那里扫描网页。

在 中设置事件监听器setupNodeEvents()。Cypress 命令不会在此处运行,但您可以使用等效的 Node 命令。

const { defineConfig } = require("cypress");

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('before:run', async (details) => {
        try {
          const fetch = require('node-fetch');
          const fs = require('fs-extra');
          const jsdom = require("jsdom");
          const { JSDOM } = jsdom;                           
          
          const response = await fetch(config.env.prescan);  // default below 
          const body = await response.text();                // or pass in command line

          const dom = new JSDOM(body);
          const rows = dom.window.document.body.querySelectorAll('tr')  // query

          // save results
          fs.writeJson('./cypress/fixtures/analytics-rows.json', {rows:rows.length})

        } catch (error) {
          console.log('error:', error)
        }
      })
    },
  },
  env: {
    prefetch: 'url-for-analytics-page'
  }
})
Run Code Online (Sandbox Code Playgroud)

测试

import {rows} from './cypress/fixtures/analytics-rows.json'  // read row count

Cypress._.times(rows, (row) => {
  it(`tests row ${row}`, () => {
    ...
  })
}
Run Code Online (Sandbox Code Playgroud)


Tes*_*ick 6

一种可能性是在脚本中运行上述 Cypress 测试,pretest该脚本始终在主测试脚本之前运行。

// package.json

{
  ...
  "scripts": {
    "pretest": "npx cypress run --spec cypress/e2e/pre-scan.cy.js",
    "test": "npx cypress run --spec cypress/e2e/main-test.cy.js",
  }
}
Run Code Online (Sandbox Code Playgroud)
// pre-scan.cy.js

it('scans for table row count', () => {
  cy.visit('/analytics');
  cy.get('tbody tr').then($els => {
    const rowCount = $els.length;
    cy.writeFile('cypress/fixtures/rowcount.json', rowCount);
  });
});
Run Code Online (Sandbox Code Playgroud)