Typescript Cucumber中的多个步骤定义匹配错误

Typescript Cucumber中的多个步骤定义匹配错误,typescript,protractor,cucumber,yarnpkg,cucumberjs,Typescript,Protractor,Cucumber,Yarnpkg,Cucumberjs,我最近开始吃黄瓜。我正在尝试实现cumber+量角器+TypeScript,使用它作为基线 我试着遵循这个结构, C:。 | ├───.circleci | ├───.vscode | ├───e2e │ ├───特征 || |--sample.feature || |--sample2.feature | | │ └───台阶 || |--pageobject1|u步骤.ts || |--pageobject2|u步骤.ts || |--common|u step.ts 我在s

我最近开始吃黄瓜。我正在尝试实现cumber+量角器+TypeScript,使用它作为基线

我试着遵循这个结构,

C:。
|
├───.circleci
|
├───.vscode
|
├───e2e
│   ├───特征
|| |--sample.feature
|| |--sample2.feature
|   |
│   └───台阶
|| |--pageobject1|u步骤.ts
|| |--pageobject2|u步骤.ts
|| |--common|u step.ts
我在sample和sample2功能文件中都有一个简单的功能。然而,当我尝试运行测试时,我发现

 `Given I am on the angular.io site
   Multiple step definitions match:
     /I am on the angular.io site$/ - Yadav\Documents\angular-protractor-cucumber\node_modules\cucumber\src\support_code_library_builder\define_helpers.js:90
     I am on the angular.io site`
我读了这篇文章,它说这让我相信这是不推荐的。如果这是正确的,我如何使用页面对象的功能,更重要的是,如何解决多步骤定义问题


此处是一个可重复的示例。

当两个步骤在其步骤定义中共享相同的正则表达式/字符串时,就会出现不明确的错误,因为运行者必须决定使用其中的哪一个

如果在多个功能和场景之间有一个共享步骤,最好将它们分离到公共文件中,以便更容易跟踪

查看我对问题“”的回答,了解我如何组织我的项目

在伪代码(Ruby实现)中,我将给出一个示例

示例

作为测试人员,您希望能够浏览您拥有的网页,而无需在功能文件中明确说明URL,以防URL在将来某个时候发生更改

urls = Project.urls # Class with url method that returns a map, where pages are the keys and urls are the values

Given 'I navigate to the {string} page' do | page |
    driver.navigate.to(urls[page.downcase])
end
这意味着在功能文件中,您可以执行以下操作:

Given I navigate to the "Home" page
它使步骤保持动态、易于重用和将来可维护,无需重复步骤定义

编辑

在注释中,已请求使用cucumber的页面对象模型的工作示例

用Ruby编写,这是一个非常简单的框架版本,表示目录结构以及我个人如何使用POM(注意:有很多“正确”的方法可以做到这一点)


这个例子比我在上面的例子中建议使用的POM要严格得多,而是在elements目录的“URL”文件中存储一个“go__to”方法,但是如前所述,有很多“right”使用POM的方法。

当两个步骤在其步骤定义中共享相同的正则表达式/字符串时,就会出现不明确的错误,因为运行者必须决定使用哪一个

如果在多个功能和场景之间有一个共享步骤,最好将它们分离到公共文件中,以便更容易跟踪

查看我对问题“”的回答,了解我如何组织我的项目

在伪代码(Ruby实现)中,我将给出一个示例

示例

作为测试人员,您希望能够浏览您拥有的网页,而无需在功能文件中明确说明URL,以防URL在将来某个时候发生更改

urls = Project.urls # Class with url method that returns a map, where pages are the keys and urls are the values

Given 'I navigate to the {string} page' do | page |
    driver.navigate.to(urls[page.downcase])
end
这意味着在功能文件中,您可以执行以下操作:

Given I navigate to the "Home" page
它使步骤保持动态、易于重用和将来可维护,无需重复步骤定义

编辑

在注释中,已请求使用cucumber的页面对象模型的工作示例

用Ruby编写,这是一个非常简单的框架版本,表示目录结构以及我个人如何使用POM(注意:有很多“正确”的方法可以做到这一点)


这个例子对POM的要求比我在上面的例子中建议使用的要严格得多,而是在elements目录的“URL”文件中存储一个“go___to”方法,但如前所述,使用POM有许多“正确”的方法。

您可以使步骤定义独立于页面对象。只需创建一个步骤,将特定网站和页面对象加载到变量
this.currentPage
中,这样您就可以在任何步骤中使用任何页面对象,而无需复制它。下面是一个基于量角器的框架示例。没有typeScript,但也许你会得到一个CLUEY,你可以使步骤定义独立于页面对象。只需创建一个步骤,将特定网站和页面对象加载到变量
this.currentPage
中,这样您就可以在任何步骤中使用任何页面对象,而无需复制它。下面是一个基于量角器的框架示例。没有typeScript,但也许你会得到一个clueI,有点明白了,你的目录结构就是我想要实现的。但是,我不知道如何实现
如果在多个功能和场景之间有一个共享步骤,最好将它们分离到公共文件中。
@demouser123我会将它们分离到步骤定义文件夹中的“公共”文件夹中,并用一个新文件指示其中的步骤的作用。例如,“steps/common/navigation.ts”就是我在回答中概述的步骤,我会将每个页面的步骤分别放在“steps/pages”目录中,同样放在文件和文件夹中,这些文件和文件夹表示其中的步骤要测试的内容。@demouser123我以前没有使用过typescript,但是,如果你不介意用Ruby或纯JavaScript编写,为了说明这一点,我很高兴知道这并不重要。我可以同时使用Ruby和JS。@demouser123查看我的编辑中的工作示例,查看itI后可以自由提问,我有点明白了,您的目录结构就是我想要实现的。但是我不知道如何实现
如果在多个功能和场景之间有一个共享步骤,最好将它们分离到公共文件中。
@demouser123我会将它们分离到一个“公共”文件夹中