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 文件加载时,它会修改 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 并将其指向特定的应用程序而不是当前专注的应用程序?谢谢!

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 回答