Получение объекта HtmlHyperLink из HtmlDiv с помощью С#

Я запускаю тестовый проект в визуальных студиях, который выполняет тестовые шаги для веб-страницы.

Сама веб-страница плохо закодирована. у него есть что-то вроде этого:

<a id ="GenericButton" </a> 

<div id="UniqueID" class="ThisDiv">
    <a id ="GenericButton" </a> 
</div>

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно щелкнуть ссылку внутри div «UniqueID». Я не хочу нажимать первую веб-кнопку.

Используя код:

HtmlHyperlink myLink = new HtmlHyperlink(this.IE);
myLink.SearchProperties[HtmlHyperlink.PropertyNames.Id] = "GenericButton";
Mouse.Click(myLink)

Приведет к нажатию первой кнопки вместо кнопки внутри div "UniqueID"

Я могу получить div, используя:

HtmlDiv myDiv = new HtmlDiv(this.IE);
myDiv.SearchProperties[HtmlCheckBox.PropertyNames.Class] = "ThisDiv";
myDiv.SearchProperties[HtmlCheckBox.PropertyNames.Id] = "UniqueID";
//The below line is later referenced
int myDivTag = myDiv.TagInstance;

Но как я могу захватить кадр внутри этого div?

Кроме того, при отладке объект myDiv, по-видимому, неправильно настраивается в Visual Studio, пока не будет запущена строка «int myDivTag = myDiv.TagInstance;». Почему отладчик не знает, на какой объект я ссылаюсь, пока это не произойдет?

Я использую библиотеки Visual Studio для этих операций вместо чего-то вроде WatiN.


person user2589339    schedule 22.10.2014    source источник
comment
Сначала вы должны исправить свою разметку. </div?   -  person melancia    schedule 22.10.2014
comment
Исправлено. теперь что я могу сделать?   -  person user2589339    schedule 22.10.2014
comment
Сайт ваш? Сайт должен быть тестируемым в первую очередь, поэтому, если он находится под вашим контролем, его исправление принесет дивиденды.   -  person Arran    schedule 22.10.2014
comment
Сайт не мой.   -  person user2589339    schedule 22.10.2014


Ответы (2)


Если веб-страница имеет плохой код, то тесты для веб-страницы должны дать сбой для битов, которые были реализованы плохо — просто.

В HTML два элемента не должны иметь одинаковый идентификатор. Поэтому пишите свои тесты, ожидая только один элемент. Поскольку входная разметка для вашего теста предоставит два элемента с одним и тем же идентификатором, тест должен завершиться неудачей и оставаться неудачным до тех пор, пока проблема не будет действительно устранена на другом конце.

Нет смысла взламывать ваши тесты, чтобы они работали с плохими инструментами, поскольку это лишает смысла тестирование.

Обновление: я нашел этот ответ, который может помочь найти вложенный элемент a.

person Adrian Sanguineti    schedule 22.10.2014
comment
Согласен, но у меня нет доступа к этому коду. Что я могу сделать? - person user2589339; 22.10.2014
comment
Что ж, все зависит от цели вашего тестирования, которую вам нужно будет объяснить. Почему именно эта кнопка должна быть нажата? - person Adrian Sanguineti; 22.10.2014
comment
Первая кнопка на самом деле не видна. хотя он все еще существует в html-коде. Но обе кнопки имеют одинаковое назначение. При определенных условиях первая кнопка появится и станет доступной для нажатия. но в условиях испытаний он должен оставаться невидимым. Однако проблема с веб-страницей не зависит от моей проблемы. Как я могу захватить ссылку, которая должна быть внутри div? - person user2589339; 22.10.2014
comment
Я не сижу за компьютером, на котором установлена ​​версия Visual Studio, поддерживающая закодированные тесты пользовательского интерфейса, поэтому, к сожалению, это затрудняет опробование идей для вас. Но я считаю, что этот ответ может быть вам полезен. - person Adrian Sanguineti; 22.10.2014
comment
По возможности используйте теги id или className в HTML, а не индекс узлов, как я сделал в этом вопросе. - person Ryan Cox; 24.10.2014

Адриан дал полезную ссылку на исправление: Как справиться с тестированием элемента управления HTML, в котором отсутствуют достаточно уникальные атрибуты?

HtmlDiv myDiv = new HtmlDiv(this.IE);
myDiv.SearchProperties[HtmlDiv.PropertyNames.Class] = "ThisDiv";
myDiv.SearchProperties[HtmlDiv.PropertyNames.Id] = "UniqueID";
HtmlHyperlink myLink = new HtmlHyperlink(myDiv);
myLink.SearchProperties[HtmlHyperlink.PropertyNames.id] = "GenericButton";

Mouse.Click(myLink);
person user2589339    schedule 22.10.2014