当前位置: 首页 > 知识库问答 >
问题:

如何将列数据读入变量并在测试咖啡馆的所有测试函数(单个规格)中共享它

祁俊拔
2023-03-14

我在这里读过多篇关于读取表数据的文章,然而,每篇文章都是关于如何在单个测试函数中读取和使用这些数据。如何在中读取表,并在测试规范中的任何测试函数中使用它?

如果我把它写进一个测试函数,它会工作,并正确地返回所有信息:

import { sAdmin } from "..authentication";
import TablePage from "../TablePage";

const tablePage = new TablePage();

fixture `A fixture`
    .page`https://subdomain.example.com/#/table`
    .beforeEach( async t => {
        await t
            .resizeWindow(1284, 722)
            .useRole(sAdmin);
    });

// this will work, but this won't share context with any other test function in the spec
// this should be initialized at the start to be able to verify search clears
test(`A test`, async t => {
    const tableColumn = await tablePage.woNumber;
    const tableCount = await tablePage.woNumber.count;
    const cellData = [];

    for (let i = 0; i < tableCount; i++) {
        const text = await tableColumn.nth(i).innerText;

        cellData.push(text);
    }

    console.log('in spec - tableCount', tableCount);
    console.log('in spec - cellData', cellData);
});

两个控制台日志的输出都是正确的:

in spec - tableCount 4
in spec - cellData [ '0007', '0003', '0005', '0006' ]

我在测试规范和页面对象模型(POM)中尝试了一个异步函数。异步函数在我的规范中不起作用,除非它在测试函数中。POM中的一个可以工作,它将被调用,但是我不能执行const tableCount=wait tablePage.woNumber.count 它会对我大叫,我不能使用这样的选择器。这是因为修饰符。计数。我将.count调整为在for循环中,但这只是返回了未定义的数据或其他没有帮助的数据。

我的页面对象模型中的异步函数示例(TablePage)

async rowCount() {
    const tableColumn = await tablePage.fooSelector;
    const tableCount = await tablePage.fooSelector;
    const cellData = [];

    for (let i = 0; i < tableCount.count; i++) {
        const text = await tableColumn.nth(i).innerText;

        cellData.push(text);
    }

    console.log('in page - tableColumn', tableColumn);
    console.log('in page - tableCount', tableCount);
    console.log('in page - cellData', cellData);

    return tableCount;
};

在我的spec文件中使用此函数调用它,但不确定在何处调用它:

const count = tablePage.rowCount();

我需要在页面加载后运行它来获取单元格数据,并允许我至少在这个规范文件中的所有测试中共享上下文。我更愿意把它放在我的POM中,这样它就可以在其他测试中使用。但是我可以接受它在我的测试规范中工作,而不在测试函数中,这样它就可以在规范文件中的所有测试中共享。

我试着做一个fixture上下文,但也有问题,返回了未定义的结果。这是一个我尝试过的前一个上下文,但不起作用。

.before( async ctx => {

    const tableColumn = await tablePage.fooSelector;
    const tableCount = await tablePage.fooSelector;

    for (let i = 0; i < tableCount.count; i++) {
        const text = await tableColumn.nth(i).innerText;

        ctx.cellData.push(text);
    }

    // console.log('in spec - tableCount', tableCount);
    // console.log('in in spec - cellData', cellData);
})

这些控制台日志返回未定义的或对象,而不是文本。

任何帮助将不胜感激。以下是我已经引用的资源:

TestCafe-在变量中存储选择器的结果

如何使用testCafe获取表的所有单元格的文本

Testcafe从元素获取文本

https://testcafe.io/documentation/402670/reference/test-api/domnodestate

编辑:我仍然在寻找一种方法来共享我获得的数据的上下文,我无法将数据返回到测试规范。也许如果我做更多的修补,我可以共享我获得的值。

这是我的解决方案,它不共享上下文,但它确实让我防止代码在每个测试函数中重用。

页面对象模型

import { Selector, t } from "testcafe";

class TablePage{
    constructor() {
        this.searchInput = Selector('#searchInput');
        this.tableCount = Selector('.class-selector');
    };

    async validateSearchResults(selector, searchText) {
        await t
            .typeText(this.searchInput, searchText)
            .pressKey('enter');

        const rowCount = await this.tableCount.count;
        let searchResults = []

        for (let i = 0; i < rowCount; i++) {
            let text = await selector.nth(i).innerText;

            searchResults.push(text);
            await t.expect(searchResults[i]).contains(searchText);
        }
    };

}

export default TablePage;

规格文件

import { sAdmin } from "..authentication";
import TablePage from "../TablePage";

const tablePage = new TablePage();

fixture `Test search functionality`
    .page`https://examplepage.com`
    .beforeEach( async t => {
        await t
            .useRole(sAdmin)
    });

test(`User can search via order number`, async t => {
    await tablePage.validateSearchResults(tablePage.tableCount, 'foo');
});

共有1个答案

云和硕
2023-03-14

const tableCount=wait tablePage.selector.count;看起来正确,应该可以工作。另外,有必要调用带有wait关键字的async方法:

const count=wait tablePage.rowCount()

下面是一个类似方法的示例:

table-page.js

import { Selector } from 'testcafe';

export class TablePage {
    constructor () {
        this.tableCells = Selector('#ContentHolder_grid_DXDataRow0 td');
        this.cellData   = [];
        this.cellCount  = 0;
    }

    async initCellData () {
        this.cellCount = await this.tableCells.count;

        for (let i = 0; i < this.cellCount; i++) {
            const text = await this.tableCells.nth(i).innerText;

            this.cellData.push(text);
        }
    }
}

test.js:

import { TablePage } from './table-page';

let page = null;

fixture `New Fixture`
    .page `https://demos.devexpress.com/ASPxGridViewDemos/DataBinding/QueryBuilderControl.aspx`
    .beforeEach(async () => {
        page = new TablePage();

        await page.initCellData();
    });
    
test(`New Test`, async t => {    
    console.log('cells count: ', page.cellCount);
    console.log('cells data: ', page.cellData);
});

 类似资料:
  • 我有一个矢量绘图,我想用浓咖啡测试。 矢量可绘制:ic_video_24dp 我有没有办法用浓缩咖啡对矢量绘图进行UI测试?任何帮助都将不胜感激。

  • 我试图将隐藏字段的值输入到Testcafe中的文本框中,理想的方式是模拟键入。有办法吗?每次我试图通过javascript来实现它时,它都会抛出一个javascript错误。 本质上,我正在测试一个相当标准的网络应用程序——我填写一个表单,一页一页地去,然后必须输入一个保存在页面上隐藏的html输入字段中的值。老实说,我不知道从哪里开始——每次我试图通过“运行测试咖啡馆脚本”使用javascrip

  • 浓缩咖啡测试很烦人,因为像这样的代码 给出如下错误

  • 目标:独立并行地运行两个类,每个测试将方法名存储到一个变量中,该变量可以在测试中稍后访问。 问题:当测试并行运行时,它们开始在它们之间共享数据,从而损坏测试。 如果您看到控制台输出,这是错误的: 因为这是两个独立的类和方法正在运行。我在这里设置了正确的名字: 输出应该是这样的: 种皮 } 测试B } 帮助者方法 Testng.xml 控制台输出

  • 问题内容: 我正在尝试使用Mocha来测试构造函数是否引发错误。我无法使用Expect语法执行此操作,因此我想执行以下操作: 这可能吗? 问题答案: 您可以尝试使用Chai的 构造。例如: