如何在Protractor中等待后端
How to wait for the backend in Protractor?
我正在测试一个网页,用户可以通过文本输入向另一个网页发送消息。然后在服务器上发送POST请求,并将消息转储到磁盘上的var/mail/new
文件夹中。
在使用Protractor自动发送页面中的邮件后,我将调用browser.waitForAngular()
和browser.driver.sleep(4000)
,为后端在磁盘上写入邮件留出时间。
在这些呼叫之后,对电子邮件存在性的检查失败。当在Unix外壳中查看时,我可以确认电子邮件已经发送,并且在带有it
的Jasmine中标记的下一个测试也可以确认电子邮件的存在。
为什么browser.driver.sleep(4000)
不能有效地等待后端继续?如何更正以下代码?
it("is possible to send a message", function() {
shared.loginContributor();
var mailsBeforeMessaging =
fs.readdirSync(browser.params.mail.queue_path + "/new");
console.log('mailsBeforeMessaging');
console.log(mailsBeforeMessaging.length);
console.log(fs.lstatSync(browser.params.mail.queue_path + "/new"));
var usersListing = new UserPages.UsersListing().get();
var annotatorPage = usersListing.getUserPage("annotator");
annotatorPage.sendMessage("title5", "content64");
exec("/tmp/check.sh");
// we expect the message widget to disappear
var button = element(by.css(".user-profile-info-button"));
console.log('waiting');
browser.wait(EC.elementToBeClickable(button), 5000);
console.log('waiting is finished');
expect(EC.elementToBeClickable(button)).toBeTruthy();
// wait for mail to be dumped on the disk?
browser.waitForAngular();
browser.driver.sleep(4000);
exec("/tmp/check.sh");
var mailsAfterMessaging =
fs.readdirSync(browser.params.mail.queue_path + "/new");
console.log('mailsAfterMessaging');
// ERROR: here the number of emails is NOT incremented
console.log(mailsAfterMessaging.length);
console.log(fs.lstatSync(browser.params.mail.queue_path + "/new"));
});
it("xyz", function() {
console.log(fs.lstatSync(browser.params.mail.queue_path + "/new"));
// here the number of emails is incremented
var mailsAfterMessaging =
fs.readdirSync(browser.params.mail.queue_path + "/new");
console.log('mailsAfterMessaging');
console.log(mailsAfterMessaging.length);
});
大多数Protractor函数都不做任何事情。他们将稍后要做的事情排队,并返回promise。在it
块调度了一堆要做的事之后,它们实际上开始发生(通过他们在ControlFlow中注册的promise)。
然而,您的检查都会立即执行。所以,它们发生在任何量角器调用完成任何事情之前。
使用then
在测试中明确等待和依赖关系。像这样:
annotatorPage.sendMessage("title5", "content64").then(function() {
exec("/tmp/check.sh");
});
或:
browser.wait(EC.elementToBeClickable(button), 5000).then(function() {
console.log('wait-for-clickable has completed'); // B
});
console.log('wait-for-clickable has been scheduled'); // A
请参阅Protractor控制流文档和Webdriver JS API文档。
不是你。这是一个疯狂的API学习,因为它的行为完全不像任何熟悉正常同步编程的人所期望的那样。
相关文章:
- 未能从后端触发javascript
- 检查浏览器'在asp.net的后端代码中启用或禁用了s JS
- Ajax登录技术(后端php)
- 将Rails后端添加到JS/HTML/CSS应用程序时,正确的文件位置是什么
- 视图没有't在模拟后端时加载
- 是否可以在不使用外部后端的情况下编写grafana数据源插件
- 如何将Angular 2用于各种网站&使用PHP作为后端的模块
- 如何在不重新加载URL的情况下查询Node.Js的后端并更新页面
- 从后端检查Open Social小工具中的用户身份验证
- 如何使用python后端和web前端提供braintree客户端令牌
- 某些Magento后端管理按钮已停止工作
- 构建一个HTML小部件来嵌入付费内容-如何确保与后端的通信安全
- 为什么Express.js后端的CORS设置不起作用
- 调用后端、多路径变量、Ext Js
- 如何断言后端端点已被调用
- 骨干关系是否需要后端
- 与带下划线的后端同步时,转换为 CamelCase 以在 JavaScript 中使用
- 如何在Protractor中等待后端
- azure异步javascript后端等待函数
- Angular在等待后端更新响应时该怎么做