Перейти к содержимому

Фотография

Остановка Выполнения Скрипта При Ошибке


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 20

#1 INside

INside

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 17 сентября 2007 - 06:18

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

#2 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 17 сентября 2007 - 06:28

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

Помещайте некоторые фрагменты кода в блоки do ... except для перехвата исключений и дальнейшей их обработки. В этом случае мы можем перехватить ситуацию с ошибкой и при этом тест не завершается. То есть что-то типа
[+] do
		 [ ] // Here is your code
[+] except
		 [ ] LogError("Exception: {ExceptNum()}. {ExceptData()}")
		 [ ] ExceptPrint()
И так для каждого блока.

Это самый лобовой вариант. Более стабильное решение - ставить проверки до того, как выполнять некоторые действия. Например, если мы выбираем меню, то мы потом должны дождаться появления окна и только потом что-то с этим окном делаем. Соответственно, будет что-то наподобие:

[ ] wMenu.MenuItem.pick()
[+] if( wSomeWin.Exists() )
		   [ ] // Perform actions with specified window
[+] else
		   [ ] LogError("Required window {wSomeWin} wasn't found")

Можно комбинировать вышеприведенные варианты.
  • 0

#3 INside

INside

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 19 сентября 2007 - 11:05

Спасибо.
[ ] wMenu.MenuItem.pick()
[+] if( wSomeWin.Exists() )
		   [ ] // Perform actions with specified window
[+] else
		   [ ] LogError("Required window {wSomeWin} wasn't found")
Этот кусок кода отработал.

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

Но вот c функциями do_except проблема. Я недопонимаю.
Хотелось бы, чтобы тест работал так: идет по меню, открывает окно, потом закрывает. Это все. Приложение в разработке, поэтому любое окно может не открыться, или переименоваться пункт меню.

Как я поняла do_except можно как раз использовать для всего блока.
Вопрос, что еще нужно указать. Так как просто поставить в начале do, а в конце except не работает. Тест все равно останавливается. Судя по всему ему нужно указать что делать когда он не находит нужный объект. Как это сделать?
Помогите.
  • 0

#4 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 19 сентября 2007 - 11:54

Спасибо.

[ ] wMenu.MenuItem.pick()
[+] if( wSomeWin.Exists() )
		   [ ] // Perform actions with specified window
[+] else
		   [ ] LogError("Required window {wSomeWin} wasn't found")
Этот кусок кода отработал.

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

Да, эта конструкция требует конкретного указания окна, с которым оперировать надо.

Но вот c функциями do_except проблема. Я недопонимаю.
Хотелось бы, чтобы тест работал так: идет по меню, открывает окно, потом закрывает. Это все. Приложение в разработке, поэтому любое окно может не открыться, или переименоваться пункт меню.


Если операция однотипная для всех окон (выбрать меню, проверить существование окна и закрыть его), то это можно загнать в цикл, в котором перебираются пункты меню и список окон, которые надо ожидать. Реализуется это примерно так:
[+] LIST OF WINDOW lwMenuItems = {...}
		[ ] wMenuItem1
		[ ] wMenuItem2
		............
[+] LIST OF WINDOW lwWinToWait
		[ ] wSomeWin1
		[ ] wSomeWin2
		...............
[ ] INTEGER i
[ ] INTEGER iCount = Min(ListCount(lwMenuItems) ,ListCount(lwWinToWait) )
[ ]
[+] for( i = 1; i <= ListCount(lwMenuItems); i++ )
		 [ ] lwMenuItems[i].Pick()
		 [+] if( !lwWinToWait[i].Exists() )
					  [ ] LogError("Required window {lwWinToWait[i]} wasn't found")
		 [+] else
					  [ ] lwWinToWait[i].Close() // Здесь мы закрываем окно (если оно появилось). Закрытие окна можно задать и другим способом
Здесь предварительно объявляется 2 списка lwMenuItems и lwWinToWait. Каждый элемент одного списка соответствует элементу из другого списка с тем же индексом, поэтому размерность этих списков лучше сделать одинаковой.

Как я поняла do_except можно как раз использовать для всего блока.
Вопрос, что еще нужно указать. Так как просто поставить в начале do, а в конце except не работает. Тест все равно останавливается. Судя по всему ему нужно указать что делать когда он не находит нужный объект. Как это сделать?
Помогите.

С помощью do ... except вполне можно ограничить всего лишь какой-то небольшой участок кода и если в этом блоке будет вызвано исключение, то сработает участок кода, который находится под except. То есть надо не в начале и в конце ставить, а ограничить просто определенный блок. Тогда дальнейшее выполнение скрипта не будет прервано
  • 0

#5 INside

INside

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 02 октября 2007 - 08:28

Вопрос в продолжение темы.
Какими методами\способами SilkTest можно решить проблему остановку теста при работе с меню в следующем случае. В программе под различными пользователями с различными правами некоторые пункты меню отсутствуют или являются недоступными. Не писать же отдельный тест под каждого пользователя. Как указать что если тот или иной пункт не найден его нужно пропустить.
Код теста примерно такой:

[+] testcase Test1() appstate none
[ ] mWindow.SetActive ()
[-] LIST OF STRING lwMenuItems = {...}
[ ] "wMenuItem1"
[ ] "wMenuItem2"
[ ] ........

[ ]
[-] LIST OF WINDOW lwWinToWait= {...}
[ ] wSomeWin1
[ ] wSomeWin2
[ ] ........

[ ]
[ ] INTEGER i
[ ] INTEGER iCount = Min(ListCount(lwMenuItems) ,ListCount(lwWinToWait) )
[ ]
[-] for( i = 1; i <= ListCount(lwMenuItems); i++ )
[ ] mWindow.wMenu.@(lwMenuItems[i]).Pick()
[ ]
[-] if( !lwWinToWait[i].Exists() )
[ ] LogError("Required window {lwWinToWait[i]} wasn't found")
[+] else
[ ] lwWinToWait[i].Close()
[ ]
[+] if( lwWinToWait[i].Exists() )
[ ] LogError("Dialog ""{lwWinToWait}"" wasn't closed")
  • 0

#6 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 02 октября 2007 - 09:04

некоторые пункты меню отсутствуют или являются недоступными ... [skipped] ...Как указать что если тот или иной пункт не найден его нужно пропустить.


фактически вы сами ответили на свой вопрос: для каждого пункта меню надо проверять, существует ли он и доступен ли
примерно так

for( i = 1; i <= ListCount(lwMenuItems); i++ )
  if ( mWindow.wMenu.@(lwMenuItems[i]).Exists() && mWindow.wMenu.@(lwMenuItems[i].IsEnabled()) )
	mWindow.wMenu.@(lwMenuItems[i]).Pick()

  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#7 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 02 октября 2007 - 09:05

Вопрос в продолжение темы.
Какими методами\способами SilkTest можно решить проблему остановку теста при работе с меню в следующем случае. В программе под различными пользователями с различными правами некоторые пункты меню отсутствуют или являются недоступными. Не писать же отдельный тест под каждого пользователя. Как указать что если тот или иной пункт не найден его нужно пропустить.
Код теста примерно такой:

...


Рассмотрим на примере кода:
[-] for( i = 1; i <= ListCount(lwMenuItems); i++ )
			 [ ] mWindow.wMenu.@(lwMenuItems[i]).Pick()
Нам фактически надо бы перейти на следующую итерацию цикла, если пункт меню отсутствует или недоступен. Можно сделать вот так:
[-] for( i = 1; i <= ListCount(lwMenuItems); i++ )
			 [+] do
							[ ] mWindow.wMenu.@(lwMenuItems[i]).Pick()
			 [+] except
							[ ] continue
То есть, если мы не можем выбрать пункт меню, то оператором continue мы просто переходим на следующую итерацию цикла
  • 0

#8 INside

INside

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 03 октября 2007 - 08:56

Возник вопрос
при использовании кода:

[ ] INTEGER i
[ ] INTEGER iCount = Min(ListCount(lwMenuItems) ,ListCount(lwWinToWait) )
[ ]
[-] for( i = 1; i <= ListCount(lwMenuItems); i++ )
[-] do
[ ] mWindow. wMenu.@(lwMenuItems[i]).Pick()
[-] except
[ ] continue
[ ]
[-] if( !lwWinToWait[i].Exists() )
[ ] LogError("Required window {lwWinToWait[i]} wasn't found")
[-] else
[ ] lwWinToWait[i].Close()

Цикл отрабатывается, пропуская пункты меню которых нет. Но при этом не закрываются открытые во время скрипта окна. Почему так? Можно написать appstate, которая закроет все окна, так? Но эти ошибки попадают в файл результатов:

[ ] (local) *** Error: Window cannot be closed
[ ] (local) Occurred in wSomeWin.Close

В чем причина?

При попытки использовать код:

for( i = 1; i <= ListCount(lwMenuItems); i++ )
[-] if ( mWindow.wMenu.@(lwMenuItems[i]).Exists() && Window.wMenu.@(lwMenuItems[i].IsEnabled()) )
mWindow.wMenu.@(lwMenuItems[i]).Pick()

Тест не отрабатывается и выдается сообщение об ошибке:
Type mismatch –Expecting a window
Хотелось бы разобраться в обоих вариантах.
  • 0

#9 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 03 октября 2007 - 09:44

................
Цикл отрабатывается, пропуская пункты меню которых нет. Но при этом не закрываются открытые во время скрипта окна. Почему так? Можно написать appstate, которая закроет все окна, так? Но эти ошибки попадают в файл результатов:

[ ] (local) *** Error: Window cannot be closed
[ ] (local) Occurred in wSomeWin.Close

В чем причина?

Метод Close может работать некорректно. Это бывает. Лечится либо настройками агента (сейчас конкретно их не вспомню), либо заменой на более устойчивую операцию. Например закрывать окно можно при помощи Alt+F4, то есть
[ ] lwWinToWait[i].TypeKeys("<Alt-F4>")

При попытки использовать код:

for( i = 1; i <= ListCount(lwMenuItems); i++ )
[-] if ( mWindow.wMenu.@(lwMenuItems[i]).Exists() && Window.wMenu.@(lwMenuItems[i].IsEnabled()) )
mWindow.wMenu.@(lwMenuItems[i]).Pick()

Тест не отрабатывается и выдается сообщение об ошибке:
Type mismatch –Expecting a window
Хотелось бы разобраться в обоих вариантах.

В условии скобка не там стоит

Попробуйте так:
[-]   if ( mWindow.wMenu.@(lwMenuItems[i]).Exists() && Window.wMenu.@(lwMenuItems[i]).IsEnabled() )

  • 0

#10 INside

INside

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 08 октября 2007 - 12:40

Помогите, не получается реализовать в цикле код для следующего условия.
При переборе меню любое окно может открыться с ошибкой (т.к. приложение находиться в разработке). Т.е. появляется окно с сообщением об ошибке, при этом меню становиться недоступным. Окно сообщения нужно просто закрыть, но не получается до него «достучаться».

[ ] INTEGER i	[ ] INTEGER iCount = Min(ListCount(lwMenuItems) ,ListCount(lwWinToWait) )	[-] for( i = 1; i <= ListCount(lwMenuItems); i++ )		[-] if (mWindow.wMenu.@(lwMenuItems[i]).Exists() && mWindow.wMenu.@(lwMenuItems[i]).IsEnabled() )			[ ] mWindow.wMenu.@(lwMenuItems[i]).Pick()			[-] if(wMessage.Exists() )				[ ] wMessage.SetActive ()				[ ] wMessage.OK.Click ()				[ ] mWindow.SetActive ()


Похоже что не отрабатывается проверка:

[-] if(wMessage.Exists() )

Во фрейме окно описано следующим образом:
[-] window DialogBox wMessage	[ ] tag "wMessage"	[-] CustomWin OK		[ ] msw tag "[TBitBtn]OK"

  • 0

#11 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 08 октября 2007 - 13:00

Во фрейме окно описано следующим образом:

[-] window DialogBox wMessage	[ ] tag "wMessage"	[-] CustomWin OK		[ ] msw tag "[TBitBtn]OK"


ммм, а вы уверены, что окно сообщения имеет заголовок "wMessage"? Что-то не верится... Дайте скриншот этого окошка
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#12 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 08 октября 2007 - 14:15

Поскольку данное окно полезно только тем, что его нужно только обнаружить и закрыть, нажав ОК, то это дело можно перехватывать автоматически. Весь код перебора можно поместить между строк вида

wMessage.SetTrap("OK")
 .....
wMessage.ClearTrap()

И если при выполнении кода между этими 2-мя инструкциями вылезет окно wMessage, то на нем тут же будет автоматически произведен клик на кнопке ОК, что закроет данное окно. Осталось только разобраться с тем, чтобы это окно нормально распознавалось.
  • 0

#13 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 08 октября 2007 - 14:32

Поскольку данное окно полезно только тем, что его нужно только обнаружить и закрыть, нажав ОК, то это дело можно перехватывать автоматически. Весь код перебора можно поместить между строк вида

wMessage.SetTrap("OK")
 .....
wMessage.ClearTrap()


SetTrap отжирает ресурсы и тормозит работу с приложением, что не всегда хорошо
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#14 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 08 октября 2007 - 15:18

Поскольку данное окно полезно только тем, что его нужно только обнаружить и закрыть, нажав ОК, то это дело можно перехватывать автоматически. Весь код перебора можно поместить между строк вида

wMessage.SetTrap("OK")
 .....
wMessage.ClearTrap()


SetTrap отжирает ресурсы и тормозит работу с приложением, что не всегда хорошо

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

#15 vass

vass

    Опытный участник

  • Members
  • PipPipPipPip
  • 298 сообщений
  • ФИО:Василий

Отправлено 09 октября 2007 - 14:50

Помогите, не получается реализовать в цикле код для следующего условия.
При переборе меню любое окно может открыться с ошибкой (т.к. приложение находиться в разработке). Т.е. появляется окно с сообщением об ошибке, при этом меню становиться недоступным. Окно сообщения нужно просто закрыть, но не получается до него «достучаться».

предлагаю их просто расстреливать.
т.е. если окно появилось (окно.Exists() == TRUE) то потом просто вызывать окно.Kill() :acute:
  • 0

#16 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 09 октября 2007 - 16:28

т.е. если окно появилось (окно.Exists() == TRUE) то потом просто вызывать окно.Kill() :acute:


Kill() ?

опять грязные трюки с недокументиированными функциями? :)))
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#17 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 09 октября 2007 - 16:46

т.е. если окно появилось (окно.Exists() == TRUE) то потом просто вызывать окно.Kill() :acute:


Kill() ?

опять грязные трюки с недокументиированными функциями? :)))

На этот раз не совсем так. Для класса MainWin действительно определен данный метод. Можно посмотреть в файле winclass.inc из стандартной библиотеки. Но вот проблема в том, что он не определен для DialogBox (для версии 7.1 подобного, по-крайней мере нет). В принципе winclass-ы не особо мешают обращаться к диалогу, используя методы класса MainWin, но подобный изврат данной задачи не стоит, проще уже SetTrap.
  • 0

#18 INside

INside

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 10 октября 2007 - 09:28

Спасибо, SetTrap работает. Хотя и действительно медленно.

Во фрейме окно описано следующим образом:

[-] window DialogBox wMessage	[ ] tag "wMessage"	[-] CustomWin OK		[ ] msw tag "[TBitBtn]OK"


ммм, а вы уверены, что окно сообщения имеет заголовок "wMessage"? Что-то не верится... Дайте скриншот этого окошка


Конечно же оно так не называется. Это просто творческий порыв.
P.S.
окно.Kill()-убить окно? Это интерестно! :acute: Жаль, что изврат. Да и версия у меня 7.1.
  • 0

#19 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 10 октября 2007 - 11:07

P.S.
окно.Kill()-убить окно? Это интерестно! :acute: Жаль, что изврат. Да и версия у меня 7.1.

Этот метод работает для MainWin окон и в версии 7.1 это прокатит для них. Хотя вполне возможно, что это просто некоторая вариация
SendMessage( окно.hWnd , WM_DESTROY, 0 , 0 )
  • 0

#20 vass

vass

    Опытный участник

  • Members
  • PipPipPipPip
  • 298 сообщений
  • ФИО:Василий

Отправлено 10 октября 2007 - 13:06

Kill() ?
опять грязные трюки с недокументиированными функциями? :)))

На этот раз не совсем так. Для класса MainWin действительно определен данный метод. Можно посмотреть в файле winclass.inc из стандартной библиотеки. Но вот проблема в том, что он не определен для DialogBox (для версии 7.1 подобного, по-крайней мере нет). В принципе winclass-ы не особо мешают обращаться к диалогу, используя методы класса MainWin, но подобный изврат данной задачи не стоит, проще уже SetTrap.

ну я не виноват, что у них документация старая ....
во-вторых - фишка как раз в том, чтобы отстреливать мейн окна. Не важно - мессага над ним или все нормально, или еще что-то там. Появилось (Exists) - значит всё ОК и можно пускать его в расход.
Плюс - экономия времени.
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных