Cypress - 如何通过文本内容查找?

Phi*_*hil 30 javascript end-to-end cypress

在 Cypress 中,我想根据其文本内容从一组按钮中选择一个按钮。我该怎么做?这是我的方法:

export const getCustomerButton = () => getNavigationSidenav()
  .find('mat-expansion-panel-header')
  .each(($el, index, $list) => {
    const text = $el.find('.mat-content > mat-panel-title').text();
    if (text === 'Customer') {
      return $el;
    }
    return null;
  });
Run Code Online (Sandbox Code Playgroud)

我现在的问题是我必须从元素数组中过滤掉空值。有没有更简单的方法?

Dur*_*tko 35

这将产生YOUR_BUTTON_CLASS包含文本“客户”的 DOM 元素。这就是你要找的吗?

cy.get('YOUR_BUTTON_CLASS').contains('Customer');
Run Code Online (Sandbox Code Playgroud)

这里的文档.contains柏树命令。

  • 请注意,像这样的链接命令可能会导致不稳定,因为“get”在找到某些内容后不会重试,即使它找到的所有元素都不包含“Customer”(请参阅​​[文档](https://docs.cypress.io) /guides/core-concepts/retry-ability.html#仅重试最后一个命令)) (2认同)

mad*_*low 32

接受的答案“可以”工作。但是:如果该元素在第一次尝试时不可见,则在后续重试中也找不到该元素。

请参阅: https: //github.com/cypress-io/cypress/issues/3745

赛普拉斯使用“Sizzle”作为选择器库 - 所以这样:

cy.get('button:contains("FooBar")')`
Run Code Online (Sandbox Code Playgroud)

将在重试中起作用。


Mr.*_* J. 24

或者,一个更巧妙的解决方案是使用这个:

cy.contains('YOUR_BUTTON_CLASS', 'Customer');
Run Code Online (Sandbox Code Playgroud)

这可以完成,因为contains()可以容纳 2 个参数。如果它有两个参数,第一个总是元素,第二个是文本。

  • 由于 Cypress 处理查询重试的方式,这应该是默认答案:“我们建议使用 cy.contains(selector, text),它会作为单个命令自动重试。” https://docs.cypress.io/guides/core-concepts/retry-ability#Merging-queries (2认同)

kon*_*oya 20

此处以前的答案中未提及的另一个选项。

使用testing-library/cypress-testing-library

安装后,只需将其导入到 cypress' 中commands.js

import '@testing-library/cypress/add-commands'
Run Code Online (Sandbox Code Playgroud)

在你的测试中

cy.findAllByText("Jackie Chan").click();
cy.findByText("Button Text").should("exist");
cy.findByText("Non-existing Button Text").should("not.exist");
cy.findByLabelText("Label text", { timeout: 7000 }).should("exist");
cy.get("form").within(() => {
  cy.findByText("Button Text").should("exist");
});
cy.get("form").then((subject) => {
  cy.findByText("Button Text", { container: subject }).should("exist");
});

Run Code Online (Sandbox Code Playgroud)

这非常简单且易于使用。我们在我们的生产站点中使用它以及 react 测试库。强烈推荐 :)

  • 我只是想知道在安装这个插件之前,`cy.findByText('Button').click()`会产生与内置命令`cy.contains('Button').click()`相同的结果。如果不是,有什么区别? (2认同)
  • 我做了一个快速测试,看起来返回的按钮略有不同,请参阅此[屏幕截图](https://i.imgur.com/zTjdfmd.png),但它们都按应有的方式工作 (2认同)

Var*_*eja 11

有多种方法可以做到这一点

语法:

cy.contains(content)
cy.contains(content, options)
cy.contains(selector, content)
cy.contains(selector, content, options)
Run Code Online (Sandbox Code Playgroud)

例子:

cy.contains('button', 'Customer')
cy.contains('.buttonClass', 'Customer')
cy.get('button:contains("Customer")')
cy.contains('Customer')
Run Code Online (Sandbox Code Playgroud)