当前位置: 首页 > 知识库问答 >
问题:

Cucumber BDD浏览器测试--处理同名但CSS不同的按钮?

别俊誉
2023-03-14

说明:

在Gherkin语法的教程中,您经常会看到单击特定页面上的按钮的示例,例如:

Given (something)
When I click the submit button
Then (something)

实现这一步的步骤定义非常简单-只需让selenium用任何与按钮匹配的css-selector定位元素,然后让selenium单击它。

问题示例:

假设我们有3个页面,其中都有一个“Next”按钮,该按钮在每个页面上执行完全不同的操作,并且在DOM中的位置也完全不同。假设每个页面都有一个特性。在每个特性中,涉及“Next”按钮的场景如下所示:

Given I am on page xyz
And ...
And I click the next button
And ...
When ...
Then ...

问题是,在第一页,“Next”按钮可能由“.next-button”定位,在第二页,它可能是“#SomeContainer.btn.btn-primary”,而在第三页,它可能是“#AssetButtons li:nth-child(3)”。如果我们对每个特性都有一个局部的步骤定义,它们可以简单地看起来像:

this.Given(/^I click the next button$/, function(callback) {
    this.driver.findElement(this.webdriver.By.css(”.next-button”).click();
    callback();
});

this.Given(/^I click the next button$/, function(callback) {
    this.driver.findElement(this.webdriver.By.css(”#someContainer .btn.btn-primary”).click();
    callback();
});

this.Given(/^I click the next button$/, function(callback) {
    this.driver.findElement(this.webdriver.By.css(”#assetButtons li:nth-child(3)”).click();
    callback();
});
  • 可以使步骤名不那么通用,并使它们也指向按钮所在的页面:“我单击首页上的next按钮”。这样做的问题是,我们已经在该页面上的场景中写过,所以这是多余的。
  • 可以为不同页面上的“下一步”按钮命名,比如“下一个首页”和“下一个搜索页”。
  • 可以使步骤定义检测您当前在哪个页面上,并根据页面使用不同的CSS选择器。(例如,它可以根据步骤和当前页面中的按钮名称向selenium查询当前URL,并查找要使用哪个css-selector)。
  • 可以在步骤文本本身中包含css-selector。但这不太符合人类的可读性,也不像是BDD的方式。
  • 选择更高的抽象级别,在那里您不谈论按钮等,而是更高级别的操作,如“我在搜索结果中进入下一页”。(一般来说,这似乎不是一个好方法--通常确切的步骤很重要,因为相同的操作通常可以以不同的方式完成,所有这些路径当然都应该通过测试来执行。例如,如果您也可以通过按“N”或滑动来进入下一页,那么这将只测试其中的一种情况(但当然也可以将其包含在步骤文本中)。)

但是怎样做才是正确的方法呢?

共有1个答案

魏澄邈
2023-03-14

说你“点击提交按钮”是不好的小cucumber。你想写陈述句,陈述你在做什么,但不是你是如何做的。像“点击这个按钮”这样的祈使句不应该在你的测试设计中找到。我理解你的观点,即能够以不止一种方式做事,在这种情况下,这是一个重要的细节,但尽可能抽象。

你说你有三个next按钮,做三个完全不同的事情,在你的小cucumber里说出这些动作

When I advance the image carousel
When I go to the next news page
When I view the next page of search results

至于不同的路径...

When I swipe to view the next page of search results
When I use the keyboard to view the next page of search results
When I click on the next link to view the next page of search results
 类似资料:
  • 问题内容: 有没有办法为特定的浏览器加载不同的CSS文件? 像(伪代码差): 问题答案: 您想要的理想解决方案不存在: 不幸的是,如果您尝试在HTML本身上进行操作,则不存在跨浏览器解决方案。但是,它将适用于大多数版本的IE。像这样: 所以最好的解决方案是: 这样的Javascript解决方案怎么样:浏览器检测。阅读有关此类的内容以更好地弄清该文件的基本作用,就是这样的概念: 显然,它不仅可以检测

  • 我有相同的图像和相同大小的画布,但是输出是不同的。我想要同样的输出,该怎么做呢?

  • 问题内容: 我正在写一个基于AJAX / COMET的在线聊天室。我的设计是: 请求 -----------------等待------------------------->发送转储数据 -----------------等待------------------------->发送转储数据 -----------------等待------------------------->发送转储数据 -

  • 我有一个有很多功能的项目,我想在不同的浏览器中并行运行一个测试,使用cucumber jvm插件 在我的POM里。XML i添加了cucumber jvm和maver surefire两个插件 我创建runnerClass并添加: 现在,我无法运行测试,如何使用cucumber jvm或selenium网格并行运行浏览器中的不同功能

  • 问题内容: 我找不到有关如何进行设置的任何信息,但这似乎是一个非常基本的概念,所以我敢肯定有一个答案。 我知道如何通过在配置中设置对象的属性来在不同的浏览器上运行量角器。而且效果很好。我可以将其设置为or 或我需要的任何值,并且它可以按预期运行。但是,对多个浏览器运行单个测试套件的唯一方法(据我所知)是创建单独的配置文件,每个配置文件具有不同的配置文件,然后使用各自的配置运行每个浏览器。这行得通,

  • 如何使用Selenium WebDriver在不同的浏览器上同时运行多个测试? 我是用java工作的,我甚至试着下载了selenium网格:selenium-server-standalone-2.33.0.jar文件 即使在程序之后, java-jar selenium-server-standalone-2.33.0.jar-role hub-port 4444 java-jar seleni