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

Фотография

TestComplete не видит окно


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

#1 M.A.N.

M.A.N.

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Александр

Отправлено 03 февраля 2005 - 09:30

Здравствуйте!
Проблема:
TestComplete не видит окно типа MessageDlg, ( например фрагмент кода Delphi):

try
StrToInt('foo');
except
MessageDlg('Error!', mtError, [mbOK], 0);
end;

Хотя если самому создать исключительную ситуацию и записать с помощью Record, то окно распознается.
  • 0

#2 Dmitry N

Dmitry N

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

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 03 февраля 2005 - 11:50

Здравствуйте.

Я не совсем понял, что значит "не видит окно типа MessageDlg". Что именно происходит и что именно TestComplete должен делать и не делает?

Если вы имели в виду, что это окно должо обрабатываться TestComplete'ом как unexpected, то я советую просмотреть следующие топики помощи:
- Handling Unexpected Windows
- OnUnexpectedWindow Event
- Events and Event Handlers

Хочу также заметить, что TestComplete "ловит" unexpected окна тогда, когда они мешают выполнить какое-нибудь действие вызывающую активацию другого окна (клик, перетаскивание, просто активация - w.Activate). Так как unexpected окно является модальным, то это другое окно не может быть активировано, что и вызывает появление события OnUnexpectedWindow.
  • 0
С уважением,
Дмитрий

#3 M.A.N.

M.A.N.

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Александр

Отправлено 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.
  • 0

#4 Dmitry N

Dmitry N

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

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 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;
  • 0
С уважением,
Дмитрий

#5 M.A.N.

M.A.N.

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Александр

Отправлено 03 февраля 2005 - 13:51

Спасибо, Дмитрий, за обстоятельный ответ.

О существовании такого решения я знал. Просто не представляется удобным проверять, не появилось ли сообщение об ошибке после работы с каждым элементом ввода данных, особенно если их очень много. Было бы удобным, если бы TestComplete распознавал любое появивляющееся окно, как Unexpected, даже если искомого окна еще нет, а не просто ждал тайм-аута. Или я многого хочу от TestComplete ?

P.S. Об "Open Applications" я в курсе, приведенный пример сделан по-быстрому только для описания проблемы.
  • 0

#6 Dmitry N

Dmitry N

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

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 03 февраля 2005 - 14:25

Было бы удобным, если бы TestComplete распознавал любое появивляющееся окно, как Unexpected, даже если искомого окна еще нет, а не просто ждал тайм-аута. Или я многого хочу от TestComplete ?

Когда окно не мешает TestComplete'у, то он просто не может знать о том, что оно Unexpected. В данном случае, сообщение об ошибке ему не мешает.

Могу посоветовать оформить проверку на сообщение об ошибке в отдельную процедуру, и затем вызывать ее при необходимости. Например:

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);
...
  • 0
С уважением,
Дмитрий

#7 Kate4kina

Kate4kina

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

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

Отправлено 20 октября 2010 - 08:35

объясните, пожалуйста.Пишу тренировочный скрипт по мануалу. на VBScript.
должен открыватсья блокнот, в нем открываем 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
  • 0

#8 Dmitry N

Dmitry N

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

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 25 октября 2010 - 08:38

Здравствуйте.

Попробуйте так:
Set wsetup = w.Window("#32770","Page Setup",1)

  • 0
С уважением,
Дмитрий


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

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