Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как выбрать контрол, если на странице несколько контролов в одинаковым названием?


(anton_matyushkin) #1

Ситуация следующая: на странице используется несколько блоков с одинаковыми названиями и кнопками (скрин-шот по ссылке http://www.imageup.ru/img225/1177527/primer.jpg.html).

В тесте нужно выполнить нажатие кнопки во втором блоке и выполнить проверку наличия подписи в том же втором блоке.

Проблема заключается в том, что Coded UI Test начинает обход страницы сверху вниз и дойдя до первого элемента с названием останавливается, т.е. попав на первый блок и найдя в нем нужное имя он останавливается и работает с первым блоком.

В заголовке блока передается параметр "id" (<h3 id="3394D30546664CC59AEBCC2A9D0FBC64" data-bind="text: RecordHeader" style="margin-left: 5px">12.11.2012 16:01 Перевод из отделения реанимации</h3>), который является идентификатором типа записи, можно было бы делать проверку по нему. Однако тут встает вопрос: Можно ли сделать поиск в Coded UI Test по параметру передаваемому в теге? Если да, то КАК?

Остается открытым вопрос с кнопками, т.к. для кнопок идентификаторов нет и название у них одинаковые. Поэтому стоит второй вопрос: Как написать тест, чтобы он тыкал не первую попавшуюся кнопку с названием, а мог дойти до ниже стоящих (второй, третьей и т.д.)?

 


(rabsi) #2

Я работаю с десктоп приложениями, а не веб, но принцип работы CodedUITest одинаковый. Исходя из механизма поиска контролов в CodedUITest, который вы должны знать, иначе как вы вообще ищете контролы, для поиска контрола по параметрам можно использовать следующий вариант:

HtmlControl control = new HtmlControl();
control.SearchProperties[HtmlControl.PropertyNames.Id] = "3394D30546664CC59AEBCC2A9D0FBC64";            
Так ищутся все контролы, сначала создаете экземпляр контрола, а потом указываете свойства для поиска. В первой строке в качестве параметра можно указать какой-то другой контрол, внутри которого находится искомый.
Для работы с контролами, у которых свойства поиска одинаковые, можно использовать следующий вариант:
HtmlControl control = new HtmlControl();
control.SearchProperties[HtmlControl.PropertyNames.Id] = "3394D30546664CC59AEBCC2A9D0FBC64";
UITestControlCollection controls = control.FindMatchingControls();
Mouse.Click(controls[0]);

Вы как бы определяете "шаблон" для поиска, ищете все контролы, которые соответствуют этому шаблону, и потом уже по индексу извлекаете тот, который вам нужно.

            


(anton_matyushkin) #3

Как быть в следующей ситуации:

На форме две кнопки "Сохранить", но они на разных формах, при чем на первой форме кнопка задизеблена (на той форме есть не заполненные обязательные поля), на второй - активна.

Используя UITestControlCollection получаю ошибки:

1. Если передать Index = 0, то получаю ошибку "Microsoft.VisualStudio.TestTools.UITest.Extension.FailedToPerformActionOnBlockedControlException: Дополнительные сведения Элемент управления блокируется другим элементом управления. Переведите блокированное управление в видимый режим и повторите действие.".

2. Если передать Index = 1, то получаю другую ошибку "System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: index.".

Метод нажатия кнопки:

 

public void PressSaveWithIndexButtonMethod(int Index)
        {
            #region Variable Declaration
            WinEdit uIСохранитьEdit = this.UIAKSiклиникаMozillaFiWindow.UIСохранитьButton.GetUIСохранитьEdit(Index);
            #endregion
 
            uIСохранитьEdit.WaitForControlEnabled(1000);
            Mouse.Click(uIСохранитьEdit);
        }

Вот класс контрола:

 

public class UIСохранитьButton : WinButton
    {
 
        public UIСохранитьButton(UITestControl searchLimitContainer) :
            base(searchLimitContainer)
        {
            #region Условия поиска
            this.SearchProperties[WinButton.PropertyNames.Name] = "Сохранить";
            this.WindowTitles.Add("AKSi-клиника - Mozilla Firefox");
            #endregion
        }
 
        #region Properties
        public WinEdit GetUIСохранитьEdit(int Index)
        {
            this.mUIСохранитьEdit = new WinEdit(this);
            this.mUIСохранитьEdit.SearchProperties[WinEdit.PropertyNames.Name] = "Сохранить";
            this.mUIСохранитьEdit.WindowTitles.Add("AKSi-клиника - Mozilla Firefox");
            UITestControlCollection controls = this.mUIСохранитьEdit.FindMatchingControls();
            return controls[Index] as WinEdit;
        }
        #endregion
 
        #region Fields
        private WinEdit mUIСохранитьEdit;
        #endregion
    }

Для одного контрола работает, более одного - нет.

Подскажите, в чем ошибка?


(anton_matyushkin) #4

Подобные ошибки получаю и для случая, когда на одной форме две кнопки:

Определяется только первая кнопка, при передачи Index = 0. Когда в индексе передаем 1, то получаем ошибку "System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: index.".

Код вызова функции клика и описание кнопки идентично коду из предыдущего поста про кнопку "Сохранить".