首页 > 解决方案 > 如何验证 cucumberjs / puppeteer 中不存在选择器?

问题描述

我正在尝试验证 cucumberjs / puppeteer 中不存在选择器。你如何使用 cucumber-assert 的 throws 断言?

我正在致力于测试自动化以支持测试 ember 前端应用程序。我正在使用 cucumberjs、puppeteerjs 和 cucumber-assert。

我以前使用过以下内容:

if (await page.waitForSelector('[data-test-text-title-refunded-widget-console="true"]')) {
            let textContentOfElement = await page.evaluate(() => document.body.querySelector('[data-test-text-title-refunded-widget-console="true"]').textContent);
            return assert.equal(textContentOfElement, widgetTitle, `title with text ${  widgetTitle  } is not present`);
        }

当我验证一个元素存在并且文本正确时,它可以工作。对于我当前的断言,我使用了 cucumber-assert npm 包中的以下 throws assert:

assert.throws(someFunctionThatThrows).then(callback);

我不确定如何处理回调函数 - 到目前为止我有以下内容。

const assert = require('cucumber-assert');

return assert.throws(await page.waitForSelector('[data-test-text-title- import-payment-file-widget-console="true"]'))
                .then(function(err) {

            });

我应该在回调中返回失败吗?

* 更新 * 我相信我找到了一种不同的方法来解决我的问题。在这里,其他任何人将来都会遇到同样的问题。

    if (await page.$('[data-test-text-title-import-payment-file-widget-console="true"]', { timeout: settings._30000 }) === null) {
        return Promise.resolve();
    }
    return Promise.reject('Error: The widget is present');

标签: javascriptassertpuppeteercucumberjs

解决方案


我为这样的事情做的是创建一个方法,如下所示:

const isElementVisible = async (page, cssSelector) => {
  let visible = true;
  await page.waitForSelector(cssSelector, { visible: true, timeout: 2000 })
  .catch(() => {
    visible = false;
  });
  return visible;
};

// Invoke it as follows
const isVisible = await isElementVisible(page, elementCssSelector);
console.log(isVisible); // Outputs true or false

只是有关此方法如何工作的一些指示:

  • 我故意将其设置为timeout2000因为如果选择器不可见,您不希望您的代码等待默认值30000 (在大多数情况下)。也许您想在timeout您认为适合您的测试脚本的情况下增加/减少此设置。
  • 您需要该catch块只是因为您实际上希望该元素不可见。当超时发生时,您的测试脚本将触发异常,因为puppeteer 认为存在错误。您不希望这会杀死您的测试脚本。相反,该catch块将捕获该异常并设置visiblefalse,然后干净地返回。

希望这可以帮助你!


推荐阅读