使用 casperjs 提交表单 - 新 url 未加载

form submit with casperjs - new url doesn't load

目标

在这里,我试图在 Pubmed website。假设我要搜索的词是 Hello。最后我期望的是在单击搜索按钮后进入结果页面。

问题

提交代码在 chrome 浏览器的 javascript 控制台上运行完美。但它不适用于 casperjs。当前-url 似乎保持不变。我无法弄清楚问题出在哪里。

我的代码

// USAGE: casperjs test navigation_test.js

var config = {
  url: 'https://www.ncbi.nlm.nih.gov/pubmed/',
};

config.form = {
  "term": "Hello",
};

casper.test.begin('Testing navigation and forms', 2, function suite(test) {
  test.comment('⌚  Loading ' + config.url + '...');


  casper.start(config.url, function() {
    // adjust the view port
    this.viewport(1280, 1024);
  });

  // #1 method-2 (short)
  casper.then(function() {
   this.fill('form#EntrezForm', config.form, true);   
  })

  // #2
  casper.then(function() {
    test.assertUrlMatch(/term/, 'New location is ' + this.getCurrentUrl());
  });

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

});

额外代码

上面代码中的#1 method比较短。我还尝试了如下更长的版本。但是也没用。

//  #1 method-1 (long)
casper.then(function() {
  this.evaluate(function() {
      $('term').value = "Hello"
  });

  test.assertEvalEquals(function () {
      return $('term').value;
  }, "Hello", 'The search was filled out properly.');  

  this.click('button[id="search"][type="submit"][class="button_search nowrap"]');
  // OR
  // this.clickLabel('Search', 'button');
  // OR 
  /*this.evaluate(function() {
    $('search').click();
    // OR
    // document.getElementById('search').click();
  });*/

});

在我提交表单或请求新的 uri 后,我 ALWAYS 使用 waitFor 之一作为选择器。我有时注意到仅使用 .then 有时会失败。

这很好(我也注意到你的 url 匹配有点错误)

var config = {
    url: 'https://www.ncbi.nlm.nih.gov/pubmed/',
};

config.form = {
  "term": "Hello",
};

casper.test.begin('Testing navigation and forms', 2, function suite(test) {

    casper.start(config.url, function () {
        this.viewport(1280, 1024);
    });

    casper.then(function () {
        test.assertTitle("Home - PubMed - NCBI", "Title is Home - PubMed - NCBI");
        this.fill('form#EntrezForm', config.form, true);
    });

    //Changes made here!
    casper.waitForText("Search results", function () {
        test.assertUrlMatch(/pubmed\/\?term=Hello/, 
            'New location is ' + this.getCurrentUrl());
    });

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

});

更新试试这个

添加失败条件并抓取屏幕以查看发生了什么(或没有发生什么)

casper.waitForText("Search results", function () {
  test.assertUrlMatch(/pubmed\/\?term=Hello/, 
  'New location is ' + this.getCurrentUrl());
}, function() {
  casper.capture("grab.png");
});

您还可以在 casper.test

的正下方添加用户代理字符串
casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X)');    

您也可以尝试增加超时时间,使其超过 5 秒,例如

    casper.waitForText("Search results", function () {
        test.assertUrlMatch(/pubmed\/\?term=Hello/, 
            'New location is ' + this.getCurrentUrl());
    }, null, 10000);

更新也试试这个 - 远景!

尝试用这个代码替换。填写表格的同时提交...

casper.then(function () {
  test.assertTitle("Home - PubMed - NCBI", "Title is Home - PubMed - NCBI");
  this.fillSelectors('form', {
    "input[id='term']": "Hello"
  }, true);
});