如何在testcafe中调用外部异步等待功能

que*_*nar 2 javascript automated-tests web-testing e2e-testing testcafe

我有helper.js它的功能

async function getLink() {
  try {
    const message = await authorize(content);
    const link = message.match(/href=\"(.*?)\"/i);
    return link[1];
  }
  catch(error) {
    console.log('Error loading:',+error);
    throw(error);
  }
}
module.exports.getLink = getLink;
Run Code Online (Sandbox Code Playgroud)

我想在测试执行后在 testcafe 脚本中使用这个函数

在 test.spec.js 中

import { Selector } from 'testcafe';
let link = '';
fixture My fixture
.page `https://devexpress.github.io/testcafe/example/`;

 test('test1', async t => {

// do something with clientWidth
});
test('test2', async t => {
  // use the getLink function here from the helper.js to get the string value
  mailer.getLink().then(res=>{
    link = res;
  })
  t.navigateTo(link)
});
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

我尝试使用 clientFunction 但出现错误,因为_ref is not defined代码如下

const validationLink = ClientFunction(() => {
  return getLink();
}, { dependencies: { getLink } });
let link = await validationLink();
Run Code Online (Sandbox Code Playgroud)

hdo*_*val 5

如果该getLink方法必须读取 DOM 中的某些内容(在 范围之外Selector),或者必须在浏览器中计算某些特殊内容,则必须创建clientFunction如下所示的内容(在 clientFunction 中包含所有代码(无导入代码)):

const getLink = ClientFunction((selector) => {
    return new Promise( (resolve) => {
        const element = selector();
        // check, in developper tools, what are the available properties in element
        console.log("element:", element);
        // code omitted for brevity that reads data from element and does special computation from it
        // build the result to be returned
        const result = 'the computed link';
        resolve(result);
    });
});

test('test2', async t => {
  const linkSelector = Selector('css selector');
  const link = await getLink(inputSelector);
  await t.navigateTo(link);
});
Run Code Online (Sandbox Code Playgroud)

如果该getLink方法不需要从 DOM 中读取特殊内容,则无需创建clientFunction. 您只需要创建一个辅助方法并导入它(如@AlexSkorkin 所建议的那样):

test('test2', async t => {
  const link = await mailer.getLink();
  await t.navigateTo(link)
});
Run Code Online (Sandbox Code Playgroud)

请注意,必须等待 t.navigate() 和 mailer.getLink()。