使步骤定义动态以处理任何传入文本

Make step definition dynamic to handle any incoming text

我必须 运行 test1.feature 提交两个 url 文件。在其中一个 url 中,我有一个名为 EIN 的字段,但在第二个 url 中,相同的字段名为 ABN 我们如何使步骤定义动态化以处理第二个字符串中的任何文本。

Url 1 : https://testsite.us.com/student

该字段被命名为“EIN”

Url 2: https://testsite.au.com/student

该字段被命名为“ABN”

test1.feature

And I type "11 234 234 444" in "ABN" field

step_definition

//在文本框输入字段中键入文本值

Then('I type {string} in {string} field', (textval, textboxname) => {
  switch (textboxname) {
    case "Email":
    case "Work Phone":
    case "ABN":
    case "EIN":
    case "ACN":
      cy.get('#profile_container').parent().find('.fieldHeaderClass').contains(textboxname)
        .next().find('input')
        .clear({force:true})
        .type(textval, { force: true });
      break;
      
    //final else condition
    default:
      cy.get('#profile_container').parent().find('.fieldHeaderClass').contains(textboxname)
        .next()
        .type(textval, { force: true });

  }
});

首先是一个很好的提示:使用页面对象(PO​​M 设计模式)。页面对象是您在包含所有选择器代码 (cy.get(......)) 的 stepdefinitions 文件中导入的对象(在第三个 .js 文件中,除了您的功能和 stepdifinitions)。您不想在步骤定义中使用选择器代码。使它变得混乱且更难阅读。

关于您的问题:如果您想对(各种)输入值重复相同的逻辑。为什么不只写你的逻辑(这样就没有长的 case 语句)并使用 Scenario Outline 为不同的输入重复你的步骤?如果你的逻辑每次都必须不同,那就不要费心去解决这个问题。那么你应该简单地为不同的逻辑编写不同的步骤..

这是场景大纲的示例(在 .feature 中):

Scenario Outline: Scenario Outline name  
    Given I type "<textval>" in "<textboxname>" field
     Examples:
      | textval            | textboxname |
      | some_value         | ABN         |
      | some_other_value   | EIN         |
      | some_other_value_2 | email       |
      | some_other_value_3 | ACN         |
      | some_other_value_4 | Work Phone  |

结论:使用场景大纲重复逻辑。如果不同的输入需要不同的逻辑,那么再写一个步骤定义,不要试图将不同的逻辑组合和剪辑成 1 个步骤。