TestComplete не видит окно
#1
Отправлено 03 февраля 2005 - 09:30
Проблема:
TestComplete не видит окно типа MessageDlg, ( например фрагмент кода Delphi):
try
StrToInt('foo');
except
MessageDlg('Error!', mtError, [mbOK], 0);
end;
Хотя если самому создать исключительную ситуацию и записать с помощью Record, то окно распознается.
#2
Отправлено 03 февраля 2005 - 11:50
Я не совсем понял, что значит "не видит окно типа MessageDlg". Что именно происходит и что именно TestComplete должен делать и не делает?
Если вы имели в виду, что это окно должо обрабатываться TestComplete'ом как unexpected, то я советую просмотреть следующие топики помощи:
- Handling Unexpected Windows
- OnUnexpectedWindow Event
- Events and Event Handlers
Хочу также заметить, что TestComplete "ловит" unexpected окна тогда, когда они мешают выполнить какое-нибудь действие вызывающую активацию другого окна (клик, перетаскивание, просто активация - w.Activate). Так как unexpected окно является модальным, то это другое окно не может быть активировано, что и вызывает появление события OnUnexpectedWindow.
Дмитрий
#3
Отправлено 03 февраля 2005 - 12:34
Топики я конечно же изучил до того, как задать вопрос.
Попытаюсь подробнее объяснить ситуацию:
Фрагмент кода Delphi:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
StrToInt(Edit1.Text);
except
MessageDlg('Error!', mtError, [mbOK], 0);
end;
ShowMessage('End');
end;
Фрагмент, записанный с помощью TestComplete при нормальной ситуации (исключения не возникает),
затем изменено значение вводимых символов c, допустим '111' на 'aaa'.
p := Sys.Process('Project1');
w := p.Window('TForm1', 'Form1');
w.Activate;
Sys.Keys('aaa');
w.Window('TButton', 'Button1').Click;
w := p.Window('TMessageForm', 'Project1');
w.Activate;
w.Window('TButton', 'OK').Click;
TestComplete ожидает появления модального окна:
ShowMessage('End') - Delphi
p.Window('TMessageForm', 'Project1') - TestComplete
в то время как на экране также модальное окно MessageDlg('Error!', mtError, [mbOK], 0) и отказывается распознавать его как Unexpected.
#4
Отправлено 03 февраля 2005 - 13:11
Спасибо за пояснение, теперь все понятно.TestComplete ожидает появления модального окна:
Дело в том что как я уже сказал, TestComplete воспринимает окно как Unexpected, если оно мешает выполнить какие-либо действия над другим окном. В вашем случае проблема заключается в том, что TestComplete просто не может найти этого другого окна.
Для того чтобы обойти эту ситуацию, придется проверять, не появилось ли сообщение об ошибке сразу после нажатия кнопки. Например:
[DelphiScript]
procedure Test1;
var
p, w: OleVariant;
begin
p := Sys.Process('Project1');
w := p.Window('TForm1', 'Form1');
w.Activate;
w.Window('TEdit', 'Edit1').DblClick();
Sys.Keys('aaa');
w.Window('TButton', 'Button1').Click;
w := p.WaitWindow('TMessageForm', 'Error');
if (w.Exists) then
begin
Log.Picture(w, 'Unexpected window!');
w.Activate;
w.Window('TButton', 'OK').Click;
end;
w := p.Window('TMessageForm', 'Project1');
w.Activate;
w.Window('TButton', 'OK').Click;
end;
Кстати, я заметил что ваше приложение не является Open. Рекомендую откомпилировать его как Open, так как это позволит работать с нативными свойствами и методами внутренних объектов приложения. Подробности можно найти в топике "Open Applications".
Вот тот же скрипт, но только работающий с Open приложением:
procedure Test2;
var
p, w: OleVariant;
begin
p := Sys.Process('Project1');
w := p.Form1;
w.Activate;
w.Edit1.DblClick();
Sys.Keys('aaa');
w.Button1.Click;
w := p.WaitWindow('TMessageForm', 'Error');
if (w.Exists) then
begin
Log.Picture(w, 'Unexpected window: ' + w.Message.Text);
w.Activate;
w.OK.Click;
end;
w := p.TMessageForm_1;
Log.Message('Message: ' + w.Message.Text);
w.Activate;
w.OK.Click;
end;
Дмитрий
#5
Отправлено 03 февраля 2005 - 13:51
О существовании такого решения я знал. Просто не представляется удобным проверять, не появилось ли сообщение об ошибке после работы с каждым элементом ввода данных, особенно если их очень много. Было бы удобным, если бы TestComplete распознавал любое появивляющееся окно, как Unexpected, даже если искомого окна еще нет, а не просто ждал тайм-аута. Или я многого хочу от TestComplete ?
P.S. Об "Open Applications" я в курсе, приведенный пример сделан по-быстрому только для описания проблемы.
#6
Отправлено 03 февраля 2005 - 14:25
Когда окно не мешает TestComplete'у, то он просто не может знать о том, что оно Unexpected. В данном случае, сообщение об ошибке ему не мешает.Было бы удобным, если бы TestComplete распознавал любое появивляющееся окно, как Unexpected, даже если искомого окна еще нет, а не просто ждал тайм-аута. Или я многого хочу от TestComplete ?
Могу посоветовать оформить проверку на сообщение об ошибке в отдельную процедуру, и затем вызывать ее при необходимости. Например:
procedure CheckErrorMessage(p);
var w;
begin
w := p.WaitWindow('TMessageForm', 'Error');
if (w.Exists) then
begin
Log.Picture(w, 'Unexpected window!');
w.Activate;
w.Window('TButton', 'OK').Click;
end;
end;
...
w.Window('TButton', 'Button1').Click;
CheckErrorMessage(p);
...
Дмитрий
#7
Отправлено 20 октября 2010 - 08:35
должен открыватсья блокнот, в нем открываем Page Setup. Как распознать это окно???
Тест комплит такие вот строки не воспринимает:
Sub Note
dim w1, w
dim w2
dim wsetup
set w = Sys.Process("notepad")
set w1=w.Window("Notepad", "*")
set w2 = w1.Window("Edit")
w2.Keys("Test string[Enter]Second string")
w1.MainMenu.Click("Edit|Select All")
w1.MainMenu.Click("Edit|Delete")
w1.MainMenu.Click("Edit|Undo")
w1.MainMenu.Click("File|Page Setup...")
wsetup=w.("#32770","Page Setup",1) ' выдается ошибка The object with the specified attributes does not exist.
end sub
#8
Отправлено 25 октября 2010 - 08:38
Попробуйте так:
Set wsetup = w.Window("#32770","Page Setup",1)
Дмитрий
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных