WebAii HtmlControl.Click() щелкает неправильный элемент управления
Я довольно часто использовал бесплатную версию тестового фреймворка WebAii (выпущенного Art Of Test до их приобретения Telerik), поэтому я знаю, что он в основном работает. Так что проблема, с которой я столкнулся сейчас, совершенно меня ставит в тупик.
Я пытаюсь проверить навигацию на существующем сайте и прохожу последовательность страниц. Я попадаю на страницу, которая имеет (среди прочего) две кнопки. Одним из них является кнопка "назад", которая является элементом ввода типа button с обработчиком onclick, который вызывает функцию javascript, которая просто вызывает history.back(). Другой - кнопка отправки.
У WebAii нет проблем с поиском кнопки отправки. Но когда я говорю это, чтобы щелкнуть по нему, это, по всей видимости, нажатием кнопки назад.
Вот соответствующий HTML с сайта:
<div align="right">
<table border="0" width="200" cellpadding="8" style="border-collapse: collapse" bordercolor="#E0DFE3">
<tr>
<td>
<input type="button" value="<- Back" name="B2" onclick="cancelChange()" >
</td>
<td>
<input type="submit" value="Maint Details ->" name="lnkSubmit">
</td>
</tr>
</table>
</div>
И вот тестовый код:
HtmlInputSubmit maintDetailsButton = Find.ByAttributes<HtmlInputSubmit>("value=Maint Details ->");
maintDetailsButton.Click();
Assert.IsTrue(ActiveBrowser.Url.Contains(expectedPage), "URL {0} does not contain expected page {1}", ActiveBrowser.Url, expectedPage);
Последовательность операций работает очень хорошо, когда я нажимаю на нее вручную, поэтому я не вижу никаких доказательств того, что это проблема сайта. Я видел множество доказательств того, что это, на самом деле, нажатие кнопки "Назад", а не кнопки "Подробная информация об обслуживании". (Fiddler показывает, что при отправке запроса на клик запрос не выдается - в соответствии с выполнением history.back(), так как браузер просто переотображается из своего кэша. Когда я нажимаю, он фактически переходит на предыдущую страницу. И, наконец, если я уберу атрибут "onclick" с кнопки "назад", чтобы нажатие на кнопку ничего не делало, то при выполнении тестового кода сайт ничего не делал - просто оставался на текущей странице.)
Я полностью сбит с толку. Кто-нибудь может дать мне подсказку?
1 ответ
Ну, я потратил неделю на то, чтобы биться головой о стену, но я понял это.
Сначала я кое-что обнаружил. Из того, что я смог сделать вывод, когда вы выполняете Find, WebAii отслеживает этот элемент как индекс в списке всех элементов этого типа в документе. Затем при каждом обращении к найденному элементу WebAii будет генерировать функцию JavaScript в форме "document.GetElementsByTag('')[]." Я обнаружил это случайно, когда пытался найти способ идентифицировать элемент, который обнаружил WebAii, и непреднамеренно сгенерировал ошибку javascript, которая отображала функцию, которую он пытался выполнить, в исключении. Итак, я решил, что если он обращается к элементу по индексу, а его индекс так или иначе отключен, то имело бы смысл щелкнуть элемент ввода раньше, чем тот, который мне нужен. Поэтому я сделал Find.AllByTagName("input"), просмотрел итоговую коллекцию ReadOnlyCollection в отладчике VS и начал сопоставлять найденные элементы ввода с тем, что я мог идентифицировать, глядя на View View на странице. Я обнаружил, что находил тот, который WebAii не перечислял, в верхней части страницы, и при ближайшем рассмотрении обнаружил, что отсутствующий элемент ввода не имеет закрывающей угловой скобки. Таким образом, очевидно, что WebAii не нашел это как элемент ввода, но javascript сделал. Поэтому, когда мой тест сказал "maintDetails.Click()", это преобразовывалось во что-то вроде "document.GetElementsByTag('input')[20].click()", когда из-за отсутствующего элемента это должно было быть "document.GetElementsByTag ('вход')[21].click()".
Я исправил отсутствующую закрывающую угловую скобку в исходном коде сайта, и тест прошел.