2.4.6. Popup List

Назад Содержание Дальше

Ближайшая группа шагов, которая будет рассмотрена, характеризуется тем, что работает с объектами списков (Popup List, List Box, Combo Box, Radio List). Каждый из этих объектов имеет некоторые свои уникальные особенности и свою специфику работы. Тем не менее, у этих объектов также много общего. Итак, рассмотрим их по порядку.

Начнем с объекта PopupList. Это обычный выпадающий список. Выбрать одновременно в этом списке можно только один элемент и он должен быть обязательно из списка. В нашем тестируемом приложении откроем диалог Popup List. Из всех полей ввода в шаге используется только текстовое поле для ввода элементов Text item. Добавим во фрейме свойство для этого элемента.

Code

	[+] window TestApp_Controls dPopupList
		[ ] tag "Popup List"
		[ ] parent wTestApp
		....................................................................................................
		[ ] 
		[+] TextField edtTextItem
			[ ] tag "Text item"
		[ ] 
		....................................................................................................
		[+] property sTextItem
			[+] VOID Set( STRING sValue )
				[ ] this.edtTextItem.sValue = sValue
			[+] STRING Get()
				[ ] return this.edtTextItem.sValue

 

Теперь перейдем к реализации шага 10 нашего тесткейса. Первые 2 пункта шага не содержат ничего незнакомого:

  • Выберите меню Controls > Popup List – уже не раз задействованная операция Pick( ) для соответствующего пункта меню
  • Введите текст в поле Text item и нажмите на кнопку Add Item. Повторите действие 5-10 раз (каждый введенный элемент должен начинаться с различных букв) – с текстовыми полями мы уже работали, более того, уже описано свойство для нужного поля. Все это реализуем в цикле.

Единственный нюанс – каждый элемент, который мы должны ввести в список, должен начинаться с разных букв. Генерировать случайным образом начало строки – не самое правильное решение, так как повторов это не позволит избежать в общем случае. Поэтому лучше использовать другой путь:

  • Выбрать некоторую стартовую букву ( например “А”)
  • Извлечь её код и прибавить к величине кода число, соответствующее номеру элемента в списке и уменьшить на 1.
  • Перевести код обратно в строку и добавить в коней некоторую случайную последовательность букв

Для получения ASCII-кода символа используется функция Asc(…). Для перевода из ASCII-кода в строку используется функция Chr( … ). Также нам понадобится еще одна переменная типа INTEGER, в которая будет хранить размены списков и будет служить для хранения граничных значений цикла. У нас уже есть 2 переменные INTEGER i, j, но такие переменные принято использовать как итераторы, а нужно завести переменную, которая хранила бы значения, которые использовались в цикле. Добавим в блок объявления переменных строку:

Code

	[ ] INTEGER iValue

 

Совет
При написании скриптов автоматического тестирования, как правило, нужны хотя бы одна переменная для строки, для числа и для списка строк. Это наиболее часто встречающиеся переменные для хранения промежуточных данных и с которыми скрипт интенсивно работает. Выработайте определенные правила именования таких переменных. Пример именования:

 
	[ ] INTEGER iValue
	[ ] STRING sValue
	[ ] BOOLEAN bValue
	[ ] LIST OF STING lsValue
	[ ] LIST OF INTEGER liValue

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

 

Итак, если итератор i меняется в цикле от одного до некоторого числа в диапозоне от 5 до 10, то генерация строк осуществляется с помощью строки: sValue = Chr( Asc( “A” ) + i – 1 ) + RandStr( “A(5)” ).

 

Поиск вхождения элемента в список можно осуществить несколькими способами, но наиболее оптимальным является использование метода FindItem. Этот метод встречается во всех объектах-списках и принимает строку-имя элемента, который ищется. Возвращает этот метод индекс элемента в списке. Таким образом, учитывая вышеизложенные моменты, реализуются первые 2 пункта шага так:

Code

		[ ] wTestApp.Control.PopupList.Pick()
		[+] with dPopupList
			[+] if( !.bExists )
				[ ] Error("Popup List Dialog didn't appear")
			[ ] 
			[ ] iValue = RandInt(5,10)
			[+] for i = 1 to iValue
				[ ] sValue = Chr( Asc( "A" ) + i - 1 ) + RandStr( "A(5)" )
				[ ] .sTextItem = sValue
				[ ] .btnAddItem.Click()
				[+] if( !.lstThePopupList.FindItem( sValue ) )
					[ ] Error("Item ""{sValue}"" wasn't found in list")

 

Далее, нам нужно с клавиатуры ввести первый символ элемента списка и проверить, что данные элемент выбран, задача полностью выполнима, так как каждый элемент списка начинается с разной буквы. Для выполнения данного этапа нам понадобятся следующие стандартные свойства объекта PopupList и других классов списков:

  • iItemCount – возвращает количество элементов в объекте-списке. Соответствующий метод GetItemCount
  • iValue – если применяется в правой части выражения, то возвращает индекс выбранного в данный момент элемента списка и соответствует методу GetSelIndex.
  • sValue – если применяется в правой части выражения, то возвращает текст выбранного в данный момент элемента списка и соответствует методу GetSelText

Итак, следующий этап реализуется так:

Code

			[ ] iValue = .lstThePopupList.iItemCount
			[+] for i = 1 to iValue
				[ ] .lstThePopupList.TypeKeys( Chr( Asc( "A" ) + i - 1 ) )
				[+] if( .lstThePopupList.iValue != i )
					[ ] Error("Incorrect item was selected. Expected: ""{.lstThePopupList.lsContents[i]}"" "+
          "Actual: ""{.lstThePopupList.sValue}"" ",FALSE)

 

Далее идет деактивация/активация списка, что реализовано уже отдельной функцией. После этого очищаем список и проверяем, что он пустой. Если список пустой, то количество его элементов равно 0. Количество элементов извлекается свойством iItemCount. Все, что нужно, нам уже известно, поэтому пишем:

Code

			[ ] ClickEnabledAndCheck( dPopupList , .lstThePopupList )
			[ ] 
			[ ] .btnClearItems.Click()
			[+] if( .lstThePopupList.iItemCount > 0 )
				[ ] Error("Popup list wasn't cleared completely",FALSE)

 

Следующим этапом проверяется действие кнопки Set data. Для того, чтобы проверить правильность генерации содержимого списка, мы извлечем его содержимое в список строк и уже сравнивать будем именно строки. Для извлечения содержимого объекта списка в список строк используется метод GetContents или соответствующее свойство lsContents. Правила генерации элементов нам известны (мы это должны проверить), поэтому следующий код выполняется все необходимые действия:

Code

			[ ] .sTextItem = "10"
			[ ] .btnSetData.Click()
			[ ] lsValue = .lstThePopupList.lsContents
			[+] for i = 1 to 10
				[+] if( lsValue[i] != "Item {i}" )
					[ ] Error( "Item #{i} is incorrect. Expected: ""Item {i}"" . "+
           "Actual: ""{lsValue[i]}"" " ,FALSE)

 

Теперь осталось поочередно выбрать все элементы (с проверкой на правильность выборки) и выйти из данного диалога. Выбор элементов списка осуществляется методом Select, причем параметром может передаваться как строка, так и индекс. Этому методу соответствуют свойства iValue и sValue (в качестве левой части віражения), в зависимости от того, что передается параметром: число или строка. Если мы делаем выбор элемента по его строковому значению, то мы можем использовать специальные символы * или ?. Например, если у нас есть список с элементами A Item, B Item, C Item, то, например, третий элемент может быть выбран как прямым указанием на элемент, как .Select(“C Item”), так и с использованием специальных символов, как .Select(“C*”). Это позволяет делать обращение к тому или иному элементу более устойчивым к изменению фрейма.

В одном из приложений, с которыми приходилось работать, встречалось поле Sex, которое могло содержать значения либо M – male, F – female, N – Not known либо более урезанный вариант male, female, Not known. Но при этом первые буквы оставались теми же. Исходя из этих соображений выбор нужного элемента осуществлялся с использованием специальных символов, например .Select(“m*”), что позволяло выбрать нужный элемент независимо от варианта хранения строк в списке.

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

Code

			[ ] iValue = ListCount(lsValue)
			[+] for i = 1 to iValue
				[+] if( RandInt(0,1) )
					[ ] .lstThePopupList.Select( i )
					[+] if( .lstThePopupList.iValue != i )
						[ ] Error("Incorrect Item Selected. Expected: #{i}"+
          "Actual: #{.lstThePopupList.iValue} ",FALSE)
				[+] else
					[ ] .lstThePopupList.Select( lsValue[i] )
					[+] if( .lstThePopupList.sValue != lsValue[i] )
						[ ] Error("Incorrect Item Selected. Expected: {lsValue[i]}"+
          "Actual: #{.lstThePopupList.sValue} ",FALSE)
			[ ] 
			[+] if( !.Exit() )
				[ ] Error("Popup List dialog wasn't closed")

 

Всё, с объектом данного типа мы разобрались. Все методы, которые тут были задействованы, вполне применимы к другим объектам-спискам, так как данный класс содержит фактически наиболее общий объем возможностей. Остальные классы обладают некоторой спецификой. Поскольку список тоже является полем ввода, то к нему также имеет смысл привязать свойство, но в данном случае этого не было сделано из-за того, что данный пример демонстрирует использование стандартной функциональности, которая могла быть скрыта данным свойством. Но вообще свойство желательно описать, а для объектов класса Popup List оно работает со строками.

 

Осталось добавить заголовки и свести код воедино. Целиком код шага выглядит следующим образом:

Code

	[+] Print("Step 10: - Select menu Controls > Popup Menu{chr(10)}"+
          "         - Enter a text into Text Item field and press the Add Item button{chr(10)}"+
          "           Repeat this action 5-10 times (all items must begin with different letters){chr(10)}"+
          "         - Enter first list item letters one by one{chr(10)}"+
          "         - Click on Enabled{chr(10)}"+
          "         - Click on Enabled again{chr(10)}"+
          "         - Click on Clear Items{chr(10)}"+
          "         - Enter text ""10"" into Text Item field and press Set Data button{chr(10)}"+
          "         - Select all items one by one{chr(10)}"+
          "         - Click on Exit")
		[ ] wTestApp.Control.PopupList.Pick()
		[+] with dPopupList
			[+] if( !.bExists )
				[ ] Error("Popup List Dialog didn't appear")
			[ ] 
			[ ] iValue = RandInt(5,10)
			[+] for i = 1 to iValue
				[ ] sValue = Chr( Asc( "A" ) + i - 1 ) + RandStr( "A(5)" )
				[ ] .sTextItem = sValue
				[ ] .btnAddItem.Click()
				[+] if( !.lstThePopupList.FindItem( sValue ) )
					[ ] Error("Item ""{sValue}"" wasn't found in list")
			[ ] 
			[ ] iValue = .lstThePopupList.iItemCount
			[+] for i = 1 to iValue
				[ ] .lstThePopupList.TypeKeys( Chr( Asc( "A" ) + i - 1 ) )
				[+] if( .lstThePopupList.iValue != i )
					[ ] Error("Incorrect item was selected. Expected: ""{.lstThePopupList.lsContents[i]}"" "+
          "Actual: ""{.lstThePopupList.sValue}"" ",FALSE)
			[ ] 
			[ ] ClickEnabledAndCheck( dPopupList , .lstThePopupList )
			[ ] 
			[ ] .btnClearItems.Click()
			[+] if( .lstThePopupList.iItemCount > 0 )
				[ ] Error("Popup list wasn't cleared completely",FALSE)
			[ ] 
			[ ] .sTextItem = "10"
			[ ] .btnSetData.Click()
			[ ] lsValue = .lstThePopupList.lsContents
			[+] for i = 1 to 10
				[+] if( lsValue[i] != "Item {i}" )
					[ ] Error( "Item #{i} is incorrect. Expected: ""Item {i}"" . "+
           "Actual: ""{lsValue[i]}"" " ,FALSE)
			[ ] 
			[ ] iValue = ListCount(lsValue)
			[+] for i = 1 to iValue
				[+] if( RandInt(0,1) )
					[ ] .lstThePopupList.Select( i )
					[+] if( .lstThePopupList.iValue != i )
						[ ] Error("Incorrect Item Selected. Expected: #{i}"+
          "Actual: #{.lstThePopupList.iValue} ",FALSE)
				[+] else
					[ ] .lstThePopupList.Select( lsValue[i] )
					[+] if( .lstThePopupList.sValue != lsValue[i] )
						[ ] Error("Incorrect Item Selected. Expected: {lsValue[i]}"+
          "Actual: #{.lstThePopupList.sValue} ",FALSE)
			[ ] 
			[+] if( !.Exit() )
				[ ] Error("Popup List dialog wasn't closed")
			[ ] 
	[ ] Print("- Popup List dialog appears{chr(10)}"+
          "- Text is entered and elements with this text are added into list{chr(10)}"+
          "- Item begining with entered letter is selected{chr(10)}"+
          "- The popup list field is disabled{chr(10)}"+
          "- The popup list field is enabled{chr(10)}"+
          "- The popup list field is cleared{chr(10)}"+
          "- List is filled with values: Item 1, Item 2, Item 3 ...{chr(10)}"+
          "- Appropriate element is selected{chr(10)}"+
          "- Popup List dialog is closed")	

 


Назад Содержание Дальше