2015-03-02 70 views
1

我正在测试一个网页,用户可以通过textinput发送消息给另一个网页。然后在服务器上发送POST请求,并将消息转储到var/mail/new文件夹中的磁盘上。如何等待量角器中的后端?

在使用量角器自动发送页面中的消息后,我打电话给browser.waitForAngular()browser.driver.sleep(4000),让后端在磁盘上写邮件。

这些调用后,电子邮件的检查失败。在Unix shell中查看时,我可以确认电子邮件已发送,并且在Jasmine中使用it标记的下一个测试确认了电子邮件的存在。

为什么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); 
}); 

回答

3

大多数量角器功能不什么。他们排队等待后来,并承诺做到这一点。在it块安排了一大堆事情之后,他们实际上开始发生(通过他们在ControlFlow中注册的许诺)。

但是,您的支票全部立即执行。所以,在任何量角器调用完成任何事情之前,它们正在发生。

使用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 Control Flow文档和Webdriver JS API doc

它不是你。这是一个疯狂的API学习,因为它不像熟悉普通同步编程的人所期望的那样完全不起作用。

+0

谢谢你的友好和详细的答案。在执行测试之前是否有任何方法清空队列并避免调用“then”? – z1naOK9nu8iY5A 2015-03-03 09:00:31

+0

注意未来的我:可以通过browser.controlFlow()和'flow.execute'控制流程。 – z1naOK9nu8iY5A 2015-03-03 14:21:21

相关问题