我在选择与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并将其指向特定应用程序而不是当前关注的应用程序?谢谢!
答案 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();