我正在尝试使用黄瓜进行浏览器测试,并且是第一次学习BDD测试-因此,我是BDD的初学者。我遇到了一个问题,想知道解决该问题的最佳实践方法。
(我正在将它用于node.js Web应用程序,因此它是cucumber.js和Selenium WebDriverJS,但是该平台对于该问题无关紧要)
描述:
在有关Gherkin语法的教程中,您经常看到有关在特定页面上单击按钮的示例,例如:
Given (something)
When I click the submit button
Then (something)
Run Code Online (Sandbox Code Playgroud)
实现此步骤的步骤定义非常简单–只需让selenium使用与按钮匹配的css-selector来定位元素,然后让selenium单击它即可。
问题:
但是,如果您在不同的页面上具有不同的按钮且具有相同的“人类可读”名称(即,黄瓜步骤文本中的名称相同),但必须由不同的CSS选择器定位,该怎么办?
似乎您不能具有局部于要素的阶梯定义,但所有阶梯定义在所有要素之间共享。这意味着,如上所述,如果您创建步骤“我单击提交按钮”,则该步骤定义必须适用于测试整个Web应用程序中具有提交按钮的所有页面。我不太确定执行此操作的正确方法是什么。
题:
处理此问题的最佳做法是什么?
问题示例:
假设我们有3个页面,每个页面都有一个“下一步”按钮,这些按钮在每个页面上都有完全不同的功能,并且在DOM中的位置完全不同。假设每个页面都有一个功能。在每个功能中,涉及“下一步”按钮的方案如下所示:
Given I am on page xyz
And ...
And I click the next button
And ...
When ...
Then ...
Run Code Online (Sandbox Code Playgroud)
问题是,在第一页上,“下一个”按钮可能位于“ .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(); …Run Code Online (Sandbox Code Playgroud) 我在Java控制台应用程序中使用Apache HttpClient 4.5(具有流畅的界面)。我注意到,它的默认超时值似乎是无限的,但是我必须对发送的请求使用非无限的超时值。我想对所有请求使用相同的超时值。
如何全局设置默认的连接超时和套接字超时值,这样我就不必在发送请求的代码中的每个位置都设置它们?(请记住我使用的是流畅的界面)
例:
现在,在代码中我发送请求的每个地方,我都会做类似的事情:(简单的示例)
HttpResponse response = Request.Get(url)
.connectionTimeout(CONNECTION_TIMEOUT) // <- want to get rid of this
.sessionTimeout(SESSION_TIMEOUT) // <- and this
.execute()
.returnResponse();
Run Code Online (Sandbox Code Playgroud)
我想做的是在程序开始时一劳永逸地设置默认值。就像是:
SomeImaginaryConfigClass.setDefaultConnectionTimeout(CONNECTION_TIMEOUT);
SomeImaginaryConfigClass.setDefaultSessionTimeout(SESSION_TIMEOUT);
Run Code Online (Sandbox Code Playgroud)
这样我就可以发送这样的请求
HttpResponse response = Request.Get(url).execute().returnResponse();
Run Code Online (Sandbox Code Playgroud)
而无需在每个调用中都设置超时参数。
我在网上看到了一些答案,但是它们要么用于Apache HttpClient的旧版本(即不起作用),要么它们谈论使用生成器或将config类传递给其他方法,而这些方法对于我的需求而言过于复杂。我只想设置默认超时值,没有比这更好的了。我在哪里做?