4.2. Тактика описания фрейма

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

4.2.1. Очистка фрейма от ненужных объектов

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

4.2.2. Динамические таблицы

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

Code

	[ ] wSomeBrowserChild.tblTable.clnNumber.HtmlText("#12").Click()

 

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

Code

[+] winclass ImageColumn : HtmlColumn
	[+] BOOLEAN ClickImage( INTEGER iRow, INTEGER iButton NULL optional, INTEGER x  NULL optional, INTEGER y NULL optional, BOOLEAN bRawEvent  NULL optional )
		[+] do
			[ ]this.HtmlImage("#{iRow}").Click(iButton,x,y,bRawEvent)
		[+] except
			[ ] ExceptPrint( )
			[ ] return FALSE
		[ ] return TRUE

 

Это был пример расширения для класса колонки рисунков, на каждом из которых можно сделать клик мышью. По аналогии можно расширить и для других элементов.

4.2.3. Нестандартная функциональность объектов

Как уже было указано, некоторые HTML-объекты могут применяться самыми различными способами, то есть представлять из себя некоторый функциональный элемент, имеющий свою специфику. Это заключается в возможности использовать в веб-страницах различные скрипты, как на серверной, так и на клиентской стороне. Наиболее интенсивно дополнительная функциональность задействуется в рисунках. В качестве примера приведу ссылку http://forums.software-testing.ru/index.php?showforum=79. В таблице тем для каждого из форумов есть элемент управления, позволяющий разворачивать/сворачивать список тем. У него есть 2 состояния, которые показаны на рисунках:

Элемент в свернутом состоянииЭлемент в развернутом состоянии

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

  • Разворачивать/сворачивать список тем
  • Проверять состояние данного объекта

Проверить текущее состояние данного элемента можно путем извлечения Caption и сравнения с некоторыми допустимыми значениями.

 

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

4.2.4. Одно главное окно

Этот пункт изначально не планировалось включать, так как это скорее вопрос идеологии. Но вообще, для веб-приложений предусмотрено несколько окон, соответствующих окну браузера, в частности Explorer и Netscape для соответствующих браузеров. Они уже описаны достаточно детально и содержат в себе необходимую функциональность. Более того, имеется окно Browser, которое может являться окном одного из браузеров. Какого именно – определяется установкой опции Default browser в диалоге Options > Runtime. Таким образом, изначально расчитано на то, что фрейм для веб-приложения будет содержать только одно окно класса MainWin, которое уже определено в файлах, поставляемых вместе с SilkTest-ом.

Совет
Для более детального ознакомления с уже имеющейся функциональностью, используемой при написании скриптов для тестирования веб-приложений можно посмотреть файлы, расположенные в папке Extend в каталоге, в который установлен SilkTest. В частности это файлы explorer.inc , netscape.inc, browser.inc. Помимо объявлений основных окон там имеются объявления различных вспомагательных окон и стандартных модальных диалогов. Поэтому, прежде чем приступать к написанию фрейма, желательно хотя бы изучить тот фрейм, который уже был приготовлен, а затем уже приступать к написанию фрейма, специфического для конкретного приложения

Данный момент был затронут неспроста, поскольку в разных случаях люди описывают главные окна браузеров. Это могут быть те, кто только начинает осваивать SilkTest и еще плохо ориентируются в данной среде, в имеющихся возможностях. Соответственно такие люди записывают во фрейм все окна. Также возможен вариант, когда человек перешел к написанию скриптов для веб-приложений после работы, например, с GUI-приложениями. Соответственно выработанный подход к описанию фрейма начинает применяться и для веб-приложений.

 

По большому счету это нельзя назвать ошибкой, так как:

  • От этого скрипты не станут работать хуже
  • Наличие объектов MainWin во фрейме соответствует реальному строению окон веб-приложений
  • Классический способ активации нужного окна ( метод SetActive )

Но тем не менее, описание таких окон занимает место во фрейме и, самое главное, это занимает время, обилием которого мало кто может похвастаться. Исходя из этих соображений уже нужно решать, а имеет ли смысл многократно переписывать тот код, который уже написан и готов к использованию.

 

В данном подпункте я осветил принцип использования окон, который я считаю наиболее рациональным. Но есть один маленький нюанс: возникают проблемы, если открыто несколько окон браузера и нужно активизировать некоторую неактивную в данный момент страницу. Выражение Browser.SetActive() в данном случае не подойдет, так как окно Browser соответствует последнему активизированному окну браузера и в общем случае нужная страница не будет активизирована. В классе BrowserChild, а точнее в его базовом классе BrowserChildRoot определен метод SetActive. Но не везде этот метод работает корректно. Зачастую вызов данного метода сопровождается генерацией исключения. В таких случаях удобно использовать некоторое единое решение. Например, данный метод можно описать так:

Code

[+] winclass BrowserChild : BrowserChild
	..........................................................
	[+] hidecalls SetActive()
		[ ] this.GetParent().SetActive()

 

То есть подобным образом можно переопределить класс веб-страницы. Данный метод сработает, если объект класса BrowserChild, у которого вызывается метод SetActive, является непосредственным дочерним окном главного окна браузера ( в иерархии нет промежуточных звеньев ). В противном случае нужно выбираться по иерархии вверх, пока не будет достигнуто главное окно или Desktop – самое верхнее окно в иерархии. Во втором случае главное окно браузера считается ненайденным.


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