Заполнение формы в журнале с помощью зомби в node.js
Вечер! Я пытаюсь зайти на сайт с помощью zombie.js, но я не могу заставить его работать. Да, и сайт на финском, но это не очень сложно понять, два текстовых поля и кнопка. Первый - для имени пользователя, второй - для пароля, а кнопка - кнопка входа в систему.
На данный момент мой логин-код выглядит следующим образом:
var Browser = require("zombie");
browser = new Browser();
browser.visit("https://www.nordnet.fi/mux/login/startFI.html?cmpi=start-loggain",
function () {
// Here I check the title of the page I'm on.
console.log(browser.text("title"));
// Here I fill the needed information.
browser.document.getElementById("input1").value ="MYUSERNAME";
browser.document.getElementById("pContent").value ="MYPASSWORD";
// And here it fails. I try to submit the form in question.
browser.document.getElementById("loginForm").submit();
setTimeout(function () {
// This is here to check that we've submitted the info and have been
// redirected to a new website.
console.log(browser.text("title"));
}, 2000);
});
Теперь я знаю, что, возможно, мне следовало использовать собственный метод "заполнения" зомби, но я попробовал это без удачи, поэтому я попробовал что-то новое.
Все, что я получаю от этого, является ошибкой:
Y:\IMC\Development\Web\node_modules\zombie\lib\zombie\forms.js:72
return history._submit(_this.getAttribute("action"), _this.getAttribute(
^
TypeError: Cannot call method '_submit' of undefined
Теперь, если я войду browser.document.getElementById("loginForm")
он явно находит форму, но, увы, ему почему-то не нравится.
Я также попробовал "обычный" метод с зомби, который использует эту кнопку входа на веб-странице и нажимает ее. Проблема в том, что на самом деле это не кнопка, а изображение, к которому прикреплена ссылка, и все внутри. <span>
, И я понятия не имею, как я могу "нажать" эту кнопку.
У него нет идентификатора, поэтому я не могу его использовать, затем я попытался использовать текст на нем, но, поскольку на нем умлаут, я не могу заставить его работать. Выход из /344 только дал ошибку:
throw new Error("No BUTTON '" + selector + "'");
^
Error: No BUTTON 'Kirjaudu sisään'
Так что да, это не сработало, хотя я понятия не имею, почему он не распознает сбежавший умлаут правильно.
Это мой первый вопрос, второй - второстепенный, но я почему бы не задать его здесь и сейчас, когда я написал этот текст.
Если я заставлю все это работать, могу ли я каким-то образом скопировать куки, которые дает мне этот логин, и использовать их в моем YQL для очистки экрана? По сути, я пытаюсь очистить биржевые значения, но без входа в систему значения будут отложены на 15 минут, что не так уж и плохо, но я бы все равно хотел, чтобы это было вживую.
1 ответ
После нескольких тестов с использованием зомби я пришел к выводу, что еще рано использовать его для серьезных испытаний. Тем не менее, я пришел с рабочим примером отправки формы (используя обычные .submit()
метод).
var Browser = require("zombie");
var assert = require("assert");
browser = new Browser()
browser.visit("http://duckduckgo.com/", function () {
// fill search query field with value "zombie"
browser.fill('input[name=q]', 'mouse');
// **how** you find a form element is irrelevant - you can use id, selector, anything you want
// in this case it was easiest to just use built in forms collection - fire submit on element found
browser.document.forms[0].submit();
// wait for new page to be loaded then fire callback function
browser.wait().then(function() {
// just dump some debug data to see if we're on the right page
console.log(browser.dump());
})
});
Как видите, подсказка заключается в использовании конструкции browser.wait().then(...)
после отправки формы, в противном случае browser
объект будет по-прежнему ссылаться на начальную страницу (переданную в качестве аргумента visit
метод). Примечание: объект истории будет содержать адрес страницы, на которую вы отправили форму, даже если вы не ждете загрузки страницы - это немного смутило меня, так как я был уверен, что уже должен увидеть новую страницу.
Изменить: Для вашего сайта зомби, кажется, работает нормально (я мог бы отправить форму и получить предупреждение "неправильный логин или пароль"). Есть некоторые ошибки JS, но зомби их не волнует (однако вы должны отладить их, чтобы убедиться, что скрипт работает нормально для обычных пользователей). Во всяком случае, вот сценарий, который я использовал:
var Browser = require("zombie");
var assert = require("assert");
browser = new Browser()
browser.visit("https://www.nordnet.fi/mux/login/startFI.html?cmpi=start-loggain", function () {
// fill in login field
browser.fill('#input1', 'zombie');
// fill in password field
browser.fill('#pContent', 'commingyourway');
// submit the form
browser.document.forms[0].submit();
// wait for new page to be loaded then fire callback function
browser.wait().then(function() {
console.log('Form submitted ok!');
// the resulting page will be displayed in your default browser
browser.viewInBrowser();
})
});
Как примечание: пока я пытался придумать рабочий пример, я пытался использовать следующие страницы (все потерпели неудачу по разным причинам):
- google.com - несмотря на то, что я заполнил строку запроса строкой и отправил форму, я не получил результаты поиска. Причина? Вероятно, Google принял некоторые меры, чтобы предотвратить автоматические инструменты (например, зомби) для просмотра результатов поиска.
- bing.com - так же, как Google - после отправки формы я не получил результаты поиска. Причина? Вероятно, так же, как для Google.
- paulirish.com - После заполнения поля поискового запроса и отправки формы зомби обнаружил ошибки скрипта, которые мешают ему завершить страницу (что-то об отсутствии ActiveX в скрипте диаграмм).
- perfectionkills.com - Удивительно, но здесь я столкнулся с теми же проблемами, что и с сайтом Paul Irish - страница с результатами поиска не может быть загружена из-за ошибок JavaScript.
Вывод: не так-то просто заставить зомби выполнять вашу работу...:)