- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用基于 Nightwatch.js
的 Nightwatch-Cucumber
进行测试。 Ans 我也使用 PageObject Pattern
。这些测试不仅是基于 Selenium
的端到端测试,还有 REST API
测试。对于 REST 测试,我使用 Atlassian JIRA REST client for Node .现在我想将 Nightwatch 的强大功能(包括 Selenium)与 REST 的强大功能结合起来。因此,我想同时使用这两种技术,并且想将 REST API 调用集成到 Nightwatch 框架中。
我尝试将 REST API 调用集成到 Nightwatch 的 perform()
函数中,以将 REST 调用添加到 Nightwatch command queue ,但没有完全成功。我必须确保在执行下一个 Nightwatch 命令之前完全完成 REST 调用。目前,REST 调用之后的以下步骤将在 REST 调用完全完成之前执行。但是我该如何解决这个问题呢?
这是我的 cucumber 特征文件:
Feature: JIRA projects tests
Scenario: my first test
When the user logs out
When the user deletes a still existing project with key "ABC-123" via REST API
When the user logs out
这些是我的步骤定义
:
const { client } = require("nightwatch-cucumber");
const { defineSupportCode } = require("cucumber");
const myPage = client.page.myPageView();
defineSupportCode(({ Given, When, Then }) => {
When(/^the user logs out$/, () => {
return myPage.logoutUser(client);
});
When(
/^the user deletes a still existing project with key "([^"]*)" via REST API$/,
projectKey => {
return myPage.deleteProjectViaRestApi(client, projectKey);
}
);
});
这些是我的页面对象
函数:
const restClientConnector = require("../../rest/restClientConnector");
const environmentVariables = require("../../helpers/getEnvironmentVariables");
module.exports = {
elements: {},
commands: [
{
logoutUser(client) {
console.log("1");
return client
.deleteCookies()
.url(
environmentVariables.launchUrl(client) +
"/crowd/console/logoff.action"
);
},
deleteProjectViaRestApi(client, projectKey) {
return client
.perform(function() {
//delete the given project
restClientConnector
.jiraConnector(
environmentVariables.jiraHostUrl,
environmentVariables.jiraAdminUsername,
environmentVariables.jiraAdminPassword
)
.project.deleteProject(
{
projectIdOrKey: projectKey
},
function(error, result) {
console.log("2");
}
);
})
.perform(function() {
restClientConnector
.jiraConnector(
environmentVariables.jiraHostUrl,
environmentVariables.jiraAdminUsername,
environmentVariables.jiraAdminPassword
)
.project.getProject(
{
projectIdOrKey: projectKey
},
function(error, result) {
console.log("3");
}
);
});
//.waitForTime(4000);
}
}
]
};
所以,我希望 3 个 Cucumber 步骤同步运行,一个接一个。我添加了一些 console.log()
输出来检查这一点。在我的测试运行中,我期望控制台输出的顺序:
1
2
3
1
相反,我得到以下输出:
Starting selenium server... started - PID: 10436
.1
..1
..
1 scenario (1 passed)
3 steps (3 passed)
0m03.782s
3
2
因此,Cucumber 步骤的第二次调用 当用户注销时
在 Cucumber 步骤之前开始执行 当用户通过 REST 删除键为“ABC-123”的仍然存在的项目时API
已完全完成。
如果我在 Page Object
中取消注释 .waitForTime(4000)
行(这是一个自定义命令),那么我会得到正确的输出,但我没有想这样静静的等待。它很脏:
Starting selenium server... started - PID: 10554
.1
.2
3
.1
..
1 scenario (1 passed)
3 steps (3 passed)
0m07.783s
如何解决我的问题以在下一步之后准确执行,或者如何将 REST 调用集成到 Nightwatch 命令队列中。我还尝试让我的函数 async
并使用 await
执行所有命令,但也没有成功。
最佳答案
如果您有需要同步运行的异步任务,则必须在 perform
函数中使用 done
回调。
browser.perform(function(done) {
//do some async stuff...
done();
});
您想在异步任务完成后调用done
。在您的情况下,它应该与此类似:
deleteProjectViaRestApi(client, projectKey) {
return client
.perform(function(done) {
//delete the given project
restClientConnector
.jiraConnector(
environmentVariables.jiraHostUrl,
environmentVariables.jiraAdminUsername,
environmentVariables.jiraAdminPassword
)
.project.deleteProject(
{
projectIdOrKey: projectKey
},
function(error, result) {
console.log("2");
done();
}
);
})
.perform(function(done) {
restClientConnector
.jiraConnector(
environmentVariables.jiraHostUrl,
environmentVariables.jiraAdminUsername,
environmentVariables.jiraAdminPassword
)
.project.getProject(
{
projectIdOrKey: projectKey
},
function(error, result) {
console.log("3");
done();
}
);
});
}
如果您遇到 done
回调超时的问题,您应该将外部全局文件中的 asyncHookTimeout
的持续时间增加到适当的值。
关于node.js - 在 Nightwatch 命令队列中使用 REST 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48823355/
nightwatch.conf.BASIC.js 和nightwatch 框架中的 nightwatch.conf.js。 设置守夜人框架的基本要求是什么 Node js 和 Selenium 最佳答
你如何在 nightwatch 中检查背景图像?如何确保正确加载背景图像?背景图像是使用 css 加载的。 最佳答案 希望这可以帮助: browser.waitForElementVisible('.
我使用 Nightwatch 编写了浏览器自动化测试用例。我还为 headless 测试用例实现了“phantomjs-prebuilt”。当我设置时,我能够为我的所有测试用例创建一个报告'test_
我正在尝试测试待办事项应用程序是否具有正确数量的元素。 文档似乎几乎只处理单个元素,所以我不得不使用 Selenium 协议(protocol)函数。这是否是测试匹配选择器计数的正确方法(在这种情况下
目前在我的 nightwatch.json 中,我已设置好在我的 mac 上运行: { "src_folders" : ["specs"], "output_folder" : "tests/
我正在使用 Nightwatch 并希望监控我的 nightwatch 步骤生成的 http 请求。有没有办法监听发送的请求和收到的响应。我不需要修改它们。 谢谢 马特 最佳答案 是的,有办法。 为了
我想暂停每个测试。 我创建了这个函数: afterEach:function(browser){ browser.pause(2000); }, 但是当我运行测试时,我会得到错误: TypeEr
从这个answer FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browse
我使用 Nightwatch for e2e,我发现这两个命令有点困惑 给出它们附带的名称和解释。 .waitForElementVisible: 在执行任何其他命令或断言之前,等待给定时间(以毫秒为
我使用 Nightwatch.js 设置了一个简单的 smoketest。他们在本地通过,但在 CircleCI 上失败。 源代码: const WAIT = 1000; const NODE_POR
我有六个测试用例需要运行,但任何时候只有三个测试用例可以在测试目标环境中处于事件状态。当我运行测试时,我想检查是否针对特定情况正确设置了环境。如果没有,我想将测试标记为已跳过。如何在 nightwat
如何贴在床头柜上?我尝试了以下命令: browser.keys([browser.Keys.COMMAND, browser.Keys.v]) 但是该命令不起作用。 理想情况下,我希望可以将复制的文本
我正在尝试在测试中使用launch_url属性,并在将浏览器发送到该URL之前为其添加相对路径。 我知道browser.init();将浏览器发送到launch_url中的地址,但是我想知道是否可以在
我想在(非全屏)模式对话框下方的全屏 div 上执行单击。但是,单击事件似乎自动定位到我的背景 div 的中心,从而触摸了该 div 顶部的内容(模态对话框本身)。 如何指定点击应该发生的位置? 这是
如何在 NightwatchJS 中编写简单的 if/else?如果元素存在,请单击此元素,否则 - 单击另一个元素。 'Test2: click login button': function(cl
我的每个 Nightwatch.js 测试都需要身份验证才能运行,目前我无法通过 cookie 进行身份验证(当然,如果测试填写用户名和密码,它就会登录,但需要时间是这样的) 我有一个工作 PHPSE
我在自动测试和设置 Nightwatch 方面相当陌生,但我已经知道我的自定义命令文件夹迟早会变得笨拙。我看过一些示例 nightwatch.json 文件,这些文件使用数组作为自定义命令路径,但我似
我尝试向 Nightwatch 提供测试数据,但我不知道如何提供。如何为 Nightwatch 测试提供动态测试数据? 我不想将值硬编码到代码中。我想从文件中提供它。 编辑: .setValue('s
在浏览器实际启动之前,我有很多脚本首先运行的测试,这有时会导致测试运行不正确。实际上导致我出现问题的最新情况是 try/catch 表达式,它并没有真正捕捉到某些元素不存在的事实(尽管预计不会存在)。
我正在尝试在 nightwatch 中创建一个自定义命令,该命令在 Postgres 数据库上运行查询并返回结果。查询运行得很好并将结果输出到控制台,但测试的执行随后停止。我不明白回调是如何工作的。如
我是一名优秀的程序员,十分优秀!