Watin,选择由Javascript生成的html选项列表

时间:2012-07-02 16:52:27

标签: c# list watin

我在选择与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文件时,它会修改List,当我查看Generated Source时,我得到了这个:

 <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并将其指向特定应用程序而不是当前关注的应用程序?谢谢!

1 个答案:

答案 0 :(得分:0)

我假设javascript会生成一组LI项,然后可以在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();