0

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 を使用して特定のアプリケーションを指す方法はありますか? ありがとうございました!

4

1 に答える 1

0

私は、一連の LI 項目が JavaScript によって生成され、UI で選択できると想定しています。それが本当なら、あなたはこれを試してみたいかもしれません

Div fruitdiv = browserinstance.Div(Find.ByTitle("Fruit"));
fruitdiv.Click();
fruitdiv.KeyDown();
WatiN.Core.List autocompletelist = (WatiN.Core.List)fruitdiv.NextSibling; // or whatever the relation is
autocompletelist.WaitUntilExists();
string value = "Value to select in the list";
ListItem datavaluelistitem = autocompletelist.ListItem(Find.ByText(new Regex("^" + value + "*")));
datavaluelistitem.MouseDown();
fruitdiv.WaitForComplete();
browserinstance.WaitForComplete();
于 2012-07-03T04:20:06.277 に答える