1

目前我正在尝试使用zombie.js 为我的网站运行自动化测试。现在我正在努力使一个人注册自动化。对于注册,表单与 3 个不同的 div 一起使用,如下所示

页面代码:

<form>
   <div id=step1>
   <div id=step2>
   <div id=step3> 
</form> 
...
...
<button id="nextStep" class="btn btn-primary" role="button" 
   onClick="signupNext()">Cnt. </button>

SignupNext 是一个 javascript 函数,它禁用按钮,然后进行一些简单的操作,然后重新启用按钮。

僵尸代码:

browser
   .visit(https://example.com, function(){
     browser.fill(....)
     browser.fill(....)
     browser.pressButton('#nextStep', function(){
        browser.fill(...)
        browser.fill(...)
        browser.pressButton('#nextStep', function(){ //THIS LINE Errors
            ...
            ...
        });
     });
   })

Zombie 在第二个 .pressButton 上抛出错误“按钮已禁用”。就我对zombiejs 的理解而言,在我看来,pressButton 应该等待事件完成然后执行回调函数。

*zombiejs 的新手

4

2 回答 2

1

这可能是由于您检查输入以启用/禁用此按钮的方式。我猜你可能正在使用keyupblur或两个事件。当zombie为您填充这些输入时,它不会触发这些事件,因为当真实用户使用实际浏览器填充它时,您必须使用zombie来触发您需要的任何事件,就在输入之后填满,像这样:

browser.fill(...);
browser.fill(...);
browser.fire("{checkedInputSelector}", "keyup", function(){
    browser.pressButton('#nextStep', function(){ //THIS LINE shouldn't error anymore
        ...
        ...
    });
});
于 2013-07-20T21:52:10.700 回答
1

一切都是异步发生的 来自文档:

浏览器将加载文档,如果文档包含任何脚本,也会加载并执行这些脚本。然后它将处理一些事件,例如,您的脚本在页面加载时所做的任何事情。所有这一切,就像真正的浏览器一样,都是异步发生的。

要等待页面完全加载并处理事件,请通过访问回调函数。Zombie 将调用你的回调,返回 null、浏览器对象、最后响应的状态码和错误数组(希望为空)。这是 JavaScript,因此您不需要声明所有这些参数,实际上可以通过 browser.statusCode 和 browser.errors 访问它们。

(为什么第一个回调参数为空?在使用 Mocha 等异步测试框架时效果很好

Zombie 也支持承诺。当你在没有回调的情况下调用访问、等待或 clickLink 等函数时,你会得到一个承诺。浏览器完成处理后,它要么履行承诺,要么拒绝承诺。

例如:

browser.visit("http://localhost:3000/").
  then(function() {
    assert.equal(browser.text("H1"), "Deferred zombies");
  }).
  fail(function(error) {
    console.log("Oops", error);
  });
于 2013-07-15T14:51:19.010 回答