Остановка Выполнения Скрипта При Ошибке
#1
Отправлено 17 сентября 2007 - 06:18
Заранее спасибо, надеюсь на вашу помощь.
#2
Отправлено 17 сентября 2007 - 06:28
Помещайте некоторые фрагменты кода в блоки do ... except для перехвата исключений и дальнейшей их обработки. В этом случае мы можем перехватить ситуацию с ошибкой и при этом тест не завершается. То есть что-то типаВ SilkTest новичок и пока не могу разобраться с этой проблемой, а нужно быстро. Может, конечно, это где-то и описано, но не могу найти где. Проблема такая: при выполнении теста (тест просто перебирает пункты меню программы - открывает и закрывает окна). Если какой-либо пункт меню не найден или не может открыться окно, тест завершается на этом месте и генерируется файл ошибки. Можно ли настроить SilkTest так, чтобы тестирование не останавливалось, а все ошибки просто писались в отдельный файл, ведь эти ошибки не являются критичными, и от них не зависит дальнейшая работа скрипта.
Заранее спасибо, надеюсь на вашу помощь.
[+] 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")
Можно комбинировать вышеприведенные варианты.
#3
Отправлено 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 не работает. Тест все равно останавливается. Судя по всему ему нужно указать что делать когда он не находит нужный объект. Как это сделать?
Помогите.
#4
Отправлено 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 вполне можно ограничить всего лишь какой-то небольшой участок кода и если в этом блоке будет вызвано исключение, то сработает участок кода, который находится под except. То есть надо не в начале и в конце ставить, а ограничить просто определенный блок. Тогда дальнейшее выполнение скрипта не будет прерваноКак я поняла do_except можно как раз использовать для всего блока.
Вопрос, что еще нужно указать. Так как просто поставить в начале do, а в конце except не работает. Тест все равно останавливается. Судя по всему ему нужно указать что делать когда он не находит нужный объект. Как это сделать?
Помогите.
#5
Отправлено 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")
#6
Отправлено 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()
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#7
Отправлено 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 мы просто переходим на следующую итерацию цикла
#8
Отправлено 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
Хотелось бы разобраться в обоих вариантах.
#9
Отправлено 03 октября 2007 - 09:44
Метод Close может работать некорректно. Это бывает. Лечится либо настройками агента (сейчас конкретно их не вспомню), либо заменой на более устойчивую операцию. Например закрывать окно можно при помощи Alt+F4, то есть................
Цикл отрабатывается, пропуская пункты меню которых нет. Но при этом не закрываются открытые во время скрипта окна. Почему так? Можно написать appstate, которая закроет все окна, так? Но эти ошибки попадают в файл результатов:
[ ] (local) *** Error: Window cannot be closed
[ ] (local) Occurred in wSomeWin.Close
В чем причина?
[ ] 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() )
#10
Отправлено 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"
#11
Отправлено 08 октября 2007 - 13:00
Во фрейме окно описано следующим образом:
[-] window DialogBox wMessage [ ] tag "wMessage" [-] CustomWin OK [ ] msw tag "[TBitBtn]OK"
ммм, а вы уверены, что окно сообщения имеет заголовок "wMessage"? Что-то не верится... Дайте скриншот этого окошка
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#12
Отправлено 08 октября 2007 - 14:15
wMessage.SetTrap("OK") ..... wMessage.ClearTrap()
И если при выполнении кода между этими 2-мя инструкциями вылезет окно wMessage, то на нем тут же будет автоматически произведен клик на кнопке ОК, что закроет данное окно. Осталось только разобраться с тем, чтобы это окно нормально распознавалось.
#13
Отправлено 08 октября 2007 - 14:32
Поскольку данное окно полезно только тем, что его нужно только обнаружить и закрыть, нажав ОК, то это дело можно перехватывать автоматически. Весь код перебора можно поместить между строк вида
wMessage.SetTrap("OK") ..... wMessage.ClearTrap()
SetTrap отжирает ресурсы и тормозит работу с приложением, что не всегда хорошо
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#14
Отправлено 08 октября 2007 - 15:18
В данном случае дополнительные затраты памяти врядли критичнее избавления от необходимости перехватывать окна, тем более что действия в скрипте не являются особо емкими или сложными в выполнении. В данном случае использование подобной конструкции вполне оправданоПоскольку данное окно полезно только тем, что его нужно только обнаружить и закрыть, нажав ОК, то это дело можно перехватывать автоматически. Весь код перебора можно поместить между строк вида
wMessage.SetTrap("OK") ..... wMessage.ClearTrap()
SetTrap отжирает ресурсы и тормозит работу с приложением, что не всегда хорошо
#15
Отправлено 09 октября 2007 - 14:50
предлагаю их просто расстреливать.Помогите, не получается реализовать в цикле код для следующего условия.
При переборе меню любое окно может открыться с ошибкой (т.к. приложение находиться в разработке). Т.е. появляется окно с сообщением об ошибке, при этом меню становиться недоступным. Окно сообщения нужно просто закрыть, но не получается до него «достучаться».
т.е. если окно появилось (окно.Exists() == TRUE) то потом просто вызывать окно.Kill()
#16
Отправлено 09 октября 2007 - 16:28
т.е. если окно появилось (окно.Exists() == TRUE) то потом просто вызывать окно.Kill()
Kill() ?
опять грязные трюки с недокументиированными функциями? :)))
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#17
Отправлено 09 октября 2007 - 16:46
На этот раз не совсем так. Для класса MainWin действительно определен данный метод. Можно посмотреть в файле winclass.inc из стандартной библиотеки. Но вот проблема в том, что он не определен для DialogBox (для версии 7.1 подобного, по-крайней мере нет). В принципе winclass-ы не особо мешают обращаться к диалогу, используя методы класса MainWin, но подобный изврат данной задачи не стоит, проще уже SetTrap.т.е. если окно появилось (окно.Exists() == TRUE) то потом просто вызывать окно.Kill()
Kill() ?
опять грязные трюки с недокументиированными функциями? :)))
#18
Отправлено 10 октября 2007 - 09:28
Во фрейме окно описано следующим образом:
[-] window DialogBox wMessage [ ] tag "wMessage" [-] CustomWin OK [ ] msw tag "[TBitBtn]OK"
ммм, а вы уверены, что окно сообщения имеет заголовок "wMessage"? Что-то не верится... Дайте скриншот этого окошка
Конечно же оно так не называется. Это просто творческий порыв.
P.S.
окно.Kill()-убить окно? Это интерестно! Жаль, что изврат. Да и версия у меня 7.1.
#19
Отправлено 10 октября 2007 - 11:07
Этот метод работает для MainWin окон и в версии 7.1 это прокатит для них. Хотя вполне возможно, что это просто некоторая вариацияP.S.
окно.Kill()-убить окно? Это интерестно! Жаль, что изврат. Да и версия у меня 7.1.
SendMessage( окно.hWnd , WM_DESTROY, 0 , 0 )
#20
Отправлено 10 октября 2007 - 13:06
ну я не виноват, что у них документация старая ....На этот раз не совсем так. Для класса MainWin действительно определен данный метод. Можно посмотреть в файле winclass.inc из стандартной библиотеки. Но вот проблема в том, что он не определен для DialogBox (для версии 7.1 подобного, по-крайней мере нет). В принципе winclass-ы не особо мешают обращаться к диалогу, используя методы класса MainWin, но подобный изврат данной задачи не стоит, проще уже SetTrap.Kill() ?
опять грязные трюки с недокументиированными функциями? :)))
во-вторых - фишка как раз в том, чтобы отстреливать мейн окна. Не важно - мессага над ним или все нормально, или еще что-то там. Появилось (Exists) - значит всё ОК и можно пускать его в расход.
Плюс - экономия времени.
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных