无法断言H1文字

Den*_*ner 3 automated-tests web-testing ui-automation e2e-testing testcafe

我正在尝试写一些东西来检查以下页面上是否存在“关于我们”:https : //www.aggrowth.com/zh-cn/about-us,而我刚刚碰壁。这应该不难,但是我花了太多时间在这上面。

我们正在使用Gherking-testcafe:https ://www.npmjs.com/package/gherkin-testcafe

NPM: 6.9.0

TestCafe: 1.0.1

Gherking-Testcafe: 2.0.0

我尝试过(以下所有内容均经过测试隔离,也就是所有不同的t.expect均由他们自己运行):

  const h1AboutUs = await Selector('h1');

  await t.expect(h1AboutUs.innerText).eql('About Us');
  await t.expect(h1AboutUs.innerText).contains('About Us');
  await t.expect(h1AboutUs.value).eql('About Us');
  await t.expect(Selector('html').textContent).contains('About Us');
Run Code Online (Sandbox Code Playgroud)

并尝试删除等待:

  const h1AboutUs = Selector('h1'); 

  await t.expect(h1AboutUs.innerText).eql('About Us');
  await t.expect(h1AboutUs.innerText).contains('About Us');
  await t.expect(h1AboutUs.value).eql('About Us');
  await t.expect(Selector('html').textContent).contains('About Us');
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它将起作用:

这是我的测试:

When("I see the page load", async t => {
  const h1AboutUs = await Selector('h1');

  await t.expect(h1AboutUs.visible).eql(true);
  await t.hover(h1AboutUs);
  await t.expect(h1AboutUs.value).contains('about');
  console.log(h1AboutUs.value);
});
Run Code Online (Sandbox Code Playgroud)

我的testCafe赛跑者:

const createTestCafe = require('gherkin-testcafe');
const fs = require('fs');
const reportPath = './frontend/src/tests/test-reports'
let testcafe = null;

function readTestCafeConfig() {
  configData = fs.readFileSync('.testcaferc.json', 'utf8');
  const js = JSON.parse(configData);
  return getJSONValues(js, 'src');
};

function getJSONValues(obj, key) {
  var objects = [];

  for (var i in obj) {
    if (!obj.hasOwnProperty(i)) continue;
    if (i === key) {
      objects.push(obj[i]);
    }
  }
  return objects;
}

createTestCafe('localhost', 1337, 1338)
  .then(tc => {
    testcafe = tc;
    const runner = testcafe.createRunner();
    const src = readTestCafeConfig();

    return runner
      .src([src])
      .browsers('chrome')
      .reporter(['spec', {
        name: 'json',
        output: `${reportPath}/report/report.json`
      },
        {
          name: 'xunit',
          output: `${reportPath}/report/report.xml`
        }])
      // .video(`${reportPath}/videos`, {
      //   singleFile: true,
      //   failedOnly: true,
      //   pathPattern: '${USERAGENT}/${FILE_INDEX}.mp4'
      // })
      .tags('@aboutUs')
      .run();
  })
  .then(failedCount => {
    console.log('Tests failed: ' + failedCount);
    testcafe.close();
  });
Run Code Online (Sandbox Code Playgroud)

我在控制台中得到的错误是:

1) Selector cannot implicitly resolve the test run in context of which it should be executed. If you need to call Selector from the Node.js API callback, pass the test controller manually via
      Selector's `.with({ boundTestRun: t })` method first. Note that you cannot execute Selector outside the test code.

      Browser: Chrome 74.0.3729 / Mac OS X 10.14.4

         12 |});
         13 |
         14 |When("I see the page load", async t => {
         15 |  const h1AboutUs = await Selector('h1');
         16 |
       > 17 |  await t.expect(h1AboutUs.visible).eql(true);
         18 |  await t.hover(h1AboutUs);
         19 |  await t.expect(h1AboutUs.value).contains('about');
         20 |  console.log(h1AboutUs.value);
         21 |});
         22 |
Run Code Online (Sandbox Code Playgroud)

我希望看不到此错误消息

Hel*_*eva 7

对于此类测试,您需要将Selector绑定到TestCafe的测试控制器。请看下面的例子:

const { Given, Then, Before } = require('cucumber');
const { Selector: NativeSelector }  = require('testcafe');

const Selector = (input, t) => {
    return NativeSelector(input).with({ boundTestRun: t });
};

Before('@aboutHook', async () => {
    console.log('Running AGI test.');
});

Given("I am open AGI page", async t => {
    await t.navigateTo('https://www.aggrowth.com/en-us/about-us');
});

Then("I should see check about us", async t => {
    const h1AboutUs = Selector('h1', t); 
    //or const h1AboutUs = await Selector('h1', t); if you need

    await t
        .expect(h1AboutUs.visible).eql(true)
        .hover(h1AboutUs);
});

Run Code Online (Sandbox Code Playgroud)

您可以在gherkin-testcafe存储库中获得更多示例。还要注意,该h1元素没有属性value。您可以了解更多关于  TestCafe选择器  和  其性能  在TestCafe文档。

  • 这意味着您可以使用“ h1AboutUs.textContent”或“ h1AboutUs.innerText”来检查“ h1”元素的文本。但是诸如标题,段落,div等元素没有“值”属性。请参阅具有[value]属性的元素的[列表](https://developer.mozilla.org/tr/docs/Web/HTML/Attributes)。 (4认同)