Автозаполнение меню DropDown с использованием WatiN - PullRequest
3 голосов
/ 15 сентября 2011

Я использую 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: http://jqueryui.com/demos/autocomplete/

Поиск в Google для тестирования автозаполнения пользовательского интерфейса jQuery, я обнаружил, что переполнение стека вопросы и ответы: Тестирование интерфейса автозаполнения JQuery с огурцом

содержащая, казалось бы, важную информацию: «Сначала нужно вызвать мышь, а затем щелкнуть мышью»

Тогда я гуглил при наведении мыши на WatiN и нашел 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. Найдите элемент <ul> с классом «ui-autocomplete» и стилем отображения «block», ожидая, пока он не появится
  3. В этом элементе <ul> найдите элемент <li>, текст которого является требуемым значением (например, «ABC DEFGHIJ»)
  4. Запустить событие onmouseover для этого <li> элемента
  5. Щелкните элемент <li>.

Я обнаружил две проблемы: во-первых, ввод WatiN в поле ввода очень плохо вызывал появление меню автозаполнения, и во-вторых, что нажатие на элемент меню не вызывает автозаполнения.

Я обнаружил, что отправка события нажатия клавиши со стрелкой вниз в поле ввода побуждает к появлению меню, но не вызывает выделения элемента верхнего меню (тогда как если вы наберете вручную и нажмете стрелку вниз, это произойдет). Как правильно активировать пункт меню (включая получение его идентификатора, установленного в ui-active-menuitem), здесь может отсутствовать ссылка.

Может кто-нибудь помочь мне понять и решить две проблемы, которые я упомянул?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Потребовалось немного, но вот рабочий пример.

Ключевые точки

  • Вызвать метод объекта JQuery search . Это получает выпадающий список показывать.
  • затем стреляйте 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.

0 голосов
/ 16 сентября 2011

Я также столкнулся с подобной проблемой в приложении, которое я тестирую.Когда я набираю текстовое поле, используя 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 - ссылка на текстовое поле, а value - значениеэто должно быть введено.

...