使用WatiN自动完成DropDown菜单测试

时间:2011-09-15 16:29:40

标签: watin

我正在使用WatiN测试自动完成功能下拉。

当用户输入3个字符后输入字段时,将触发jquery自动完成并显示未排序的列表。用户必须从列表中进行选择。

我无法使用WatiN从列表中选择/触发自动完成。

以下是开发人员使用的一些HTML:

<ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all" role="listbox" aria-activedescendant="ui-active-menuitem" style="z-index: 1; display: block; width: 275px; top: 301px; left: 262px; ">
<li class="ui-menu-item" role="menuitem"><a class="ui-corner-all" tabindex="-1">ABC DEFGHIJ </a></li>
<li class="ui-menu-item" role="menuitem"><a class="ui-corner-all" tabindex="-1">ABC KLMNOPQ </a></li>
</ul>

他们正在使用jQuery UI自动完成小部件:http://jqueryui.com/demos/autocomplete/

谷歌搜索jQuery UI自动完成测试,我发现这个Stack Overflow Q&amp; A: Testing JQuery autocomplete ui with cucumber

包含似乎是至关重要的信息:“你需要首先触发鼠标悬停,然后点击”

然后我用Google搜索鼠标悬停,找到了http://blogs.telerik.com/testing/posts/08-05-29/how_to_select_radcombobox_item_with_watin.aspx 这有一个代码示例,其中包括:

    Div divStudent3 = ie.Div(Find.ById("idRadComboBox_c2"));   
    divStudent3.FireEvent("onmouseover");   
    divStudent3.Click();  

(要清楚我们的开发代码不使用telerik控件,这只是一个例子)

此时我觉得我有一个计划如何推动这个:

  1. 在字段中键入所需值的一部分(例如“ABC”)
  2. 使用类“ui-autocomplete”查找<ul>元素并显示样式“block”,等待它出现
  3. 在该<ul>元素中,找到其文本为所需值的<li>元素(例如“ABC DEFGHIJ”)
  4. <li>元素
  5. 上触发“onmouseover”事件
  6. 点击<li>元素。
  7. 我发现了两个问题:首先,WatiN在输入字段中的输入在触发自动完成菜单的外观时非常糟糕, 其次,单击菜单项不会导致自动完成。

    我发现向输入字段发送一个向下箭头键事件鼓励显示菜单,但不会导致顶部菜单项突出显示 (如果您手动输入并按下向下箭头,则确实如此)。正确激活菜单项 (包括将其ID设置为ui-active-menuitem)可能是此处缺少的链接。

    有谁能帮我理解和解决我提到的两个问题?

2 个答案:

答案 0 :(得分:3)

花了一点时间,但这是一个有效的例子。

关键点

  • 调用JQuery对象搜索方法。这将获得下拉列表 显示。
  • 然后点击 onmouseover 您想要的项目。
  • 然后点击您想要的项目。

为了让它正确选择项目,我需要按照特定顺序完成上述所有三项。

<强>代码

string searchValue = "c";
string selectItem = "COBOL";

ie.GoTo("http://jqueryui.com/demos/autocomplete/default.html");

ie.TextField("tags").TypeText(searchValue);
ie.Eval(@"$('#tags').autocomplete('search')");
ie.List(Find.ByClass("ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all")).ListItem(Find.ByText(selectItem)).Links[0].FireEvent("onmouseover");
ie.List(Find.ByClass("ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all")).ListItem(Find.ByText(selectItem)).Links[0].Click();

以上作品使用Watin 2.1。它不适用于WatiN 2.0 RC。我没有检查实际的2.0版本。 2.0 RC没有List和ListItem对象。仅在IE8上测试。

答案 1 :(得分:0)

我在我正在测试的应用程序中遇到了类似的问题。当我使用TypeText键入文本字段时,字符会被输入两次。

我们所做的如下。

string mySubStr = value.Substring(0, value.Length - 3);
datavalue.Value = mySubStr;
datavalue.AppendText(value.Substring(value.Length - 3, 3));
Thread.Sleep(500);
datavalue.KeyDown((char)System.Windows.Forms.Keys.Down);
datavalue.KeyDown((char)System.Windows.Forms.Keys.Enter);

其中datavalue是对textfield的引用,value是要键入的值。