JavaScript が混在するリストの選択に問題があります。ページの元のコードは次のとおりです。
<select id="List_1" name="List_1">
<option value="">Select..</option>
<option value="val_1" >Orange</option>
<option value="val_2" >Apple</option>
<option value="val_3" >Peach</option>
</select>
しかし、JS ファイルが読み込まれると、リストが変更され、生成されたソースを表示すると、次のようになります。
<div tabindex="0" style="-moz-user-select: none;" role="listbox" title="Fruit" class="fruit-box k-select">Select..</div>
そして、WatiN はもうリストボックスを見つけることができません..
私は試した:
browser.Element(Find.ById("Fruit")).Focus();
browser.Element(Find.ById("Fruit")).Click();
しかし、それはドロップダウンリストを下げるきっかけにはなりませんでした。次に、GoToNoWait(); でページをリクエストしようとしました。次に、ループを使用して、JS が読み込まれる前に、それを変更するリストを見つけます。
while (browser.SelectLists.Count <= 0)
{
Thread.Sleep(100); // wait until the first option list is loaded
}
foreach (WatiN.Core.SelectList a in brower.SelectLists)
{
if (a.IdOrName == "Fruit")
{
a.SelectByValue("val_1");
}
}
最初はブラウザー (JS ではない) でリストが正常に表示されていることがわかりますが、ページの読み込み中にループがハングし、foreach ループが実行される前に JS が読み込まれます。
私の唯一の解決策はこれです:
browser.Div(Find.ByTitle("Fruit")).Focus();
browser.Div(Find.ByTitle("Fruit")).Click();
browser.Div(Find.ByTitle("Fruit")).FireEvent("onClick");
SendKeys.SendWait("{DOWN}");
SendKeys.SendWait("{DOWN}");
SendKeys.SendWait("{ENTER}");
しかし、SendKeys を使用するときは、Firefox ウィンドウにフォーカスする必要があります。そうしないと、現在開いているアプリケーションにキーストロークが送信されてしまい、うまくいきません。
JS を追加する前に、オプション リストを選択する方法はありますか? または、現在フォーカスされているアプリケーションではなく、SendKeys を使用して特定のアプリケーションを指す方法はありますか? ありがとうございました!