如何在Protractor中等待后端

How to wait for the backend in Protractor?

本文关键字:等待 后端 Protractor      更新时间:2024-07-19

我正在测试一个网页,用户可以通过文本输入向另一个网页发送消息。然后在服务器上发送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学习,因为它的行为完全不像任何熟悉正常同步编程的人所期望的那样。