Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Zombie.js按下按钮如何访问浏览器的后ajax版本?_Javascript_Ajax_Node.js_Mocha.js_Zombie.js - Fatal编程技术网

Javascript Zombie.js按下按钮如何访问浏览器的后ajax版本?

Javascript Zombie.js按下按钮如何访问浏览器的后ajax版本?,javascript,ajax,node.js,mocha.js,zombie.js,Javascript,Ajax,Node.js,Mocha.js,Zombie.js,我使用zombie.js自动测试浏览器操作,在本例中,单击按钮提交表单 在测试之外,在真实的浏览器中,当单击按钮时,会触发AJAX请求。当AJAX请求完成时,两个div.alert元素被添加到文档正文中 下面的测试按下按钮并触发请求,但是当测试随后查询文档以查找预期的div元素时,它找不到它们。我相信测试是在查询AJAX调用完成之前存在的文档的“旧”版本。我的问题是:在AJAX调用完成并添加元素之后,如何访问存在的文档版本 context("when visited on the 'new' p

我使用zombie.js自动测试浏览器操作,在本例中,单击按钮提交表单

在测试之外,在真实的浏览器中,当单击按钮时,会触发AJAX请求。当AJAX请求完成时,两个
div.alert
元素被添加到文档正文中

下面的测试按下按钮并触发请求,但是当测试随后查询文档以查找预期的div元素时,它找不到它们。我相信测试是在查询AJAX调用完成之前存在的文档的“旧”版本。我的问题是:在AJAX调用完成并添加元素之后,如何访问存在的文档版本

context("when visited on the 'new' page", function(){
  before(function(){  return browser.visit('/');  });
  before(function(){  return browser.clickLink('new');  });

  context("when submitted with invalid values", function(){
    before(function(){
      return browser.pressButton("Submit")
    })

    it("flash should include error messages", function(){
      var messages = browser.queryAll(".alert")
      console.log(messages)
      expect(messages.length).toEqual(2)
    })
  })
})

注意:我一直在研究zombie.js测试,发现使用了
async
await
,但当我尝试在.js文件中使用这些关键字时,它无法识别它们。这可能是一个单独的问题,但如果解决方案需要async/await,如何使mocha能够识别这些关键字?

您可以更改ajax调用,以便在更新屏幕后,它们针对名为“action completed”的主体发送事件。然后在测试中,您可以创建一个侦听器函数,该函数返回一个承诺,该承诺在收到事件之前不会解析

const actionAndWait = ( action, eventName ) => new Promise( resolve => {

    const listener = () => {
        browser.body.removeEventListener( eventName, listener );
        resolve();
    };

    browser.body.addEventListener( eventName, listener );
    action();
    browser.wait();

} );
你的“之前”会打电话给我

return actionAndWait( () => browser.pressButton("Submit"), "action-completed" );

您可以更改ajax调用,以便在更新屏幕后,它们针对称为“action completed”的主体发送事件。然后在测试中,您可以创建一个侦听器函数,该函数返回一个承诺,该承诺在收到事件之前不会解析

const actionAndWait = ( action, eventName ) => new Promise( resolve => {

    const listener = () => {
        browser.body.removeEventListener( eventName, listener );
        resolve();
    };

    browser.body.addEventListener( eventName, listener );
    action();
    browser.wait();

} );
你的“之前”会打电话给我

return actionAndWait( () => browser.pressButton("Submit"), "action-completed" );

async/await
是ES7的一项功能。你可能会找到一种方法来打开它。然而,我看不出这对你有什么帮助。问题是让您的测试等待修改DOM。我根本不使用僵尸,但我使用的是Selenium,它附带的函数可以实现这一点。如果Zombie没有等效项,您可以随时轮询DOM。感谢selenium的建议,我需要修改我之前的评论:
async/await
没有进入ES7(==ES2016)。ES2016像昨天一样获得了批准(我刚刚了解到),但他们从中删除了
async/await
。它可能是该语言下一版本的一部分。
async/await
是ES7的一项功能。你可能会找到一种方法来打开它。然而,我看不出这对你有什么帮助。问题是让您的测试等待修改DOM。我根本不使用僵尸,但我使用的是Selenium,它附带的函数可以实现这一点。如果Zombie没有等效项,您可以随时轮询DOM。感谢selenium的建议,我需要修改我之前的评论:
async/await
没有进入ES7(==ES2016)。ES2016像昨天一样获得了批准(我刚刚了解到),但他们从中删除了
async/await
。这可能是该语言下一次修订的一部分。