CasperJS表单填写有时会保留在当前页面上

时间:2014-04-03 15:23:54

标签: casperjs fill

我有一个简单的casperjs测试,可以在我的主页上提交搜索表单。然后我断言着陆页上的标题是正确的。

在我的计算机上运行正常(OSX 10.9.2),但在我的同事的笔记本电脑(Win 7和Win 8)上,测试失败,因为casper"认为"它仍然在搜索页面上。

casper.test.begin('Search', function(test) {

  casper.start("http://localhost:8080/site", function() {
    this.fill(searchForm, { query: goodQuery }, true);
  });

  casper.then(function() {
    // sometimes fails, says it's "My Project" main title
    test.assertTitle('Search Result', 'Search result title is ok');
  });
}

在检查页面标题之前引入casper.waitFor(3000)不会改变结果。我还尝试将then步骤替换为waitForUrl,但它在5秒后失败,表示它仍然在当前页面上。

许多其他测试在所有计算机上都能正常运行,但它是唯一具有表单提交的测试。

有关如何解决或正确解决此问题的任何提示?如果可能的话,我宁愿不模拟提交按钮上的点击(更多耦合到表格内部)(但我猜是可以的)。

由于

$ casperjs --version
1.1.0-beta3
$ phantomjs --version
1.9.7

编辑:提交表单并waitForUrl没有帮助。我发现测试实际上运行良好,即使在Windows 7机器上也是如此。但是当我进行两次测试时:

  • 01 search.js(上述一个)
  • 02 menu.js(一个简单的,仅包含assertExists)

' search.js'大部分时间都失败了...有时候' menu.js'失败了!我怀疑有一些处理不当的并发访问,尽管它一直适用于OSX。我一定做错了什么。两种测试都具有相同的结构:

casper.test.begin('Some test', function(test) {

    casper.start(someUrl, function() {
        // some test
    });

    casper.run(function() {
        test.done();
    });
});

有任何线索吗?

3 个答案:

答案 0 :(得分:0)

尝试:

casper.test.begin('Search', function(test) {

     casper.start("http://localhost:8080/site", function() {
        this.fill(searchForm, { 
            query: goodQuery 
        },false);
        this.click("your selector for submit button");
      });

     casper.then(function() {//you should use waitForUrl/Selector/Text() instead
        // sometimes fails, says it's "My Project" main title
        test.assertTitle('Search Result', 'Search result title is ok');
      });

    casper.run(function() {
        this.test.comment('------ Tests over ----\n');
        test.done();
    });
});

最好通过点击提交表单。有时(通常)它不会将填充arg置于true。只需为提交按钮添加正确的选择器。

答案 1 :(得分:0)

您应该等待一个项目出现在下一页上。我会将您的代码更改为以下内容:

casper.test.begin('Search', function(test) {

    casper.start("http://localhost:8080/site", function() {
        this.fill(searchForm, { query: goodQuery }, true);
    });

    casper.waitForSelector('#someSelectorOnNextPage', function() {
        test.assertTitle('Search Result', 'Search result title is ok');
    });
}

答案 2 :(得分:0)

我也遇到过同样的问题。令人惊讶地在then()中添加了空的v1.1.0-beta3处理程序修复程序。我不认为这是预期的行为:

casper.test.begin('Search', function(test) {

  casper.start("http://localhost:8080/site", function() {
    this.fill(searchForm, { query: goodQuery }, true);
  });

  // Do nothing here, just call it as a placeholder
  // Here http://localhost:8080/site sends us to the next endpoint
  casper.then(function() {});

  // Now this is the final page we actually want to assert
  casper.then(function() {
    test.assertTitle('Search Result', 'Search result title is ok');
  });
}

编辑:

虽然问题作者说casper.waitForUrl()对他们没有用,但它确实对我来说是一种替代解决方案。

看起来奇怪的是,在详细模式下,无论何时返回301状态代码以及Location标题都会被Casper识别为HTTP 200响应。

编辑2:

很明显,它并不是每次都会发生,但我注意到Casper有时会将之前的响应加倍(这就是为什么我认为它会错误地识别某些特定的HTTP代码为200的原因并且'这就是为什么作者的代码在表单提交后仍然保持在同一页面上的功能),有时候没有。

waitForUrl()显然已经解决了这个问题,但Casper仍然存在一些问题让我感到有些害怕,我希望我能找到一些时间向Casper问题跟踪器报告所有转储。