подача формы jsdom?
Я пытаюсь использовать узел.пакеты js запрашивают и jsdom, чтобы очистить веб-страницы, и я хочу знать, как я могу отправить формы и получить их ответы. Я не уверен, возможно ли это с помощью jsdom или другого модуля, но я знаю, что запрос поддерживает файлы cookie.
Следующий код демонстрирует, как я использую jsdom (наряду с запросом и jQuery) для извлечения и анализа веб-страницы (в данном случае домашней страницы Википедии). (Обратите внимание, что этот код адаптирован из jQuery-запроса.код js из этого учебника http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs )var request = require('request'),
jsdom = require('jsdom'),
url = 'http://www.wikipedia.org';
request({ uri:url }, function (error, response, body) {
if (error && response.statusCode !== 200) {
console.log('Error when contacting '+url);
}
jsdom.env({
html: body,
scripts: [
'http://code.jquery.com/jquery-1.5.min.js'
]
}, function (err, window) {
var $ = window.jQuery,
// jQuery is now loaded on the jsdom window created from 'agent.body'
$searchform = $('#searchform'); //search form jQuery object
$('#searchInput').val('Wood');
console.log('form HTML is ' + $searchform.html(),
'search value is ' + $('#searchInput').val()
//how I'd like to submit the search form
$('#searchform .searchButton').click();
);
});
});
Приведенный выше код выводит HTML из поисковой формы Википедии, а затем "дерево", значение, которое я установил в поле searchInput. Конечно, здесь метод click () на самом деле ничего не делает, потому что jQuery не работает в браузере; я даже не знаю, поддерживает ли jsdom какой-либо вид обработки событий.
Есть ли какой-либо модуль, который может помочь мне взаимодействовать с веб-страницами таким образом, или в похожий не-jQuery способ? Можно ли это сделать в jsdom?
Заранее спасибо!
2 ответа:
Если вы не хотите обрабатывать запрос POST самостоятельно, как в другом ответе, вы можете использовать альтернативу jsdom, которая поддерживает больше вещей в браузере.
Я не знаком с библиотекой nodejs, которая позволит вам получить полностью интерактивный вид веб-страницы на стороне клиента, но вы можете получить результаты отправки формы без особых проблем.
По сути, HTML-формы-это просто способ отправки HTTP-запросов на определенный URL (который можно найти в качестве атрибутаaction
тегаform
). Имея доступ к DOM, вы можете просто вытащить эти значения и создать свой собственный запрос для указанного URL.Что-то вроде этого, как обратный звонок от запроса домашней страницы Википедии даст вам результат выполнения поиска "keyboard cat" на английском языке:
var $ = window.jQuery; var search_term = "keyboard cat"; var search_term_safe = encodeURIComponent(search_term).replace("%20", "+"); var lang = "en"; var lang_safe = encodeURIComponent(lang).replace("%20", "+"); var search_submit_url = $("#searchform").attr("action"); var search_input_name = $("#searchInput").attr("name"); var search_language_name = $("#language").attr("name"); var search_string = search_input_name + "=" + search_term_safe + "&" + search_language_name + "=" + lang_safe; // Note the wikipedia specific hack by prepending "http:". var full_search_uri = "http:" + search_submit_url + "?" + search_string; request({ uri: full_search_uri }, function(error, response) { if (error && response.statusCode != 200) { console.log("Got an error from the search page: " + error); } else { // Do some stuff with the response page here. } });
В основном важно следующее:
- "отправка поиска" на самом деле просто означает отправку запроса HTTP
GET
илиPOST
на URL, указанный в атрибутеaction
тегаform
.- создайте строку для отправки формы, используя атрибуты
name
каждого из теговinput
формы в сочетании со значением, которое они задают. на самом деле представляют, в таком формате:name1=value1&name2=value2
- для запросов
GET
Просто добавьте эту строку к URL как строку запроса (URL?query-string
)- для запросов
Обратите внимание, что строка, используемая для отправки формы, должна быть экранирована и иметь пробелы, представленные в видеPOST
разместите эту строку в качестве тела запроса.+
.