отправка формы с помощью casperjs - новый URL не загружается

1

ЦЕЛЬ

Здесь я пытаюсь выполнить базовую навигацию по поиску на веб-сайте Pubmed. Допустим, что термин, который я ищу, это Hello. То, что я ожидаю в конце, - приземлиться на странице результатов после нажатия кнопки поиска.

ПРОБЛЕМА

Код отправки отлично работает на javascript-консоли браузера Chrome. Но это не работает через 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();
  });*/

});
Теги:
phantomjs
casperjs

1 ответ

1
Лучший ответ

После того, как я отправлю форму или запрошу новый 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();
    });

});

Изображение 174551

ОБНОВЛЕНИЕ ПОПРОБУЙТЕ ЭТО

Добавьте условие сбоя и возьмите захват экрана, чтобы увидеть, что произошло (или что не произошло)

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);
});
  • 0
    Удивительно, как приведенный выше код не работает для меня ... Я получаю следующую ошибку. скриншот ошибки
  • 0
    Я использую casperjs 1.1.4 , phantomjs 2.1.1 , nodejs v4.2.6 в Ubuntu 16.04.2 . Насколько я вижу, я думаю, что есть проблема с выполнением кнопки «поиск». Вот изображение grab.png . В этой части кода страница уже должна была попасть в «Результаты поиска», но это не так. Вот теперь выглядит текущая ошибка .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню