0

Seleniumスクリプトを整理および作成するために、 soda.jsを使用して node.js スクリプトを作成しようとしています。私が直面している問題は、 soda.jsチェーンの哲学を根本的に理解していないことです。特に、メソッドとドキュメントは、それがどのように機能するかを説明するのに非常に弱いです。and()

次のテスト ケースを想像してください。

var soda = require('soda');
var assert = require('assert');

var browser = soda.createClient({
    host: 'localhost',
    port: 4444,
    url: 'http://www.google.com',
    browser: 'firefox'
});

browser
    .chain
    .session()
    .open("http://www.google.com", function() {
        console.log("open complete");
    })
    .and(function() {
        console.log("and");
    })
    .and(function() {
        return function(browser) {
            console.log("and2");
        }
    }())
    .end(function() {
        console.log("end");
    })

チェーン API についての私の理解は、それがコールバック地獄を防ぐことであるということでした。したがって、browser.method1().method2().method3() を呼び出すとします。その後、method2 はメソッド 1 を待ちます。method3 は method2() などを待機します。同期の容易さを提供しますが、イベントの機能を提供します。

私が期待する

open complete
and
and2
end

私は得る

and
and2
open complete
end

何?それは明らかにand、独自の任意の関数を宣言していると思われるメソッドと関係がありますが、キューの順序に従っているようには見えません。テスト ケースでわかるように、and 関数を宣言する 2 つの方法を試しました。1 つは自己実行関数クロージャを使用し、もう 1 つは標準の無名関数を使用します。どちらの場合も同じ結果です。and()キューの順序に従うようにするにはどうすればよいですか?

4

1 に答える 1

0

頭を悩ませた後、github でソーダのソースコードを注ぐだけで、これがどのように機能するかをようやく理解することができました。基本的に、.and()メソッドはすぐに起動します。.end()チェーンされた各リクエストはキューに追加されるだけで、呼び出しに到達するまでキューの処理を開始しません。

このように、 内のコードand()は常に、他の呼び出しからのコールバックの前に処理されます。この方法and()では、動的に定義されたアクションをキューに入れるために主に使用されます。以前に起動されたアクションに応答するのには役立ちません。代わりにコールバックで実行する必要があります。

于 2012-11-08T07:34:05.393 に答える