2009-07-21 10 views
3

私は2つのドロップダウンリストを持っています.1つは国のリストを含み、もう1つは州/地域のために、国の1つが選択されるまで表示されません。これらのドロップダウンは両方とも、更新パネルでラップされます。米国を選択すると、州のドロップダウンリストが50州で満たされ、そこから進んでいくことができます。C#with Selenium Ajaxドロップダウンリスト質問

私たちはこのコードでテストを実行するためにSeleniumを使用していますが、テストは状態のドロップダウンに達すると必ず破棄されます。状態リストを生成するには時間がかかりすぎるか、レンダリングされる最初のhtmlにないため、値を見つけることができないことがあります。私はjavascriptの "WaitForCondition"フィールドについていくつかのことを見てきましたが、これをセレンのドキュメントでどのように使うかについての詳細は見つかりません。私はジャバスクリプトの戸惑いではありませんが、どちらかといえば最大のものではありません。私のジレンマを解決する方法を誰に教えてもらえますか?また、WaitForConditionフィールドの知識が必要な場合は、どうすればそれを動作させることができるのか説明できますか?

記録のために、私はこの投稿を見ました:(click here for semi-useful stackoverflow post)しかし、私は自分の状況にそれを関連付ける方法を理解していません。あなたが私に与えることができるものは、事前に感謝します。

答えて

2

だから、私は自分の問題への解決策を発見したが判明しました。

私はC#のテストで次の行を使用し、それが即座に私のドロップダウンリストに値を検索します。

私は、次のパラメータを使用IDEで
selenium.WaitForCondition("var ddl = selenium.browserbot.getCurrentWindow().document.getElementById('insert-id-of-dropdownlist-here'); ddl.options[ddl.selectedIndex].text == 'insert-text-value-to-search-for-in-dropdown-here';", "10000"); 

コマンド:WAITFORCONDITION

ターゲット:var ddl = selenium.browserbot.getCurrentWindow()。document.getElementById( 'insert-id-of-dropdownlist-here'); ddl.options [ddl.selectedIndex] .text == 'ここにドロップダウンリストを挿入するテキスト値を挿入する';

:10000

これは最終的に私が解決策を考え出す助けたページです: http://wiki.openqa.org/display/SEL/waitForCondition

+0

興味深い解決策をありがとう。私は上記のコードを読む前にwaitForConditionに慣れていませんでした。私は今質問があると思う:維持するのが一番簡単ですか? javascriptのいくつかの行、またはwaitメソッドを使用するとSeleniumがエクスポートするclunky 'for'ループ。 :-)私は一般に 'for'ループを使い、初心者プログラマーがテストを維持するのが簡単ですが、あなたの意見を聞くことに興味があります。 –

+0

JavaScriptが苦痛であることは間違いありません。このソリューションを頻繁に使用する必要はないことを願っていますが、非常に迅速に実行され、問題を解決します。私たちは最終的にこれらのユニットテストが非常に多くなるため、ここでコードの可読性よりもはるかに高速です。しかし、私はあなたがどこから来ているのか確かに見ています。ここであなたの助けをありがとう。 – shizbiz

4

あなたはSelenium IDEを使用していますか?これにより、コードを記述して、Selenium RCで使用している言語にエクスポートするのが非常に簡単になります。

Selenium IDEには、「waitForText」というメソッドがあります。このメソッドは、引数として要素ロケータを、値として文字列を取ります。あなたのロケータは、状態ドロップダウンリストのid(または、もしそれが動的idを持っているならcssセレクタ)になります。値の場合は、ロードされた後にのみドロップダウンに存在するものを使用します(リスト内の最後のUS州がおそらく最良の選択です)。

説明が必要な場合や詳細をお知らせください。

よろしく、 マーク

+1

私はセレンのIDEを持っています。あなたのソリューションは実際には非常に奇妙な(そして受け入れられない)方法で動作します。 waitForTextメソッドは、問題の値を検索し、見つからず、最終的にタイムアウトします。しかし、タイムアウトするまでに時間がかかるので、最終的にIDEがドロップダウンが入力されたことを認識して、オプションを選択するステートメントが現在の値を見つけ出すのに十分な時間を渡します。 – shizbiz

1

は申し訳ありませんが、私の前に実際のページをせずに自分のコードをテストすることが難しかったです。問題は、各状態がselect要素の下にあるoption要素(またはこれを別の方法で処理するjavascriptフレームワークを使用している可能性があります)である可能性があります。

waitForElementPresent | css=option:contains('someState') 

としてエクスポートします:あなたはoption要素を持っている場合は、これを使用することができ

for (int second = 0;; second++) { 
       if (second >= 60) Assert.Fail("timeout"); 
       try 
       { 
        if (selenium.IsElementPresent("css=option:contains('someState')")) break; 
       } 
       catch (Exception) 
       {} 
       Thread.Sleep(1000); 
      }