2015-07-30 3 views
2

У меня есть пучок input[type=submit] кнопок внутри GridView. id s и name s этих кнопок, хотя и предсказуемы, потому что они используют индексный номер, плохо подходят для автоматизации с использованием SpecFlow и Coded UI Tests. Мне трудно найти эти кнопки.Как найти элемент по пользовательскому атрибуту HTML с использованием кодированных пользовательских интерфейсов

Фрагмент из HTML доставлены в браузере:

<input type="submit" id="abc_xyz_0" data-task-id="123" value="Apply"> 
<input type="submit" id="qrs_tuv_0" data-task-id="345" value="Renew"> 

Текст кнопки является общим в каждой строке («Применить» и «Обновить»), но атрибут data-task-id уникален. Я хотел бы использовать этот атрибут и значение, чтобы идентифицировать кнопку, на которую нужно щелкнуть. Я пытаюсь использовать SearchProperties и FilterProperties, но я получаю исключение:

System.NotSupportedException: DataTaskId свойства не поддерживается для этого элемента управления.

Как я пытаюсь найти управление:

HtmlInputButton button = new HtmlInputButton(document); 

button.SearchProperties["data-task-id"] = "123"; 
// or button.SearchProperties["DataTaskId"] = "123"; 

Некоторые дополнительные детали:

  • Окна 7
  • Internet Explorer 11
  • веб-сайт поставляется с localhost и помечен как «доверенный» в настройках безопасности параметров Интернета

Обновление: Спасибо обоим Marcel De Vries и AfroMogli для своих ответов. Марсель использует JavaScript для поиска элемента, а AfroMogli использует чистые C# и API CodedUI. Оба ответа работали одинаково хорошо, и я не заметил разницы в производительности между ними. Два одинаково хороших решения.

ответ

5

Вы можете сделать это с помощью функции поиска с ControlDefinition в PROPERTYNAME. Следующая строка кода сделал трюк для меня:

HtmlInputButton button = new HtmlInputButton(document); 
button.SearchProperties.Add(button.SearchProperties.Add(new PropertyExpression(HtmlControl.PropertyNames.ControlDefinition, "data-task-id=\"123\"", PropertyExpressionOperator.Contains)); 

Пример метод позволяет передать любое имя атрибута и значение:

public HtmlInputButton InputButton(string attributeName, string attributeValue, UITestControl container = null) 
{ 
    string controlDefinition = string.Format("{0}=\"{1}\"", attributeName, attributeValue); 
    HtmlInputButton button = new HtmlInputButton(container ?? document); 
    button.SearchProperties.Add(new PropertyExpression(HtmlControl.PropertyNames.ControlDefinition, controlDefinition, PropertyExpressionOperator.Contains)); 

    return button; 
} 
+0

Мне нужно попробовать это. В идеале мне бы хотелось, чтобы решение не включало запуск JavaScript против браузера. –

+0

Отлично, пожалуйста, вернитесь к нам о том, как это получилось :) – AfroMogli

+0

Это сработало отлично! Мне также нравится, как это решение для чистого кодированного интерфейса. Я разрываюсь. Хотелось бы, чтобы я мог отследить ваши ответы и ответить на вопросы о дебатах. –

2

Простейший способ сделать это - просто выполнить javascript для получения элемента управления на основе любого имени и значения атрибута, которые вы предоставляете. что-то вроде этого:

const string javascript = "return document.querySelector('{0}');"; 
var bw = BrowserWindow.Launch("your page"); 
string selector = "[data-task-id]='123']"; 
var control = bw.ExecuteScript(string.Format(javascript,selector));` 

Управление переменной теперь содержит элемент управления, который вы ищете, и имеет правильный тип. Так, если это, например, и HtmlHyperLink вы можете использовать его как таковой правильно.

У меня есть длинный рассказ о том, как использовать это в угловых участках здесь: http://fluentbytes.com/testing-angular-sites-with-codedui/ поскольку угловые использует даже пользовательские атрибуты, как ng- *

+0

'метод ExecuteScript' всегда возвращается' null' для меня , Я прочитал сообщение в блоге, и использование 'ControlDefinition' в качестве фильтра также не находит элемент. Нужно больше копать –

+0

Я приостанавливаю отладчик и использую 'window.ExecuteScript (« document.querySelector ('body'); ")' и даже это возвращает «null» (поле «window» - это объект BrowserWindow). –

+0

Я попробовал 'window.ExecuteScript (« alert ('foo'); »)' и он показывает, что браузер очень хорошо работает. JavaScript выполняется, он просто не фиксирует возвращаемое значение скрипта. –

Смежные вопросы