Случайные ошибки
#1
Отправлено 01 февраля 2007 - 09:03
Чаще всего они все проходят нормально. Но бывает иногда, что в случайном месте вырабратываются ошибки, например:
Cannot obtain the window with the window class 'Button', window caption '&Ecran' and index -1.
На строке :
Call p1.Window("#32770", "QQQ").Window("Button", "&Ecran").ClickButton
По событию ошибки научились записывать картинку
call Log.Picture(Sys.Desktop.Picture, "Sys.Desktop.Picture")
И на картинке ясно виден диалог с кнопкой "&Ecran"
Если тест снова запустить, то эта ошибка здесь не проявится, все пройдет нормально, но может возникнуть аналогичная на других диалогах.
В чем может быть дело ?
#2
Отправлено 01 февраля 2007 - 09:21
в этом случае поможет написание функции типа
function MessagePressButton(sButton) { p1.Window("#32770", "*").Activate(); BuiltIn.Delay(1000); p1.Window("#32770", "QQQ").Window("Button", sButton).ClickButton(); }
и вызывать как-то так
MessagePressButton("&Ecran")
(код этот я не тестировал, просто для примера написал).
Ну и неплохо бы проверку внутри делать на существование кнопки перед нажатием.
кроме того, попробуйте вместо "&Ecran" использовать "*Ecran"
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#3
Отправлено 01 февраля 2007 - 09:42
Теоретически, должно все успеть обновиться за это время.
#4
Отправлено 01 февраля 2007 - 09:46
Set w2 = p.WaitWindow("#32770", "Microsoft Internet Explorer", 1, 15000) Call w2.Window("Button", "OK").ClickButton
#5
Отправлено 01 февраля 2007 - 09:58
Я тестирую приложение .NET, вместо WaitWindow используется метод WaitWinFormsObject
Так вот, я сталкивался с ситуацией, когда следующий код не работает:
var obj = Sys.Process(...).WaitWinFormsObject(...); if (! obj.Exists()) Log.Error(...)
Вылазила ошибка о том, что obj = null
Вылазила ошибка спонтанно, в разных местах, отловить было практически нереально.
Решил проблему так:
if(!Sys.Process(...).WaitWinFormsObject(...).Exists()) Log.Error(...); else obj = Sys.Process(...).WinFormsObject(...);
Такой вариант не падает (по крайней мере до сих пор не падал)
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#6
Отправлено 01 февраля 2007 - 13:38
Этото что же мне во всех тестах, которые я сделал с помощью Recorder надо Window заменять на WaitWindow ?Set w2 = p.WaitWindow("#32770", "Microsoft Internet Explorer", 1, 15000) Call w2.Window("Button", "OK").ClickButton
Как то это не весело. Я вот изменил немного задержки
в настройках проекта Properties|Playback|Delay between events, ms - в начале было 0, я поставил 500 - на мой взгляд ошибки стали появлятся реже, но может это мое субъективное мнение и эти настройки в данном случае вообще ни причем ?
#7
Отправлено 01 февраля 2007 - 13:51
в настройках проекта Properties|Playback|Delay between events, ms - в начале было 0, я поставил 500 - на мой взгляд ошибки стали появлятся реже, но может это мое субъективное мнение
на мой взгляд, если проблема была именно в том, что контрол не успевал отрисовываться на форме, то изменение этой настройки Вам действительно поможет
однако теперь общее время выполнения всех скриптов увеличится, что не есть хорошо
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#9
Отправлено 01 февраля 2007 - 14:54
Recorder это конечно хорошо, но имхо лучше писать все ручками, тогда все будет работать быстрее и качественнее и непонятных ошибок будет малоЭтото что же мне во всех тестах, которые я сделал с помощью Recorder надо Window заменять на WaitWindow ?
Set w2 = p.WaitWindow("#32770", "Microsoft Internet Explorer", 1, 15000) Call w2.Window("Button", "OK").ClickButton
Как то это не весело. Я вот изменил немного задержки
в настройках проекта Properties|Playback|Delay between events, ms - в начале было 0, я поставил 500 - на мой взгляд ошибки стали появлятся реже, но может это мое субъективное мнение и эти настройки в данном случае вообще ни причем ?
p.s. расстановка дилеев может помочь только в частном случае, если вы будете тестировать на другом сервере, то в таком случае прийдется опять подбирать дилеи.
#10
Отправлено 04 февраля 2007 - 10:01
Нет, не во всех. Надо менять только там, где есть вероятность того что объект не будет найден. Если менять везде, то везде надо обязательно проверять возвращённые объекты на существование. Если этого не делать, то в случае ошибки её будет гораздо труднее отловить - упадёт не та строка, где объект не найден, а какая-нибудь последующая, где он используется.Этото что же мне во всех тестах, которые я сделал с помощью Recorder надо Window заменять на WaitWindow ?
Конкретно что касается вашей проблемы, у меня есть предположение что перед тем как окно p1.Window("#32770", "QQQ") появляется, аналогичное окно закрывается. То есть, открываются два одинаковых окна одно за другим, и ошибка происходит со вторым окном. Если это так, то причина ошибки в том что скрипт пытается работать ещё со старым окном (ТС успевает его схватить до того, как оно уничтожится). Если это так, то вот такой код должен решить проблему:
Do Set wnd = p1.Window("#32770", "QQQ") Set btn = wnd.WaitWindow("Button", "&Ecran") Loop Until btn.Exists Call btn.ClickButton
Дмитрий
#11
Отправлено 08 февраля 2007 - 15:40
Для того чтобы TC успевал увидеть нужный объект можно просто вызвать Refresh для parent нужного объекта (который возвращает null - или не видится).
К примеру Sys.Refresh приводит к обновлению child дерева объектов.
Хорошо работает в ограниченном пространстве памяти, правда замедляет исполнение скрипта.
#12
Отправлено 09 февраля 2007 - 07:56
Также можно проверять свойство readyState различных объектов, должно быть или 4, или complete.
#13
Отправлено 09 февраля 2007 - 09:44
внесу свои 5 копеек
иногда бывает, что номер инстанса объекта во время выполнения скрипта отличается от номера показываемого Object Browser
тогда естественно ТС разводит руками и говорит "не нашел"
Sys.Refresh() наверное может выручить , но если критичны задержки, то можно сделать так (для JScript):
button = Wnd.Window("Button", "&Ecran");
if ( !button.Exists )
}
button = Wnd.Window("Button", "&Ecran",1);
}
button.Click();
единственное, нужно знать какой номер инстанса правильный
(можно уточнить, если записать в лог ChildList окна и найти в нем описание своего объекта)
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных