【问题标题】:Click an exact match text in Cypress单击赛普拉斯中的完全匹配文本
【发布时间】:2019-10-19 23:43:39
【问题描述】:

在 Cypress 中,.contains 命令会生成所有匹配的元素,因此对于单击带有文本的下拉项,.contains 可以正常工作。但是我遇到了一个问题,我需要单击文本为“导航标签”的下拉项目:问题出现了,因为在同一个下拉列表中还有另一个选项,称为“新导航标签”,而是被按下,因为它首先出现。

有没有办法点击一个与你想要的文本完全匹配的元素?

Given('I click on the {string} drop down option', option => {
  cy.get(`[data-test="dropdown"]`)
    .find('.item')
    .contains(option)
    .click();
});

我使用.last() 部分解决了这个问题,但我发现这个解决方案非常模糊,因为我试图让我的步骤尽可能地可重复使用,而这只是一个补丁,可以让它在这个特定问题中发挥作用。

请注意,无法对下拉列表中的每个特定项目进行数据测试,因为项目是直接从语义 UI 呈现的。

【问题讨论】:

  • 您可以使用regex,这可以与开始和结束锚点完全匹配。
  • 在这个例子中我如何使用正则表达式?我在想像.contains(/^(option)/g) 这样的东西可以工作,但我不知道该怎么做,这不是option 部分。
  • 嗯,这会从字面上匹配单词选项,而不是该变量的内容。也许阅读如何从变量创建正则表达式?
  • const exp = new RegExp(`^(${option})`, "g"); 这终于使它对我有用。谢谢老哥!

标签: regex qa cypress


【解决方案1】:

正则表达式在这里可以很好地工作。

.contains() allows for regex 所以你可以做一个只匹配整个字符串的正则表达式(使用^$)。这样任何带有额外字符的东西都不会匹配(如新导航标签)。例如,你可以这样做:

  cy.get(`[data-test="dropdown"]`)
    .find('.item')
    .contains(/^Navigation Label$/)
    .click();

当您使用变量(例如您的 option 变量)构建表达式时,正则表达式有点棘手。在这种情况下,你会像这样build a regular expression

  cy.get(`[data-test="dropdown"]`)
    .find('.item')
    .contains(new RegExp("^" + option + "$", "g"))
    .click();

所以要与.contains() 完全匹配:

cy.contains(new RegExp(yourString, "g"))

【讨论】:

  • 在这种情况下似乎不需要 g 标志。
  • 这对我有用,因为@rooby 建议 g 标志似乎没有必要
  • 不确定为什么会收到此警告:参数类型 RegExp 不可分配给参数类型字符串 |号码 | RegExp 类型 RegExp 不能分配给 RegExp 类型
【解决方案2】:

您可以使用下面的代码 sn-p 单击具有精确文本的元素。这就像魅力一样,如果您遇到任何问题,请告诉我。

您必须在 cypress 中进行如下处理,这相当于 selenium webdriver 中的 getText()。

clickElementWithEaxctTextMatch(eleText) {
  cy.get(".className").each(ele => {
    if (ele.text() === eleText) {
      ele.click();
    }
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多