5

夜!Zombie.js で Web サイトにログインしようとしていますが、うまく動作しないようです。ああ、ウェブサイトはフィンランド語ですが、理解するのは難しくありません.2つのテキストフィールドと1つのボタンです. 1 つ目はユーザー名、2 つ目はパスワード、ボタンはログイン ボタンです。

現時点で、私のログインコードは次のとおりです。

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>です。そして、そのボタンを「クリック」する方法がわかりません。

ID がないので使用できず、テキストを使用しようとしましたが、ウムラウトがあるため機能しません。/344 で ä をエスケープすると、エラーが発生するだけでした:

throw new Error("No BUTTON '" + selector + "'");
        ^
Error: No BUTTON 'Kirjaudu sisään'

ええ、それはうまくいきませんでしたが、エスケープされたウムラウトを正しく認識しない理由はわかりません。

これは私の最初の質問であり、2 番目の質問は些細なことですが、このテキストを書いたので、ここでも質問してみませんか。

これがすべて機能するようになったら、このログインで得られる Cookie を何らかの方法でコピーし、それを YQL で使用して画面をスクレイピングすることはできますか? 基本的に私は株式市場の価値をかき集めようとしていますが、ログがなければ値は 15 分延期されます。これはそれほど悪くはありませんが、とにかくライブにしたいと思います。

4

1 に答える 1

8

ゾンビを使用していくつかのテストを行った後、本格的なテストにゾンビを使用するにはまだ時期尚早であるという結論に達しました。それにもかかわらず、フォーム送信の実際の例を思いつきました(通常の.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メソッドに引数として渡されるページ) を参照します。注: history オブジェクトには、ページが読み込まれるのを待たなくても、フォームを送信したページのアドレスが含まれます。新しいページが既に表示されているはずだったので、少し混乱しました。


編集:あなたのサイトでは、ゾンビは正常に動作しているようです (フォームを送信して、「ログインまたはパスワードが間違っています」というアラートを受け取ることができました)。いくつかの JS エラーがありますが、zombie はそれらに関係ありません (スクリプトが通常のユーザーに対して正常に動作するかどうかを確認するために、それらをデバッグする必要があります)。とにかく、これが私が使用したスクリプトです:

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 と同じ - フォームを送信した後、検索結果が得られませんでした。理由?おそらくグーグルと同じです。
  • paulirish.com - 検索クエリ ボックスに入力してフォームを送信した後、ゾンビがスクリプト エラーに遭遇し、ページを完成できませんでした (チャート スクリプトから ActiveX が欠落しているなど)。
  • perfectionkills.com - 驚いたことに、ポール アイリッシュのサイトと同じ問題に遭遇しました。JavaScript エラーのため、検索結果のページを読み込めませんでした。

結論: 結局、ゾンビに自分の仕事を強制するのはそれほど簡単ではありません... :)

于 2012-08-24T08:05:31.850 に答える