ЦЕЛЬ
Здесь я пытаюсь выполнить базовую навигацию по поиску на веб-сайте 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();
});*/
});
После того, как я отправлю форму или запрошу новый 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);
});
casperjs 1.1.4
, phantomjs 2.1.1
, nodejs v4.2.6
в Ubuntu 16.04.2
. Насколько я вижу, я думаю, что есть проблема с выполнением кнопки «поиск». Вот изображение grab.png . В этой части кода страница уже должна была попасть в «Результаты поиска», но это не так. Вот теперь выглядит текущая ошибка .