"improper Command" При Попытке Вызвать Метод Clickbutton() К
#1
Отправлено 07 августа 2007 - 08:20
Я пишу скрипт на JScript, он выполняет ряд простых операций с объектами программы, в т.ч. нажимает кнопки.
Есть одна "специальная" кнопка в стандартном диалоге Yes/No, зовут её Yes (WndClass=Button).
У кнопки целый список методов для нажатия (ClickButton, Click, ClickR, ClickM). Выполняю нажатие вызовом одного из методов.
Проблема в том, что часто нажатие на кнопку не выполняется (за один прогон скрипта выполняется несколько итераций нажатия), в лог проекта валится ошибка "Improper command". От чего зависит - не понимаю. Перепробовал вызов всех методов.
На всякий случай увеличил у проекта свойство method invoke timeout - не помогло.
Может кто сталкивался ?
Environment:
WinXp Prof SP2 с последними обновлениями.
.Net 1.1 SP1
Test Complete 5.14.523.3
#2
Отправлено 07 августа 2007 - 09:36
#3
Отправлено 07 августа 2007 - 11:07
А если попробовать перед каждым нажатием ставить Sys.Delay(1000) или больше?
не помогает.
ещё заметил следующее: успешно выполняется ТОЛЬКО первый вызов метода. Последующие - либо с ошибкой improper command, либо ТС не может найти окно-родитель кнопки.
чтобы упростить ситуацию, перед вызовом метода искал окно-родитель и саму кнопку с помощью WaitChild("Object",10000) - всё находится успешно, менее чем за секунду, но improper command остаётся.
а нельзя ли как-нить перед вызовом, спросить у объекта, типа "а у тебя такой метод есть ?" и "а можно я выполню вот это ?" ?
#4
Отправлено 07 августа 2007 - 12:42
#5
Отправлено 08 августа 2007 - 06:46
А вы с кнопкой работаете напрямую, или сначала присваиваете полный путь к кнопке в переменную какую-то?
полный путь не использую в принципе.
докапываюсь до кнопки с помощью череды вызовов метода WaitChild и FindChild. все чайлды находятся, в т.ч. и кнопка, я могу обращаться ко всем её свойствам, а вот вызвать метод ClickButton() не могу.
делаю так, потому что имя контролов могут меняться от сборки к сборке, и я не нашёл информации о том, что в полном пути можно использовать wildcards или регулярные выражения.
да и в рамках одной сборки, когда я знаю имя контролов, вызов метода нажатия кнопки из полного пути срабатывает только первый раз.
и ещё...пообщался с человеком , плотно работавшим с ТС3, он сказал, что использование JScript - от лукавого, все патчи , которые выпускаются, как правило лечат проблемы с неродными языками ТС, а родной язык - Delphi(Pascal). В общем, переписываю свой код на паскале, посмотрим что из этого выйдет.
#6
Отправлено 09 августа 2007 - 06:43
Мы пишем на DelphiScript и тоже натыкались на странный глюк с .NET приложением, когда TC пытался ткнуть в кнопку, которая была в прошлом диалоге... Мы обошли это с помощью бубна, но хотелось бы докопаться до сути.
Андрей Похилько
#7
Отправлено 09 августа 2007 - 18:07
#8
Отправлено 10 августа 2007 - 08:30
посмотрите что у вас выводится в панели Remarks когда вы выбираете строку с Improper Command в TestLog
спасибо за Remarks, я не знал об их существовании.
в общем, там пишется "Possible reason: the application or window stopped responding." и указано имя окна диалога, содержащем "проблемную" кнопку.
Но, повторюсь, окно и кнопка отвечают, я могу выводить в лог значения их свойств и т.п. - не могу только вызвать метод.
Однако, выход из ситуации найден :)
ранее, я адресовался к окну диалога с помощью метода WaitChild.
теперь попробовал метод Window.Window примерно так:
MyDialog_Wnd=MyMainWindow.Window("MyDialog_WndClass", "MyDialog_WndCaption");
затем с помощью метода WaitChild адресуюсь к кнопке, и вызываю метод ClickButton();
Кстати, при записи скрипта автоматически, TC использует именной такой способ адресования. Но я его сознательно не использовал.
Ещё наблюдение:
в зависимости от того, как было запущено тестируемое приложение (вручную или из скрипта), нужно использовать методы адресования либо через поиск детей, либо указывать путь к окну или вызывать метод Window.
#9
Отправлено 22 августа 2007 - 04:32
Можно еще попробовать обновлять дерево объектов вызовом метода Refresh для родительского объекта кнопки.
А по поводу "родного" языка для TestComplete -- нет такого понятия. В TestComplete 3 была лучшая поддержка DelphiScript отладчиком, так как этот язык предоставляет больше встроенных инструментов для отладки. В TestComplete 5 это уже неактуально, в AutomatedQA обошли это ограничение других языков. А вот встроенная функциональность DelphiScript, на мой взгляд, гораздо беднее JScript'а и VBScript'а. Ведь DelphiScript это всего лишь урезанная версия Delphi, тогда как JScript и VBScript изначально были скриптовыми языками. В JScript, например, есть нативная поддержка регулярных выражений, а также замечательные объекты String и Array, которые позволяют очень легко и удобно работать со строками и массивами.
Дмитрий
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных