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

Фотография

Поиск активного окна


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

#1 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 15 октября 2003 - 07:06

Здравствуйте все.
У меня однажды случилась такая проблема, что я не мог найти активное окно (это был обычный контрол). Возможно я не достаточно хорошо разбираюсь в TestComplite.
Я хотел бы узнать, как другие решают эту проблему.
Мне пришлось завести глобальную переменную и после создания окна сохранять на него указатель.
Спасибо.
  • 0

#2 Гость_Guest_*

Гость_Guest_*
  • Guests

Отправлено 15 октября 2003 - 09:39

Приветствую,

Немного не понятно, что имелось в виду под словами "активное окно" - окно или контрол... Хотя в общем случае - это не важно, так как рекомендуется сохранять ссылки на открытые окна и перед *каждым* (т.е. если, например, в цикле длбавляется несколько записей) началом работы с окном выполнять его активизацию (w.Activate) и установку фокуса ввода на контрол (w.w1.SetFocus). Такая техника во-первых, гарантирует, что производимый ввод будет направлен в требуемое место, а во вторых, если активизация окна не может быть выполнена (появилось сообщение об ошибке, например), то вы будете проинформированы об этом событием OnUnexpectedWindow().
Невыполнение активизации окна перед выполнением ввода в него - очень частая ошибка, которая часто приводит к непонятным ошибкам при выполнении скрипта. Следует всегда помнить, что Sys.Keys просто нажимает клавиши. Точно так, как это делает пользователь, если он не смотрит при этом на экран. Во время реальной работы пользователь визуально контролирует, какое окно получает ввод в данный момент. В скрипте это выполняется с помощью активизации окна.

--
Regards,
Alex
[TeamAQA]
================================

#3 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 15 октября 2003 - 09:47

Проблема в том, что допустим я открываю приложение и мне нужно работать с активным контролом(окном), а я не знаю какой из них активный. В смысле на экране то видно, а как сказать проге, что ты активный и давай с ним работай.
Я пробовал через Sys.ActiveWinow, но там немного другая технология и он ловит только главное окно.
...
Спасибо, что пожаловали в этот форум. Я вас часто вижу на англ. форуме. Но мне не совсем приятно писать на английском.
Здесь более доходчиво.
Кстати, как вы видели, обещали обработчик на Перекрывающиеся окна.
Ждёмс обновления...
  • 0

#4 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 15 октября 2003 - 10:16

И ещё. Если Вас не затруднит.
Не могли бы вы написать (раз вы член TeamAQA) более подробно как писать обработчики событий для TestComplite.
В смысле допустим есть у нас процедура Main и допустим в ней случается событие OnUnexpectedWindow().
А я хочу его обработать по своему.
Просто интересно и думаю, что другим будет тоже.
Масенький код, если вас не затруднит.
Заранее спасибо :)
  • 0

#5 Гость_Guest_*

Гость_Guest_*
  • Guests

Отправлено 15 октября 2003 - 16:48

М-м-м... Как-то непривычно, что "нужно работать с активным контролом(окном)"... Я лично, привык, что есть задача и известно в каком окне программы она может быть выполнена (т.е. моя задача определяет с чем я буду работать, а не первое доступное мне окно определяет, что я буду делать). Вот это окно я тогда и пытаюсь открыть и выполнить в нем необходимые действия.
Возможно, имеется в виду, что требуемое окно не может быть активизировано, т.к. доступ к нему блокирован иными *модальными* окнами (авторизация, некоторый запрос и т.п.). Если это так, то есть два способа решения:
1. Если последовательность таких блокирующих окон известна и постоянна, то их можно (и быстрее) обработать непосредственно в скрипте, когда пишется код доступа к требуемому окну. Например, нужно из главного меню главного окна (p.MainWin) приложения (процесс p) вызвать окно "А", при этом, при запуске приложения появляются окно авторизации (p.w) и запроса на архивацию (p.w2):
Set p = Sys.WaitProcess(...)
Set MainWin = p.WaitWindow("MainWinClass", "Caption", -1, 10000) ' это выполнится, т.к. устанавливается просто ссылка на окно, без его (окна) активизации.
Set w = p.WaitWindow("PWDRequestClass", "Авторизация", -1, 10000)
Call Authorize(w)
Set w2 = p.WaitWindow("ArchiveRequestClass", "Архивация", -1, 10000)
Call Archive(w2)
MainWin.Activate
...

2. Если последовательность блокирующих окон может быть не фиксированной (например, окно уведомления о полученном сообщении), то такие окна удобно обрабатывать с помощью событий. События не привязаны к какому-либо окну, а глобальны для всего проекта. Для обработки события, надо к любому модулю с кодом добавить форму (File | New | Form), переключиться на панель Component Palette (View | Panels | Component Palette) и положить компонент ProjectEvents на форму. После чего переключиться на панель Component Inspector и, на закладке Events добавить обработчик требуемого события (двойной щелчок создаст процедуру в коде).
Пример обработчика:
Sub STRecognizerEvents_OnUnexpectedWindow(Sender, Window, LogParams)
LogParams.Locked = True
Options.Log.Enabled = False

If Objects.Compare(Window, "DeleteSTProfile") Then
Options.Log.Enabled = True
Window.Window("Button", "&Yes").SetFocus
Sys.Keys "~y"
Exit Sub
End If

If Objects.Compare(Window, "STScheduleAlreadyExists") Then
Options.Log.Enabled = True
Call Log.Picture(Window, "Attempt to create duplicated schedule -- attempt cancelled")
Window.Window("Button", "OK").SetFocus
Sys.Keys " " ' presses OK button

' cancel record appending
Dim p
Dim w
Sys.Keys "[Esc]"
Set p = GetProcessHandle(GetLocalVarVal("Options.LocalVars.g_alk_TestedAppProcName"), 10000)
Set w = p.WaitWindow("#32770", GetLocalVarVal("Options.LocalVars.g_alk_GenWindowCaption"), , 2000)
If (Objects.Compare(w, "DiscardChanges")) Then
w.Window("Button", "&Yes").SetFocus
Sys.Keys "~y"
ElseIf (Objects.Compare(w, "STScheduleAlreadyExists")) Then
w.Window("Button", "OK").SetFocus
Sys.Keys " [P500]"
Sys.Keys "[F4]"
End If
Exit Sub
End If

LogParams.Locked = False
Options.Log.Enabled = True
End Sub
'-------------------------------------------------------------------------------

Следует иметь в виду, что OnUnexpectedWindow() срабатывает только в случае модальных окон. К сожалению, есть много примеров, когда окно не является модальным, но, тем не менее, не допускает активизацию окна, расположенного под ним (по сути, .Activate выполняет вызов SetForegroundWindow() из WinAPI). Пока, в случае такого окна приходится ставить циклы его ожидания в местах вероятного появления. Поэтому обработка OnOverlappedWindow() будет очень полезна.


P.S. Очень рекомендую смотреть в online help и примеры, которые поставляются с продуктом. Там действительно много полезной и неплохо организованной информации.

--
Regards,
Alex
[TeamAQA]
================================

#6 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 16 октября 2003 - 04:56

Для начала спасибо за ценные советы и нотации. :)
У меня была причина, чтобы попросить вас доходчиво написать и объяснить на русском создание обработчика Event. (Не всегда удаётся попасть на форум).
...
К сожаленью я видимо не совсем точно описал проблему, когда

нужно работать с активным контролом(окном)

Дело в том, что встречается такая проблема, когда после открытия формы, на которой размещены элементы, нужно определить какое окно стало активным после тех или иных действий.
Искать по названию окна?
Их может быть очень много.
К тому же я могу вообще заранее не знать имени окна. Конечно можно предусмотреть варианты все и отследить окна, но в данном случае я интересовался просто на наличие функции, которая возвращает указатель на активное окно (в моём случае контролл).
Я могу ошибаться, но в одной из программ -аналогов (Rational Visual Test) есть передача управления именно на активное окно, которое определяется простой функцией.
И в ТестКомплите я искал такую же функцию.
Видимо её просто пока ещё нет или я не нашёл её.
...
И такой вопрос. Наша компания собирается купить AQDevTeam.
Как написано в хелпе
AQdevTeam integrates with Microsoft Visual SourceSafe, thus giving members of your team an easy way to check project source files as required - directly from AQdevTeam.

Сейчас выложена Demo версия и пока не удаётся посмотреть насколько можно хорошо использовать эту особенность, т.е. хранить исходные файлы напрямую через рассматриваемый продукт.
Пока что я только увидел возможность хранения очётов об ошибках из под ТестКомплита.
(Поправьте, если я в чём то ошибся).

Не могли бы вы вкратце описать каким образом можно хранить исходники из ТестКомплита в СС посредством AQDevTeam?

Заранее спасибо.
  • 0

#7 Гость_Guest_*

Гость_Guest_*
  • Guests

Отправлено 16 октября 2003 - 08:09

Да, насколько я знаю, такой функции в TestComplete нет... Могу предложить два варианта решения:
1. Проитерироваться по списку окон процесса (p.ChildCount) и для каждого окна проверить свойства .Focused, .Enabled, .Exists и .Visible.
Кстати, следует помнить, что .ChildCount перед тем как вернуть число дочерних окон, обновляет их список. Поэтому, для повышения быстродействия, рекомендуется писать нечто вроде:
iChildCount = p.ChildCount
For (i=0 To iChildCount - 1)
...

а не
For (i=0 To p.ChildCount - 1)
...

2. Выполнить вызов Win32API.GetForegroundWindow() и, по полученному handle, определить окно:
h = Win32API.GetForegroundWindow()
Set w = Sys.WindowFromHandle(h)
w.Activate
...


Теперь относительно AQdevTeam:

То, что вас интересует, находится в свойствах проекта: контекстное меню проекта, Properties, закладка Contents (и Attachments). Примеры использования данной функциональности можно посмотреть, например, в макросах 'Build Delphi Project', 'Build VC Project' и др.
Хотя лично я данной возможностью не пользуюсь (как-то все в куче отображается и нет уверенности, что при добавлении файла в проект в VSS этот файл добавится и в AQdevTeam). Поэтому я предпочел написать свой макрос, который использует макрооперации по работе с VSS и получает исходники напрямую по заданному списку.

--
Regards,
Alex
[TeamAQA]
================================

#8 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 16 октября 2003 - 09:02

Да, да, пришлось только через API ловить.
Вариант с перебором не подошёл ввиду нестандартных Дельфийских компонентов.
Спасибо, что подсказали и теперь мне не нужно пересматривать хелп и искать эту функцию.
...
Относительно AQdevTeam.
Как вы считаете, можно ли его использовать в качестве гарантированной работы с СС.
(У меня недавно случай был неприятный. Я в ТК (тесткомплит) написал достаточно много кода, но потом у меня сбойнуло и вообщем код был потерян. Хорошо, были архивы. ) Мы уже купили ТК и теперь постепенно хотим переходить на AQ.
Rational глючный, но данные не теряет.
Я пока положительно смотрю в сторону AQ. Но рисковать не хочется, потому что цены не детские.
...
Вот ещё одна проблема с которой я столкнулся при использовании ТК.
Есть плагин - Name Mapping. Я вроде сделал всё, как положено - указал Unmapped name - скажем Window('TComboBox', '', 1). Mapped Name - ComboBox1.
Был к примеру код

Begin
TestedApps.Items[0].Run();
p := Sys.Process('MyClient');
w := p.Window('Дочернее окно');
w.Activate;
w.Window('TComboBox', '', 1).Click('Тест');
End;

Я подменил ComboBox1 и получил

Begin
TestedApps.Items[0].Run();
p := Sys.Process('MyClient');
w := p.Window('Дочернее окно');
w.Activate;
w.ComboBox1 .Click('Тест');
End;

Но при запуске ТК напомнил мне в вежливой форме, что ComboBox1 впервые видит.
И вот ещё пример
Была строка
Sys.Process('MyService');
Я мапнул её на MyService.
Опять таки - вживую брать не хотел. Но!!!
После того, как я включил Recorder и поработал немного с окнами указанного процесса, то я вдруг с удивлением обнаружил в получившейся процедуре Test1 след. строку
Sys.MyService
Во-первых. Почему только после процедуры записи?
Во-вторых. А причём здесь Sys? Я ведь мапил всю строку полностью, или так уже нельзя?
Спасибо за внимание.
Буду рад любому содействию.
  • 0

#9 Гость_Guest_*

Гость_Guest_*
  • Guests

Отправлено 16 октября 2003 - 16:44

AQdevTeam:
Что значит "гарантированная работа с СС"? AQdevTeam непосредственно данные не хранит (в том контексте который сейчас рассматривается. File Attachments сохраненные для конкретной item хранятся, конечно, в базе. Я извиняюсь за смесь русского и английского - просто стараюсь, чтобы не было неправильного понимания), а хранит только путь к проекту в VSS. Таким образом, сохранность данных зависит только от VSS и сервера баз данных AQdevTeam.
Я не знаю в деталях (знаю только, что есть локальное кеширование, которое позволяет работать при отсутствии связи с сервером AQdevTeam), каким образом обеспечивается сохранность данных от момента их ввода в клиенте и нажатия кнопки OK до момента их передачи сервером AQdevTeam серверу баз данных, но уже неоднократно сталкивался со случаями, когда из-за проблем сети рвалась связь между клиентом и сервером AQdevTeam. После нажатия кнопки Reconnect проблем с потерей данных не наблюдалось. Причем один случай был достаточно неприятный: я сделал порядочно изменений на системном уровне (права, workflow и т.п.) и стал сохранять изменения. На сервере баз данных закончилось место (ну недоглядели... :( ) и сервер AQdevTeam подвис. Пришлось его снимать как процесс, чистить место на диске и перезапускать. После нажатия кнопки Reconnect на клиенте изменения были сохранены без потерь.

TestComplete:
Тут немного похуже... ;) - я практически не работал с маппингом (хотя сама идея мне очень нравится), т.к. мне показались очень неудобными следующие вещи:
1. Надо работать только или с маппингом, или без него. Причем - с самого начала, иначе надо править *все* относящиеся к делу скрипты. В том числе и те, которые общие для нескольких проектов. На переписывание *всех* скриптов выделять ресурс было просто неразумно.
2. Мапить надо полное имя объекта, включая *точный* заголовок окна и его индекс. Нельзя использовать шаблон заголовка строки (или у меня это не получилось) и опционально использовать индекс. В моем случае это вызывало проблемы, т.к. заголовок и индекс могли меняться, причем для заголовка можно указать шаблон, но невозможно указать все конкретные варианты.
3. Т.к. мапить надо полное имя объекта, нельзя (или снова-таки у меня не получилось) строить иерархию. Т.е. замапить процесс, затем - главное окно приложения относительно процесса, затем - дочернее окно главного окна относительно главного окна и т.д. Такой подход, если бы он был возможен, дал бы много преимуществ.

Таким образом, к сожалению, я не могу ответить на заданные вопросы, но надеюсь, что вы обратите внимание на возникшие у меня проблемы.
Кстати, буду рад, если окажется, что я неправ и то, что у меня не получилось, реализовать все-таки можно. Повторяю - сама идея маппинга мне очень нравится.

--
Regards,
Alex
[TeamAQA]
================================

#10 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 17 октября 2003 - 02:30

Спасибо за ответ.
У меня сложилось мнение, что AQdevTeam всё таки сможет обеспечить функциональность нормального связующего звена между СС и ТК. Попробую поговорить с начальством по поводу его приобретения и обкатки.
Интересно, AQ уверяет, что в случае, если продукт не понравится или по другим причинам, деньги могут быть возвращены в течении 60 дней. А что происходит тогда с той лицензией, которая была на продукте? Ведь не исключено, что можно было бы сделать так, что после покупки продукта и лицензии, можно просто попросить денежку назад. Какая защита стоит на продукте от этого случая?
...
Относительно мапинга имён - я от него отказался.
Во-первых действительно очень неудобно во всём проекте править соответствующие айтемы, которые были включены в карту мапинга.
Во-вторых, что ещё более печально, иерархический мапинг действительно не поддерживается.
В -третьих, создаётся впечатление, что этот плагин какой то "сырой" :( . Идея хорошая, но её нужно (срочно :rolleyes: ) ещё доводить до ума. Мне тоже понравилась она.
Будем ждать.
  • 0

#11 Гость_Guest_*

Гость_Guest_*
  • Guests

Отправлено 17 октября 2003 - 07:09

AQdevTeam как связующее между VSS и TestComplete:
Лучше всего, конечно, смотреть по конкретной задаче :) Как я уже писал, я не использую привязку VSS к проекту, но использую AQdevTeam для ежедневной сборки разрабатываемых модулей и последующего прогона по ним набора тестов. В обоих случаях работают написанные мной макросы, которые выполняют GLV исходников модулей из VSS, выполняют их сборку, GLV набора тестов и их прогон с использованием TestComplete. Возникшие при сборке или тестировании проблемы фиксируются в базе AQdevTeam (естественно :) ). Ну и оповещения соответствующим людям в почту.

Конечно, AQdevTeam не панацея от всего, но:
а) продукт неплохо интегрирован как с остальными продуктами AutomatedQA, так и с VSS и основными средами разработки;
б) действительно широкий допустимый диапазон подстройки продукта под методику работы компании (типы данных/сущностей, их жизненный цикл и пути продвижения по нему и т.п.);
в) мощные возможности по скриптованию с помощью макросов. С одной стороны, это может быть расценено как недостаток, т.к. базовая установка (в смысле Tutorial database на базе которой я рекомендую создавать базу для вашей компании) предлагает лишь основную функциональность, но, с другой стороны, именно с помощью макросов можно окончательно подстроить поведение продукта под конкретные требования.


Лицензии к TestComplete и AQdevTeam:
Я не знаю, что произойдет при использовании продукта, для которого не введен регистрационный номер. Подозреваю, что продукт будет работать, хотя я не проверял (просто у меня есть лицензия). Насчет покупки, возврата с получением денег и последующего использования оставшегося продукта - думаю, что в этом случае вы просто будете его незаконным пользователем... Я не думаю, что с функциональностью продукта будут проблемы (хотя для AQdevTeam 1.2 и анонсировалось усиление контроля за лицензиями), но все продукты AutomatedQA пока развиваются очень динамично и каждая новая версия содержит значительное количество действительно очень полезной функциональности. Хотя при наших привычках... :( Но лично мне сейчас уже совершенно не хочется использовать TestComplete2.x, т.к. версия 3 дает очень много для создания тестировочной среды именно в рамках компании.


--
Regards,
Alex
[TeamAQA]
================================

#12 Darkus

Darkus

    Опытный участник

  • Members
  • PipPipPipPip
  • 424 сообщений
  • Город:Казахстан, г.Астана

Отправлено 17 октября 2003 - 09:03

Сегодня познакомился с мощной структурой Event- ов в AQdevTeam.
Я лично в восторге остался.
Из недостатков пока можно отметить только маленькое количество контролов для форм отчётов и т.п.
Так например, если мне нужно скажем связать поле с каким нибудь разделом в проекте, где всё построено иерархически, то там всё в куче (люди, кони... :blink: ). А вот если был бы какой-нибудь контрол вроде дерева списка, то уже было бы удобнее осуществлять навигацию.
Кстати, теперь я понял, почему вам не нравится интеграция с СС и как там тоже всё в куче. :) Думаю, что это в тот же огород камень :)
И пожалуй ещё 1 минус. В Rational Requisute Pro уже давно сделана интеграция с Вордом. Здесь прийдётся видимо "прикручивать" самому :)
Да, многое ещё не ясно, но функциональность по настройке всего-всего-всего.. действительно потрясающая. И вроде пока не глючит :)

Насчет покупки, возврата с получением денег и последующего использования оставшегося продукта - думаю, что в этом случае вы просто будете его незаконным пользователем...

:)
У нас куплен ТК и как бы деньги мы заплатили окончательно, тем более, что срок уже давно прошёл.
Но мне кажется , что это не совсем применимо к странам СНГ, где вопрос о "законности пользования" где начинается, там и заканчивается. Яркий тому пример - "форточки" :) , т.е. винда. Интересно, сколько их законных покупателей? :))
А вообще круто было бы делать скидки уже купившим что-нибудь из продуктов.
Вроде бы тогда по законам коммерции чем больше покупаешь, тем легче купить другие продукты. (Это я про AQDevTeam). Тогда и вопрос о сроке в 60 дней был бы уже не столь существенен.
  • 0

#13 Гость_Guest_*

Гость_Guest_*
  • Guests

Отправлено 17 октября 2003 - 09:55

AQdevTeam:
Угу... Деревьев у них нет... :'( Интеграции с Вордом - тоже. Ну т.е. для присоединенного документа (панелька Attachments на форме любого item'а, которая по умолчанию не видна, если нет присоединенных документов. Поэтому я предпочитаю сразу открыть на редактирование любую запись и выполнить Tools | Show Links and Attachments) Ворд-то запустится без проблем, а вот все остальное надо прикручивать. Хотя тяжело сказать, где Ворд должен запускаться "сам"... AQdevTeam, все-таки не система управления требованиями или документооборотом. Лично я ее расцениваю/использую как систему управления жизненным циклом проекта и тут не всегда очевидно где Ворд надо, а где - нет.

Лицензирование:
Применительно "к странам СНГ" - полностью согласен. Но надеюсь, что у компании достаточно много клиентов и вне СНГ. А в СНГ проблема тестирования и качества пока (IMHO) не первоочередная - найти неплохого QA инженера (не тестировщика, который просто играется с приложением) далеко не просто...

Скидки - да, есть на количество копий и на новые версии. Как сказано на сайте на каждой странице заказа - в случае вопросов можно писать на sales@automatedqa.com. Я думаю, что вполне нормально написать и поинтересоваться возможностью дополнительной скидки как пользователю одного из продуктов.

--
Regards,
Alex
[TeamAQA]
================================

#14 Гость_Guest_Darkus_*

Гость_Guest_Darkus_*
  • Guests

Отправлено 17 октября 2003 - 10:45

Спасибо за информацию.
Интересно, а курсы AQ или сертификация какая-нибудь есть в странах СНГ?
Ну или книжки какие-нибудь заказать можно (на англ. или русском)?

#15 Case

Case

    Основатель

  • Members
  • PipPipPipPipPipPip
  • 7 071 сообщений
  • ФИО:Панкратов Вячеслав
  • Город:Украина, Киев.

Отправлено 23 октября 2003 - 14:38

Ждал ждал - не выдержал.
Видимо нету ни курсов ни книжек на русском. Что за дискриминация такая? :)
  • 0
Слава Панкратов
Редактор портала www.it4business.ru

#16 Юстус

Юстус

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

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

Отправлено 21 января 2004 - 09:55

Ждал ждал - не выдержал.
Видимо нету ни курсов ни книжек на русском. Что за дискриминация такая? :)

Добрый день,

Что делать, учите английский !

Потому как американцы и прочие англичане все равно не будут учить русский, ведь в его алфавите целых 33 буквы, а в английском всего 26 :-)

Regards,
Юстус
  • 0


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

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