2.4.7. List Box , Combo Box

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

ListBox – это тоже объект списка, который обладает всей функциональностью, характерной для PopupList-ов. Помимо этого ListBox обеспечивает множественный выбор элементов. Причем есть 2 стиля объектов данного типа, поддерживающих множественной выбор:

  • Multiple – множественный выбор осуществляется поэлементно. Аналогично выбору элементов при помощи клика мыши с зажатой клавишей Control
  • Extended – поддерживает не только поэлементный множественный выбор, но и выбор интервала значений

Поскольку основная функциональность списков была описана в предыдущем пункте, то 7 пунктов данного шага ( до установки флагов Vertical Scrollbar, Horizontal Scrollbar и т.д.) можем написать, не делая разбора кода, который имеет вид:

Code

		[ ] wTestApp.Control.ListBox.Pick()
		[-] with dListBox
			[+] if( !.bExists )
				[ ] Error("List Box dialog didn't appear")
			[ ] 
			[ ] iValue = RandInt(6,11)
			[+] for i = 1 to iValue
				[ ] sValue = RandStr("A(5)")
				[ ] .sTextItem = sValue
				[ ] .btnAddItem.Click()
				[ ] 
				[+] if( !.lstTheListBox.FindItem(sValue) )
					[ ] Error("Item ""{sValue}"" wasn't added")
			[ ] 
			[ ] ClickEnabledAndCheck( dListBox , .lstTheListBox )
			[ ] 
			[ ] .btnClearItems.Click()
			[+] if( .lstTheListBox.iItemCount > 0 )
				[ ] Error("List Box wasn't cleared",FALSE)
			[ ] 
			[ ] .sTextItem = "10"
			[ ] .btnSetData.Click()
			[ ] 
			[-] for i = 1 to 10
				[ ] sValue = .lstTheListBox.lsContents[i]
				[-] if( sValue != "Item {i}" )
					[ ] Error("Item #{i} is incorrect. Expected: ""Item {i}"" . "+
          "Actual: ""{sValue}"" ",FALSE)

 

Теперь приступим к следующему этапу. Нам нужно установить флажки Vertical Scrollbar,Horizontal Scrollbar,Multicolumn и проверить, что рассматриваемый элемент управления приобрел нужные свойства. Как проверить, что элемент управления имеет полосы прокрутки? Оконный класс Control, который является родительским для всех элементов управления (и в частности для списков), содержит встроенные объекты VScrollBar и HScrollBar, которые соответствуют вертикальной и горизонтальной полосам прокрутки. Таким образом нам достаточно будет проверить, что эти объекты появились. Реализуется это так:

Code

			[ ] .cbVerticalScrollbar.bValue   = TRUE
			[+] if( !.lstTheListBox.VScrollBar.bExists )
				[ ] Error("There is no vertical scroll bar",FALSE)
			[ ] .cbHorizontalScrollbar.bValue = TRUE
			[+] if( !.lstTheListBox.HScrollBar.bExists )
				[ ] Error("There is no horizontal scroll bar",FALSE)

 

С Multicolumn несколько сложнее, так как к проверке на появление некоторого объекта решение явно не сведется. Для того, чтобы найти решение, нужно выяснить, где вообще может храниться какой-либо атрибут стиля того или иного элемента управления. Те, кто когда-либо создавал GUI-приложения с нуля, то есть приходилось без всяких шаблонов писать код создания окна, знают, что у функции CreateWindow для создания любого окна одним из параметров как раз является стиль этого окна. Если поискать в MSDN или в другой справочной документации по программированию, то можно найти, что у объектов класса ListBox есть такой стиль как LBS_MULTICOLUMN, который как раз придает списку стиль Multicolumn. В поставку с SilkTest-ом включены различные библиотеки по работе с различными классами. В частности там имеются библиотеки по работе с GUI-элементами, а также ссылки на функции, которые хранятся в kernel32.dll, user.dll, gdi32.dll. которые являются ядром оконной системы. Из этих функций нас интересует LONG GetWindowLong (HWND hWnd, INT iIndex). Данная функция вернет маску стилей, если в качестве второго параметра передать GWL_STYLE. Параметр hWnd не является неизвестным. Все объекты-наследники класса AnyWin содержат свойство hWnd, которое возвращает дискриптор данного окна. А проверка на вхождение LBS_MULTICOLUMN в маску стиля определяется оператором & (логическое “и”). Итого, проверка иреализуется следующим образом:

Code

			[ ] .cbMultiColumn.bValue         = TRUE
			[ ] i = GetWindowLong( .lstTheListBox.hWnd , GWL_STYLE )
			[+] if( !( i & LBS_MULTICOLUMN ) )
				[ ] Error("List box isn't of multicolumn style",FALSE)

 

Совет
  1. При работе с GUI, Web, Java приложениями очень полезно иметь хотя бы общее представление о том, как устроены те объекты, с которыми ведется работа, как они програмно создаются и обрабатываются. Эти знания могут помочь при осуществлении различных действий, связанных с проверкой тех или иных атрибутов элемента.
  2. Некоторые полезные характеристики элементов управления не имеют реализации в SilkTest-е. Примером может послужить отсутствие свойства/метода, которое проверяет, что объект класса TextField доступен только для чтения, а такая проверка может встретиться достаточно часто. А вот зная, как извлекать стиль окна, мы можем описать такое свойство:
    [+] winclass TextField
    	.......................................................
    	[+] property bReadOnly
    		[+] BOOLEAN Get()
    			[ ] INTEGER iStyle = GetWindowLong( this.hWnd , GWL_STYLE )
    			[ ] return ( iStyle & ES_READONLY )
    

  3. По мере возможностей заглядывайте в inc-файлы, расположенные в каталоге, куда установлен SilkTest. Там достаточно много различной функциональности, чтобы не “изобретать велосипед”. Эта функциональность является стандартной и её использование предпочтительней самодельных аналогов как по времени выполнения так и по надежности

 

А теперь перейдем к множественному выбору элементов. Вначале надо выбрать в поле Select Type значение Extended и проверить, что поле The List Box в данный момент обеспечивает расширенный выбор. Последнее проверяется свойством bIsExtend. Код имеет вид:

Code

			[ ] .lstSelectType.Select("Extended")
			[+] if( !.lstTheListBox.bIsExtend )
				[ ] Error("The List Box isn't of Extended Type",FALSE)

 

Теперь нужно выбрать интервал с первого по четвертый элемент и проверить, что все элементы в интервале от 1 до 4 выбраны. Для выбора интервала используется метод SelectRange. Этот метод может быть использован только для Extended стиля списка. В остальных случаях вызов данного метода повлечет генерацию исключения. Для извлечения списка выбранных элементов при множественном выборе используется метод GetMultiSelText. Он возвращает список строк и работает со всеми стилями списка, которые поддерживают множественный выбор элементов. На данном этапе мы выбираем интервал, извлекаем список выбранных элементов и поэлементно сравниваем с соответствующим содержимым элемента управления. Запишем:

Code

			[ ] .lstTheListBox.SelectRange(1,4)
			[ ] lsValue = .lstTheListBox.GetMultiSelText()
			[+] for i = 1 to 4
				[+] if( lsValue[i] != .lstTheListBox.lsContents[i] )
					[ ] Error("Selection item  #{i} is incorrect. Expected: ""{lsValue[i]}"" . "+
    "Actual: ""{.lstTheListBox.lsContents[i]}"" ",FALSE)

 

Следующим этапом задаем стиль списка Multiple, проверка на который обеспечивается ( по аналогии со стилем Extended ) свойством bIsMulti, затем выбираем все элементы и проверяем, что все элементы выбраны. Для Multiple-стиля есть только один метод, реализующий множественное выделение. Это метод MultiSelect, который работает аналогично методу Select за тем исключением, что работа MultiSelect аналогична клику на элементе с зажатой клавишей Ctrl. Данный метод применим и для Extended-стиля. Следующий фрагмент реализует необходимые действия:

Code

			[ ] .lstSelectType.Select("Multiple")
			[+] if( !.lstTheListBox.bIsMulti )
				[ ] Error("The list box isn't of Multiselect Type")
			[ ] 
			[ ] iValue = .lstTheListBox.iItemCount
			[+] for i = 1 to iValue
				[ ] .lstTheListBox.MultiSelect(i)
			[ ] lsValue = .lstTheListBox.GetMultiSelText()
			[+] if( .lstTheListBox.lsContents != lsValue )
				[ ] Error("Not all elementes were selected. Expected list: {.lstTheListBox.lsContents} . "+
          "Actual: ""{lsValue}"" ",FALSE)

 

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

Code

	[+] Print("Step 11: - Select menu Control > List box{chr(10)}"+
          "         - Enter text into Text Item field and click on Add Item{chr(10)}"+
          "         - Repeat previous action 5-10 times{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 click on Set Data button{chr(10)}"+
          "         - One by one set check mark into fields Vertical scrollbar, Horizontal scrollbar, Multicolumn"+
          "         - Select Extended in the Select Type field{chr(10)}"+
          "         - Select first 4 elements at the same time{chr(10)}"+
          "         - Select Multiple in the Select Type field{chr(10)}"+
          "         - Select all elements at the same time{chr(10)}"+
          "         - Select all elements one by one{chr(10)}"+
          "         - Click on Exit")
		[ ] wTestApp.Control.ListBox.Pick()
		[+] with dListBox
			[+] if( !.bExists )
				[ ] Error("List Box dialog didn't appear")
			[ ] 
			[ ] iValue = RandInt(6,11)
			[+] for i = 1 to iValue
				[ ] sValue = RandStr("A(5)")
				[ ] .sTextItem = sValue
				[ ] .btnAddItem.Click()
				[ ] 
				[+] if( !.lstTheListBox.FindItem(sValue) )
					[ ] Error("Item ""{sValue}"" wasn't added")
			[ ] 
			[ ] ClickEnabledAndCheck( dListBox , .lstTheListBox )
			[ ] 
			[ ] .btnClearItems.Click()
			[+] if( .lstTheListBox.iItemCount > 0 )
				[ ] Error("List Box wasn't cleared",FALSE)
			[ ] 
			[ ] .sTextItem = "10"
			[ ] .btnSetData.Click()
			[ ] 
			[+] for i = 1 to 10
				[ ] sValue = .lstTheListBox.lsContents[i]
				[+] if( sValue != "Item {i}" )
					[ ] Error("Item #{i} is incorrect. Expected: ""Item {i}"" . "+
          "Actual: ""{sValue}"" ",FALSE)
			[ ] 
			[ ] .cbVerticalScrollbar.bValue   = TRUE
			[+] if( !.lstTheListBox.VScrollBar.bExists )
				[ ] Error("There is no vertical scroll bar",FALSE)
			[ ] .cbHorizontalScrollbar.bValue = TRUE
			[+] if( !.lstTheListBox.HScrollBar.bExists )
				[ ] Error("There is no horizontal scroll bar",FALSE)
			[ ] .cbMultiColumn.bValue         = TRUE
			[ ] i = GetWindowLong( .lstTheListBox.hWnd , GWL_STYLE )
			[+] if( !( i & LBS_MULTICOLUMN ) )
				[ ] Error("List box isn't of multicolumn style",FALSE)
			[ ] 
			[ ] .lstSelectType.Select("Extended")
			[+] if( !.lstTheListBox.bIsExtend )
				[ ] Error("The List Box isn't of Extended Type",FALSE)
			[ ] 
			[ ] .lstTheListBox.SelectRange(1,4)
			[ ] lsValue = .lstTheListBox.GetMultiSelText()
			[+] for i = 1 to 4
				[+] if( lsValue[i] != .lstTheListBox.lsContents[i] )
					[ ] Error("Selection item  #{i} is incorrect. Expected: ""{lsValue[i]}"" . "+
    "Actual: ""{.lstTheListBox.lsContents[i]}"" ",FALSE)
			[ ] 
			[ ] .btnClearSelection.Click()
			[ ] 
			[ ] .lstSelectType.Select("Multiple")
			[+] if( !.lstTheListBox.bIsMulti )
				[ ] Error("The list box isn't of Multiselect Type")
			[ ] 
			[ ] iValue = .lstTheListBox.iItemCount
			[+] for i = 1 to iValue
				[ ] .lstTheListBox.MultiSelect(i)
			[ ] lsValue = .lstTheListBox.GetMultiSelText()
			[+] if( .lstTheListBox.lsContents != lsValue )
				[ ] Error("Not all elementes were selected. Expected list: {.lstTheListBox.lsContents} . "+
          "Actual: ""{lsValue}"" ",FALSE)
			[ ] 
			[+] for i = 1 to iValue
				[ ] .lstTheListBox.Select(i)
				[+] if( .lstTheListBox.sValue != .lstTheListBox.lsContents[i] )
					[ ] Error("Item #{i} wasn't selected correctly. Expected: ""{.lstTheListBox.lsContents[i]}"" . "+
          "Actual: ""{.lstTheListBox.sValue}"" ")
			[ ] 
			[+] if( !.Exit() )
				[ ] Error("List Box dialog wasn't closed")
		[ ] 
	[ ] Print("- List Box dialog appears{chr(10)}"+
          "- Text is entered and item with this text is added into list{chr(10)}"+
          "- The same results{chr(10)}"+
          "- The list box field is disabled{chr(10)}"+
          "- The list box field is enabled{chr(10)}"+
          "- The list box field is empty{chr(10)}"+
          "- The list box field is filled with 10 items like Item 1, Item 2 etc.{chr(10)}"+
          "- The list box has appropriate attributes: Vertical and Horizontal scrollbar and Multicolumn{chr(10)}"+
          "- The list box field changes its style into Extended{chr(10)}"+
          "- 4 elements are selected at the same time{chr(10)}"+
          "- The list box field changes its style into Multiple{chr(10)}"+
          "- All elements are selected at the same time{chr(10)}"+
          "- Every element is selected separately{chr(10)}"+
          "- List Box dialog is closed")

 

Для объектов Combo Box никаких особых отличий в работе (по сравнению с PopupList) нет. Единственная особенность заключается в том, что в объект класса Combo Box можно ввести текст, который необязательно содержится в списке. То есть свойство sValue данного класса полностью соответствует одноименному свойству класса TextField, а все остальные действия осуществляются по аналогии с другими списками, у которых можно выбрать одновременно только один элемент. В целях закрепления материала попробуйте реализовать 12-й шаг самостоятельно. Все необходимые действия для данного шага уже были рассмотрены, поэтому не имеет смысл повторяться. Единственное подскажу, что для проверки на Drop Down стиль нужно извлечь маску стиля с помощью GetWindowLong и применить логическое “и” к константе CBS_DROPDOWN.


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