2.4.1 TextField

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

Это обычное текстовое поле ввода. Текст может быть однострочным, многострочным. Также это может быть обычный текст (plain text) или форматный текст (rich text). И естественно, работа с каждым из этих видов текста имеет свою специфику. А теперь перейдем к рассмотрению 7-го шага нашего сценария. Он состоит из нескольких этапов. Откроем диалог для текстового поля:

Code

		[ ] wTestApp.Control.TextField.Pick()
		[-] if (!dTextField.Exists())
			[ ] LogError("No Text Field dialog appears")
			[ ] return

 

Все, окно открыто, пойдем дальше. Надо ввести текст в текстовые поля и проверить, что он введен правильно. Будем вводить случайный набор символов. Для этого существует функция RandStr(…), параметром которой является маска генерации случайной строки (см. Help). Для хранения однострочного текста задействуем переменную sValue, а для многострочного текста lsValue ( добавьте в блок объявления переменных строку LIST OF STRING lsValue). У этих свойств есть соответствующие методы SetText, GetText, SetMultiText, GetMultiText, но для работы я рекомендую использовать свойства. В конце-концов, если текстовое поле будет нестандартным, то легче будет переопределить свойство, чем несколько методов. Вообще по возможности обращайтесь к свойствам объектов – запись короче.

 

Многострочный текст состоит из 6-ти строк, которые мы будем заносить в список в цикле, поэтому добавим в блок объявления переменных строку INTEGER i Более того, мы можем сделать случайными не только содержимое строк, но и их длину. Вот, например, маска генерации случайной строки задается в виде “A(10)”. Это означает, что функция RandStr(…) сгенерирует строку, состоящую из 10 буквенных символа. Естественно, что можно варьировать и количество символов в каждой строке. Для этого можно воспользоваться генерацией случайного числа при помощи функции RandInt(…), которой передадим промежуток, в котором варьируется случайная величина. Пусть длина наших строк варьируется от 5 до 10. Итак, код имеет вид:

Code

		[ ] sValue = RandStr("A(10)") // Инициализируем данные для однострочного текста
		[ ] 
		[ ] lsValue = {}  // Очищаем список строк
		[-] for i = 1 to 6
			[ ] ListAppend(lsValue,RandStr("A({RandInt(5,10)})"))  // Генерируем 6 строк для многострочного текста
		[ ] 
		[ ] dTextField.edtTheSingleLineTextField.sValue = sValue          // Вводим однострочный текст
		[-] if( dTextField.edtTheSingleLineTextField.sValue != sValue )    // Сравниваем значения
			[ ] LogError("Single line text field was entered incorrectly. Expected: ""{sValue}"" . "+
             "Actual: ""{dTextField.edtTheSingleLineTextField.sValue}"" ")
		[ ] 
		[ ] dTextField.edtTheMultipleLineTextField.lsValue = lsValue     // Вводим многострочный текст
		[-] if(dTextField.edtTheMultipleLineTextField.lsValue != lsValue) // Сравниваем значения
			[ ] LogError("Multiline text field was entered incorrectly. Expected: ""{lsValue}"" . "+
             "Actual: ""{dTextField.edtTheSingleLineTextField.lsValue}"" ")


 

А теперь разберем последний фрагмент кода. Итак, для ввода/вывода однострочного текста используется свойство sValue класса TextField. Это стандартное свойство. Для многострочного текста аналогичным свойством является lsValue. Мы ввели текст, а затем проверяем на правильность ввода. То есть сразу после ввода текста идет условная конструкция сравнения и если введенный текст не совпадает с ожидаемым значением (то есть с тем, что мы хотим ввести), то выдается ошибка. Причем, обратите внимание на текст сообщения в функции LogError. Там указаны ожидаемое и фактическое значения. Если вы этого не укажите, то компилироваться от этого код не перестанет, но данная запись позволяет выдать информативное сообщение об ошибке. Это очень полезно при тестинге. Так вы можете выявить четко, в чем заключается ошибка. Еще одним моментом является то, что данные значения переменных и соответствующих полей выводятся в кавычках. Дело в том, что фактическое значение в элементе управления может отличаться от ожидаемого только наличием пробела в начале или в конце. Визуально это не заметно, но эти расхождения есть и их игнорировать нельзя. Поэтому при разработке скриптов выработайте себе правило, что если содержимое элемента управления не совпадает с ожидаемым значением, то в тексте сообщения об ошибке обязательно указывайте ожидаемое и фактическое значения этого элемента. Это правило относится не только к текстовым полям, но также и к другим окнам и элементам, у которых надо проверять какое-либо свойство и сравнивать его с каким-то значением. Просто к текстовым полям это правило применяется наиболее часто.

 

Идем дальше. Нам нужно в многострочном поле ввода выделить первые 2 строчки и поставить им жирный шрифт, затем выделить строки 3 и 4 и поставить им наклонный шрифт и наконец для 5 и 6 строки поставить шрифт с подчеркиванием. Для того, чтобы выделить определенный участок текста, используется SetCellRange. У данного метода 4 параметра: начальная строка, начальная колонка, конечная строка, конечная колонка. Для однострокового текстового поля номера начальной/конечной строки игнорируются.

 

Стиль шрифта можно устанавливать только в том случае, если текстовое поле обрабатывает данные как RichText. Это промеряется методом IsRichText. Для проверки на стиль шрифта используются методы IsBold,IsItalic,IsUnderline. Если устанавливается выделение по области текста, то стиль шрифта проверяется посимвольно. Поэтому, для проверки на тот или иной стиль нам нужно в цикле перебирать строки, а внутри этого цикла перебирать символы. Для этих целей в блоке объявления переменных добавим запись INTEGER j. В применении к нашему сценарию это все выглядит так:

Code

		[ ] // Ставим галочку в поле RichEdit
		[ ] dTextField.cbRichEdit.SetState(TRUE)
		[+] if( !dTextField.cbRichEdit.bValue )
			[ ] LogError("Unable to check RichEdit field")
		[+] if( !dTextField.edtTheMultipleLineTextField.IsRichText() )
			[ ] LogError("Multiline text field isn't RichText field")
			[ ] return
		[ ] 
		[ ] // Устанавливаем жирный шрифт и проверяем на корректность установки
		[ ] dTextField.edtTheMultipleLineTextField.SetSelRange(1,1,2,10)
		[ ] dTextField.cbBold.Click()
		[ ] 
		[+] for i = 1 to 2
			[+] for j = 1 to Len(lsValue[i])
				[+] if( !dTextField.edtTheMultipleLineTextField.IsBold(i,j) )
					[ ] LogError("Symbol in the line {i} column {j} is not bold")
		[ ] 
		[ ] // Устанавливаем наклонный шрифт и проверяем на корректность установки
		[ ] dTextField.edtTheMultipleLineTextField.SetSelRange(3,1,4,10)
		[ ] dTextField.cbItalic.Click()
		[ ] 
		[+] for i = 3 to 4
			[+] for j = 1 to Len(lsValue[i])
				[+] if( !dTextField.edtTheMultipleLineTextField.IsItalic(i,j) )
					[ ] LogError("Symbol in the line {i} column {j} is not bold")
		[ ] 
		[ ] // Устанавливаем подчеркнутый шрифт и проверяем на корректность установки
		[ ] dTextField.edtTheMultipleLineTextField.SetSelRange(5,1,6,10)
		[ ] dTextField.cbUnderline.Click()
		[ ] 
		[+] for i = 5 to 6
			[+] for j = 1 to Len(lsValue[i])
				[+] if( !dTextField.edtTheMultipleLineTextField.IsUnderline(i,j) )
					[ ] LogError("Symbol in the line {i} column {j} is not bold")

 

Из нового тут появилась функция Len, которая возвращает длину строки, что передается параметром. Так как длина строк варьируется, то естественно, что нужно привязываться не к фиксированному числу, а к длине конкретной строки, с которой идет работа. Далее идут уже знакомые конструкции и завершается шаг следующим кодом:

Code

		[ ] dTextField.btnClear.Click()
		[+] if(dTextField.edtTheSingleLineTextField.sValue != "" )
			[ ] LogError("Single text line field wasn't cleared. Actual content: ""{dTextField.edtTheSingleLineTextField.sValue}"" ")
		[ ] 
		[+] if(dTextField.edtTheMultipleLineTextField.lsValue != {} )
			[ ] LogError("Multi text line field wasn't cleared. Actual content: ""{dTextField.edtTheSingleLineTextField.lsValue}"" ")
		[ ] 
		[ ] dTextField.btnExit.Click()
		[+] if(dTextField.Exists() )
			[ ] LogError("Text Field dialog wasn't closed")

 

Итого, если скомпоновать всё написанное и добавить заголовки шага, то получим следующий код:

Code

	[+] Print("Step 7: {chr(10)}"+
          "       - Select menu Controls > Textfield{chr(10)}"+
          "       - Enter text into single line text field{chr(10)}"+
          "       - Enter text into multiline text field (6 lines){chr(10)}"+
          "       - Set mark to checkbox ""Rich Edit""{chr(10)}"+
          "       - Highlight 1st and 2nd lines and set checkmark into Bold field{chr(10)}"+
          "       - Highlight 3rd and 4th lines and set checkmark into Italic field{chr(10)}"+
          "       - Highlight 5th and 6th lines and set checkmark into Underline field{chr(10)}"+ 
          "       - Press Clear{chr(10)}"+
          "       - Press Exit")
		[ ] wTestApp.Control.TextField.Pick()
		[+] if (!dTextField.Exists())
			[ ] LogError("No Text Field dialog appears")
			[ ] return 
		[ ] 
		[ ] sValue = RandStr("A(10)")
		[ ] 
		[ ] lsValue = {} 
		[+] for i = 1 to 6
			[ ] ListAppend(lsValue,RandStr("A({RandInt(5,10)})"))
		[ ] 
		[ ] dTextField.edtTheSingleLineTextField.sValue = sValue
		[+] if( dTextField.edtTheSingleLineTextField.sValue != sValue )
			[ ] LogError("Single line text field was entered incorrectly. Expected: ""{sValue}"" . "+
             "Actual: ""{dTextField.edtTheSingleLineTextField.sValue}"" ")
		[ ] 
		[ ] dTextField.edtTheMultipleLineTextField.lsValue = lsValue
		[+] if(dTextField.edtTheMultipleLineTextField.lsValue != lsValue)
			[ ] LogError("Multiline text field was entered incorrectly. Expected: ""{lsValue}"" . "+
             "Actual: ""{dTextField.edtTheSingleLineTextField.lsValue}"" ")
		[ ] 
		[ ] dTextField.cbRichEdit.SetState(TRUE)
		[+] if( !dTextField.cbRichEdit.bValue )
			[ ] LogError("Unable to check RichEdit field")
		[ ] 
		[+] if( !dTextField.edtTheMultipleLineTextField.IsRichText() )
			[ ] LogError("Multiline text field isn't RichText field")
		[ ] 
		[ ] dTextField.edtTheMultipleLineTextField.SetSelRange(1,1,2,10)
		[ ] dTextField.cbBold.Click()
		[ ] 
		[+] for i = 1 to 2
			[+] for j = 1 to Len(lsValue[i])
				[+] if( !dTextField.edtTheMultipleLineTextField.IsBold(i,j) )
					[ ] LogError("Symbol in the line {i} column {j} is not bold")
		[ ] 
		[ ] dTextField.edtTheMultipleLineTextField.SetSelRange(3,1,4,10)
		[ ] dTextField.cbItalic.Click()
		[ ] 
		[+] for i = 3 to 4
			[+] for j = 1 to Len(lsValue[i])
				[+] if( !dTextField.edtTheMultipleLineTextField.IsItalic(i,j) )
					[ ] LogError("Symbol in the line {i} column {j} is not bold")
		[ ] 
		[ ] dTextField.edtTheMultipleLineTextField.SetSelRange(5,1,6,10)
		[ ] dTextField.cbUnderline.Click()
		[ ] 
		[+] for i = 5 to 6
			[+] for j = 1 to Len(lsValue[i])
				[+] if( !dTextField.edtTheMultipleLineTextField.IsUnderline(i,j) )
					[ ] LogError("Symbol in the line {i} column {j} is not bold")
		[ ] 
		[ ] dTextField.btnClear.Click()
		[+] if(dTextField.edtTheSingleLineTextField.sValue != "" )
			[ ] LogError("Single text line field wasn't cleared. Actual content: ""{dTextField.edtTheSingleLineTextField.sValue}"" ")
		[ ] 
		[+] if(dTextField.edtTheMultipleLineTextField.lsValue != {} )
			[ ] LogError("Multi text line field wasn't cleared. Actual content: ""{dTextField.edtTheSingleLineTextField.lsValue}"" ")
		[ ] 
		[ ] dTextField.btnExit.Click()
		[+] if(dTextField.Exists() )
			[ ] LogError("Text Field dialog wasn't closed")
		[ ] 
	[ ] Print("- Text Field window is opened{chr(10)}"+
          "- Data are entered correctly{chr(10)}"+
          "- Data are entered correctly{chr(10)}"+
          "- Multiline field accepts text as Rich Text{chr(10)}"+
          "- first two lines are highlighted with the Bold font{chr(10)}"+
          "- lines are highlighted with italic font style{chr(10)}"+
          "- lines are highlighted with underline font style{chr(10)}"+
          "- text fields are cleared{chr(10)}" +
          "- Text Field window is closed"   )

 

Вот так мы прошлись по работе с классом TextField. И теперь можно сделать некоторые выводы:

  • Класс текстового поля наследуется от ControlClass и использует все свойства и методы данного класса, в частности bEnabled, bActive.
  • Ввод/вывод текста осуществляется с помощью свойств sValue и lsValue, причем последнее используется для многострочных полей ввода.
  • Выделение текста осуществляется методом SetSelRange(…), причем для однострочного поля ввода 1-й и 3-й параметры игнорируются
  • Методы по проверке стиля шрифта (жирный, наклонный, подчеркнутый) работают только в том случае, если текстовое поле обрабатывает RichText, что проверяется методом IsRichText
  • Функции по проверке стиля шрифта: IsBold,IsItalic,IsUnderline. Проверяет отдельный символ RichText поля

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


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