2.4.8 Radio list

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

RadioList – это список, каждый из элементов которого является радио-кнопкой. Этот класс содержит свойства и методы, аналогичные классу PopupList. В частности там присутствуют свойства sValue (строка, которая соответствует тексту выбранной/выбираемой радио-кнопке ), lsValue (список строк, содержащий все надписи кнопок) и метод Select( ), осуществляющий выбор элемента. Эти компоненты нам понадобятся при реализации следующего шага нашего тесткейса. Итак, выберем поочередно все элементы данного списка:

Code

		[ ] wTestApp.Control.RadioButton.Pick()
		[+] with dRadioButton
			[+] if( !.bExists )
				[ ] Error("No Radio Button dialog appears")
			[ ] 
			[ ] lsValue = .rlstTheRadioButtons.lsContents
			[+] for each sValue in lsValue
				[ ] .rlstTheRadioButtons.sValue = sValue
				[+] if( .rlstTheRadioButtons.sValue != sValue )
					[ ] Error("Item ""{sValue}"" wasn't selected. "+
          "Actual selection is ""{.rlstTheRadioButtons.sValue}"" ",FALSE)

 

А дальше интереснее. Нужно нажать на кнопку Disable. При этом деактивируется не весь список, а только выбранная кнопка. И вот тут возникает вопрос, как это нормально проверить. Проблема в том, что класс RadioList работает с группой элементов как с единым целым и средств для проверки свойств отдельных элементов не имеет. Как вариант, можно выполнить операцию выбора только что деактивированного элемента. Если мы попятаемся выбрать деактивированный элемент, то в этом случае сгенерируется исключение. То есть сделать нечто наподобие:

Code

			[ ] .rlstTheRadioButtons.Select("The custom choice")
			[ ] .btnDisable.Click()
			[ ] 
			[+] do
				[ ] .rlstTheRadioButtons.Select("The custom choice")
			[+] except
				[+] switch( ExceptNum() )
					[+] case E_WINDOW_NOT_ENABLED
						[ ] Print("Can't select required button. It isn't enabled")
						[ ] Error("""The custom choice"" item isn't disabled")
					[+] default
						[ ] Error("Unexpected behaviour.")

 

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

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

 

 

Это было только одно из решений. Но есть более “изящное” решение, характерное именно для радио-кнопок. Дело в том, что данный кнопки данного списка могут восприниматься как в группе (RadioList), так и в качестве набора отдельных кнопок ( объектов RadioButton ). Регулируется это в настройках Агента следующим образом:

  • В меню SilkTest-а выбираем Options > Agent
  • В диалоге опций Агента переходим на закладку Compatibility
  • Устанавливаем флаг в поле Don’t group radio buttons into a list, если нам нужно воспринимать радио-кнопки поотдельности и снимаем флажок, если нужно группировать эти кнопки по спискам.

Но проблема в том, что эта настройка для данного тесткейса нужна только для одной строчки кода. Во фрейме все радио-кнопки объединены в списки и переписывать фрейм будет неправильным. Нужно менять настройки Агента динамически. Для работы с Агентом есть свой отдельный объект Agent, у которого есть метод SetOption( opt_name , opt_value ) где opt_name – константа, соответствующая некоторой опции Агента, а opt_value – значение, в которое надо установить данную опцию. На данном этапе нам нужно установить опцию OPT_RADIO_LIST в значение TRUE, а потом вернуть в FALSE после выполнения проверки. Код выглядит так:

Code

			[ ] Agent.SetOption (OPT_RADIO_LIST, FALSE)
			[+] if( .RadioButton("The custom choice").bEnabled )
				[ ] Error("The custom choice button is enabled")
			[ ] Agent.SetOption (OPT_RADIO_LIST, TRUE)

 

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

Совет
Наиболее корректной реализацией той или иной проверки является та, в которой все нужные параметры извлекаются непосредственно из тех объектов, для которых эта проверка осуществляется. Любые обходные пути (как в нашем примере выполнение действий, которые напрашиваются на генерацию исключения) должны служить лишь временным решением, поскольку логику обходных решений труднее понять человеку, который не реализовывал данное решение, но вынужден работать с данным кодом. Так что, находя какое-то временное решение не забывайте возвращаться к поискам более удобных реализаций.

 

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

Code

	[+] Print("Step 13: - Select menu Controls > Radio Button{chr(10)}"+
          "         - Select all radio-list elements one by one{chr(10)}"+
          "         - Select element ""The custom choice"" and click Disable button{chr(10)}"+
          "         - Select element ""The third choice"" and click on Enabled checkbox{chr(10)}"+
          "         - Click on Enabled field again{chr(10)}"+
          "         - Enter text into Label field and click on Set Label button")
		[ ] wTestApp.Control.RadioButton.Pick()
		[+] with dRadioButton
			[+] if( !.bExists )
				[ ] Error("No Radio Button dialog appears")
			[ ] 
			[ ] lsValue = .rlstTheRadioButtons.lsContents
			[+] for each sValue in lsValue
				[ ] .rlstTheRadioButtons.sValue = sValue
				[+] if( .rlstTheRadioButtons.sValue != sValue )
					[ ] Error("Item ""{sValue}"" wasn't selected. "+
          "Actual selection is ""{.rlstTheRadioButtons.sValue}"" ",FALSE)
			[ ] 
			[ ] .rlstTheRadioButtons.Select("The custom choice")
			[ ] .btnDisable.Click()
			[ ] 
			[ ] Agent.SetOption (OPT_RADIO_LIST, FALSE)
			[+] if( .RadioButton("The custom choice").bEnabled )
				[ ] Error("The custom choice button is enabled")
			[ ] Agent.SetOption (OPT_RADIO_LIST, TRUE)
			[ ] 
			[ ] .rlstTheRadioButtons.Select("The third choice")
			[+] if( .rlstTheRadioButtons.sValue != "The third choice" )
				[ ] Error("Incorrect item selected. Expected: ""The third choice"" . "+
          "Actual: ""{.rlstTheRadioButtons.sValue}"" ")
			[ ] 
			[ ] ClickEnabledAndCheck( dRadioButton , .rlstTheRadioButtons )
			[ ] 
			[ ] .edtLabel.sValue = "NEW LABEL"
			[ ] .btnSetLabel.Click()
			[ ] 
			[+] if( .rlstTheRadioButtons.lsContents[.rlstTheRadioButtons.iItemCount] != "NEW LABEL" )
				[ ] Error("Label was entered incorrectly. Expected: ""NEW LABEL"" "+
          "Actual: ""{.rlstTheRadioButtons.lsContents[4]}"" ")
			[ ] 
			[+] if( !.Exit() )
				[ ] Error("Unable to close Radio Button dialog")
			[ ] 
	[ ] Print("- Radio Button dialog appears{chr(10)}"+
          "- Corresponding items are selected{chr(10)}"+
          "- The custom choice item is disabled{chr(10)}"+
          "- The third chice item is selected. Radio group is disabled{chr(10)}"+
          "- Radio group is enabled{chr(10)}"+
          "- Text is entered and The custom choice item caption was changed with the entered text{chr(10)}"+
          "- Radio Button dialog is closed")

 


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