2.4.12 PushButton

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

Объекты класса PushButton представляют собой обычные кнопки. Основным действием является нажатие кнопки, что осуществляется методом Click. Теперь посмотрим на сценарий данного шага. Практически везде нужно выполнить некоторые действия, дождаться появления сообщения и в большинстве случаев закрыть окно сообщения нажатием кнопки ОК. В блоке локальных функций допишем функцию вида:

Code

	[+] private VOID WaitMessageAndCheck(STRING sMessage, BOOLEAN bClose NULL optional)
		[+] if( IsNull(bClose) )
			[ ] bClose = TRUE
		[+] if( !dMsg.Exists(2) )
			[ ] Error("No message appear")
		[+] if( dMsg.statMsg.sValue != sMessage)
			[ ] Error("Unexpected message: ""{dMsg.statMsg.sValue}"" ")
		[ ] 
		[+] if( bClose )
			[ ] dMsg.btnOK.Click()

 

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

 

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

Code

		[+] with dPushButton
			[+] if( !.bExists )
				[ ] Error("No Push Button dialog appears")
			[ ] 
			[ ] .btnTheButton.Click()
			[ ] WaitMessageAndCheck("Click on 'The button' detected")

 

Здесь был сделан обячный клик левой кнопкой мыши в левом верхнем углу кнопки. Но бывают случаи, когда нужно сделать нажатие в некоторой конкретной области элемента по координатам. Примером может служить нажатие на кнопку с крестиком в правом верхнем углу окна (закрытие окна). Данная кнопка описывается как CloseBox и относится ко всем объектам классов MainWin, ChildWin, DialogBox и их наследникам. Обычное нажатие на данную кнопку может не сработать, если используется ХР стиль или вообще у элемента граница широкая, что нажатие не приходится на клиентскую область. Вот для таких целей желательно делать небольшое смещение по координатам. Тогда нажатие кнопки мыши делается так:

Code

			[ ] .Click( 1 , 5 , 5 )
			[ ] WaitMessageAndCheck("Click on 'The default button' detected")

 

А теперь представим ситуацию, когда мы работаем с некоторым клиент-серверным приложением, в котором нажатие на некоторую кнопку влечет обращение к серверу. Соответственно результат такой работы сразу может и не появиться, а может и не появиться вообще. При этом возникает одна неприятная ситуация. Большинство методов классов в SilkTest реально осуществляют посылку оконных сообщений. При этом они еще и ожидают результатов работы обработчика сообщений. Если в обработчике нажатия на данную кнопку сидит обращение к серверу, то может возникнуть ситуация, когда сервер недоступен или просто произошло зацикливание, но Агент SilkTest-а не получил результатов обработчика и попросту заклинивает. В этом случае приходится прерывать выполнение скрипта принудительно, что очень неудобно. Для решения такой ситуации можно использовать такой механизм нажатия кнопки мыши, который не ждет результатов работы обработчика. У метода Click есть 4-й опциональный параметр, который за это как раз и отвечает. Если его установить в TRUE ( а по умолчанию данный параметр принимает значение FALSE ), то будет произведено нажатие без ожидания результата выполнения обработки, что позволяет избежать заклиниваний Агента. Для нашего тесткейса сделаем этот клик так:

Code

			[ ] .Click(1 , 5 , 5 , TRUE )
			[ ] WaitMessageAndCheck("Click on 'The graphical button' detected")

 

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

 

Нужные операции мы рассмотрели детально, остальное описываем бегло. Нажимаем кнопку The Custom Button и ждем сообщения:

Code

			[ ] .btnTheCustomButton.Click()
			[ ] WaitMessageAndCheck("Click on 'The custom button' detected")

 

Нажимаем на поле Enabled и проверяем, что кнопки деактивированы:

Code

			[+] lsValue = {...}
				[ ] "btnTheButton"
				[ ] "btnTheDefaultButton"
				[ ] "btnTheGraphicalButton"
				[ ] "btnTheCustomButton"
			[ ] .cbEnabled.Click()
			[+] for each sValue in lsValue 
				[+] if( dPushButton.@(sValue).bEnabled )
					[ ] Error("Button ""{dPushButton.@(sValue).sCaption}"" is still enabled",FALSE)

 

Устанавливаем новый текст на кнопке The Custom Button и проверяем правильность установки:

Code

			[ ] .sLabel = "TEST"
			[ ] .btnSetLabel.Click()
			[+] if( .btnTheCustomButton.sCaption != .sLabel )
				[ ] Error("Unexpected ""The custom button""'s caption: ""{.btnTheCustomButton.sCaption}"" . "+
          "Expected: ""{.sLabel}"" ")

 

Следует обратить внимание, что для корректной работы данного кода нужно, чтоб в опциях агента был отключен флаг Verify that windows are enabled. В противном случае данный участок кода будет генерировать исключение. Теперь активизируем кнопки и проверяем, что они активизировались:

Code

			[ ] .cbEnabled.Click()
			[+] for each sValue in lsValue 
				[+] if( !dPushButton.@(sValue).bEnabled )
					[ ] Error("Button ""{dPushButton.@(sValue).sCaption}"" is still disabled",FALSE)

 

Еще раз вводим новый текст для кнопки The Custom Button ( можно, конечно, это реализовать и отдельной функцией или скорее даже методом, но острой необходимости в этом сейчас нет ):

Code

			[ ] .sLabel = "NEW TEST"
			[ ] .btnSetLabel.Click()
			[+] if( .btnTheCustomButton.sCaption != .sLabel )
				[ ] Error("Unexpected ""The custom button""'s caption: ""{.btnTheCustomButton.sCaption}"" . "+
          "Expected: ""{.sLabel}"" ")

 

Проверяем, что при нажатии кнопки The Custom Button после изменения её текста сообщение появляется с тем же текстом, что и ранее:

Code

			[ ] .btnTheCustomButton.Click()
			[ ] WaitMessageAndCheck("Click on 'The custom button' detected")

 

Проверяем работу кнопки по умолчанию: ставим фокус в текстовом поле Label и нажимаем клавишу Enter – результат аналогичен нажатию кнопки The Default Button. После этого закрываем диалог Push Button. Завершение:

Code

			[ ] .edtLabel.Click()
			[ ] .TypeKeys("")
			[ ] WaitMessageAndCheck("Click on 'The default button' detected")
			[ ] 
			[+] if( !.Exit() )
				[ ] Error("Unable to close ""Push Button"" dialog")

 


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