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

Фотография

Модальное окно не всегда закрывается корректно


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

#1 Melmar

Melmar

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

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


Отправлено 03 апреля 2007 - 09:03

Добрый день, коллеги,
наблюдаю странную ситуацию. Есть главное приложение, из него из пункта меню вызывается модальное окно и закрывается кнопкой в самом окне. Скрипт выглядит примерно вот так:
 p.VCLObject('MainF').MainMenu.Click('[0]|[9]|[0]');
  NewF := p.WaitVCLObject('NewForm',5000);
  if not NewF.Exists then Exit; // Nothing to do 
  //... Test form NewF
  w2:=NewF.VCLObject('pnButtons').VCLObject('btnClose');
  w2.ClickButton;

Так вот - при выполнении скрипта (ТС 4.30) иногда это новое окно не закрывается, причем оно становится не модальным, "ныряет" под основную форму и основное окно приложения естественно виснет намертво. Через два раза на третий скрипт отрабатывает успешно. Изменение параметра проекта в ТС Delay between events не помогает.
Само приложение откомпилировано как Open application. Вот фрагмент кода самой программы (Delphi), где вызывается это модальное окно:
 
with TNewForm.Create(Application) do
  try
    begin
      ShowModal;
    end;
  finally
    Free;
  end;

Исследования в Object Browser во время выполнения скрипта и распечатка списков дочерних объектов основной формы (их до 50-ти) до открытия модальной формы, после открытия и после закрытия показали, что форма NewForm таки да не всегда "уходит" из перечня объектов, а вместо этого в ТС идет перетасовка и изменение количества объектов Window('TPUtilWindow','',*), причем таких объектов может быть до 26-ти. Мне удалось только выяснить, что эти 'TPUtilWindow' являются порождением самого ТС, причем в Open Application.

Может быть, кто-то знает, что это за объекты и каким контролом тестируемого приложения они создаются? Дело в том, что в тестовом приложении (два окна, по две-три кнопки в каждом и тот же метод ShowModal), которое я создаю, чтобы смоделировать ситуацию и, возможно, отправить в AutomatedQA, у меня этих 'TPUtilWindow' в Object Browser видно только 2.
  • 0

#2 Dmitry N

Dmitry N

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

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

Отправлено 03 апреля 2007 - 12:31

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

Согласно гуглу, TPUtilWindow - это стандартное дельфовое окно, которое создается при вызове метода AllocateHWnd.

А щелчок по кнопке точно происходит? А окно это можно потом вручную открыть (выбрать в панели задач другое окно, а затем там же окно приложения)? А можно окно активировать методом NewF.Activate?

Попробуйте ещё закрывать окно с помощью метода Close - 'NewF.Close;'.
  • 0
С уважением,
Дмитрий

#3 Melmar

Melmar

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

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


Отправлено 03 апреля 2007 - 14:04

А щелчок по кнопке точно происходит?

Просмотр сообщения

Точно происходит, причем иногда при выполнении скрипта можно наблюдать, как это окно закрывается и уходит с экрана, а потом снова появляется, происходит какая-то перерисовка окон (типа Refresh), и окно ныряет под основное.

А окно это можно потом вручную открыть (выбрать в панели задач другое окно, а затем там же окно приложения)?

Просмотр сообщения

Да, я именно так и делаю - останавливаю выполнение скрипта и по Alt+Tab извлекаю это "скандальное" окно, чтобы его закрыть. После этого можно все запускать снова - проверено, ничего не ломается, другие объекты и окна приложения не разрушаются и логика работы программы остается прежней.

А можно окно активировать методом NewF.Activate?
Попробуйте ещё закрывать окно с помощью метода Close - 'NewF.Close;'.

Просмотр сообщения

Проверено - можно. После Activate и Close окно закрывается "надежно". Но ведь это программное закрытие окна, что совершенно не соответствует "действиям пользователя" - нажатию на кнопку Close.
Кстати, замена в скрипте VCLObject('btnClose').ClickButton на NewF.Keys('~[F4]') или на Click(X,Y) с предварительным "вычислением" координат середины кнопки ни к чему не привела - упрямо появляется закрытое окно.
В любом случае спасибо Вам, Дмитрий, за ответ. Будем изучать дальше...
  • 0

#4 Melmar

Melmar

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

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


Отправлено 04 апреля 2007 - 07:37

Удивительное поведение этого окна! Если убрать из скрипта все попытки его закрыть кнопкой 'btnClose' или с клавиатуры Alt+F4 и оставить только NewF.Close - то окно опять-таки не закрывается :blush:
Пришлось "обмануть" его вот таким кодом, что полностью идет вразрез с моим представлением о поведении модальных окон:
NewF.VCLObject('btnClose').ClickButton;
Delay(1000);
NewF:=p.WaitVCLObject('NewForm',1000);
if NewF.Exists then begin
      NewF.Activate;
      NewF.Close;
end;

  • 0

#5 Dmitry N

Dmitry N

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

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

Отправлено 06 апреля 2007 - 11:50

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

Может, какая-нибудь заморочка с обработкой сообщений? Надо, наверное, попросить ваших разработчиков посмотреть, что там происходит под дебаггером.
  • 0
С уважением,
Дмитрий

#6 Deus

Deus

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

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 12 апреля 2007 - 13:48

День Добрый :hi:

У меня другая проблема возникает - выскакивает модальное окно у ИЕ7:
"Sys.Process("iexplore").Window("#32770", "Windows Internet Explorer", 1)"
с кнопкой:
"Sys.Process("iexplore").Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1)"
которую нажать не получается, это модальное окно каким-то образом перехватывает контроль и ТС замерзает..
  • 0

#7 Melmar

Melmar

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

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


Отправлено 12 апреля 2007 - 14:07

Добрый день.
Хотелось бы узнать поподробнее, что значит "нажать не получается". Может быть, индекс окна не всегда равен 1 и ТС его не находит? Попробуйте поискать аналогичные окна или поставьте "-1". Если вылезет Ambiguous recognition - надо искать "последнее" открытое окно.
  • 0

#8 Dmitry N

Dmitry N

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

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

Отправлено 13 апреля 2007 - 18:10

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

"Sys.Process("iexplore").Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1)"
которую нажать не получается, это модальное окно каким-то образом перехватывает контроль и ТС замерзает..

А если так:
 // JScript
  var obj = Sys.Process("iexplore").Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1);
  Runner.CallObjectMethodAsync(obj, "ClickButton");

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

#9 Deus

Deus

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

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 14 апреля 2007 - 11:55

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

"Sys.Process("iexplore").Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1)"
которую нажать не получается, это модальное окно каким-то образом перехватывает контроль и ТС замерзает..

А если так:
 // JScript
  var obj = Sys.Process("iexplore").Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1);
  Runner.CallObjectMethodAsync(obj, "ClickButton");

Просмотр сообщения


Не-а, все равно ТС мёрзнет :(
  • 0

#10 Dmitry N

Dmitry N

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

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

Отправлено 16 апреля 2007 - 12:58

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

А на какой конкретно строке зависает? Можете выполнить скрипт по строкам (F8), чтобы это определить.

Кстати, а что это за окно? Как оно создаётся?
  • 0
С уважением,
Дмитрий

#11 ArtemRudenko

ArtemRudenko

    Постоянный участник

  • Members
  • PipPipPip
  • 248 сообщений
  • ФИО:Руденко Артем Михайлович
  • Город:Минск


Отправлено 18 апреля 2007 - 07:23

Может подскажете, в чем причина возникновения сообщения "Object doesn't support this proprty or method" в следующем вызове "Runner["CallObjectMethodAsync"](menuObject, "OnToolClick");", если я делаю этот вызов на TestComplete 5(С#Script) для приложения, созданного на .Net для объекта, у которого существует в списке методов метод "OnToolClick".

Очень похоже на то, что ошибка возникает не в "OnToolClick", а в "CallObjectMethodAsync", может ли быть такое, что этот метод по каким-либо причинам не доступен???(все extensions стоят)
  • 0
И всё-таки она вертится...

#12 Deus

Deus

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

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 18 апреля 2007 - 07:26

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

А на какой конкретно строке зависает? Можете выполнить скрипт по строкам (F8), чтобы это определить.

Кстати, а что это за окно? Как оно создаётся?

Просмотр сообщения

:hi:
Вот на этом шаге, кликаю на кнопку "Убрать все рулы" - моментально вылетает модальное окно блокирующее ТС и ИЕ :
w1.document.frames(0).frames(2).document.getElementById("ctl00_ProjectionDetail_buttonRemoveAll").Click()

Пытаюсь по разному нажать, но все никак:
p.WaitWindow("#32770", "Windows Internet Explorer", 1, 5000).Window("Button", "OK", 1).Click()
  ' или так       
            Set obj = p.Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1)
            Call Runner.CallObjectMethodAsync(obj, "ClickButton")

  • 0

#13 Deus

Deus

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

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 18 апреля 2007 - 12:14

Решилось все вот так:

Set removeAllObject = w1.document.frames(0).frames(2).document.getElementById("ctl00_ProjectionDetail_buttonRemoveAll")
            Call Runner.CallObjectMethodAsync(removeAllObject, "Click")
            Set obj = p.Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1)
            Call Runner.CallObjectMethodAsync(obj, "ClickButton")

  • 0

#14 aspirin

aspirin

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

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Aspirin
  • Город:Minsk

Отправлено 16 апреля 2009 - 07:37

Решилось все вот так:

Set removeAllObject = w1.document.frames(0).frames(2).document.getElementById("ctl00_ProjectionDetail_buttonRemoveAll")
            Call Runner.CallObjectMethodAsync(removeAllObject, "Click")
            Set obj = p.Window("#32770", "Windows Internet Explorer", 1).Window("Button", "OK", 1)
            Call Runner.CallObjectMethodAsync(obj, "ClickButton")


Добрый день!
Подскажите как подключить CallObjectMethodAsync?
  • 0

#15 Dmitry N

Dmitry N

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

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

Отправлено 17 апреля 2009 - 15:47

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

Согласно справке, данный метод появился в TestComplete 4.20. Если у вас версия новее, значит вы можете им пользоваться.
  • 0
С уважением,
Дмитрий


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

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