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

Фотография

объекты с одинаковыми полными системными путями


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

#1 pozval

pozval

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Позняк Валерий Антонович

Отправлено 21 октября 2009 - 12:03

Использую Testcomplete 7.20
при тестировании программ, написанных на Delphi2010 обнаружилось в браузере существование объектов с полностью идентичными системными путями, причем один из них правильный, а второй глючный. Соответственно при работе скрипта если найден правильный объект - то все хорошо, если неправильный - то останов.
Как обойти эту проблему?
Сразу же уточняю, в отличие от предыдущей темы по объектам с одинаковыми именами, но разными индексами -
- индексов нет никаких и не должно быть, поскольку реально объект один.
  • 0

#2 Darkus

Darkus

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

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

Отправлено 22 октября 2009 - 03:43

Попробуйте метод Exists для объекта. Например, если по указанному пути метод возвращает для объекта true, значит это ваш объект, иначе перебором следующий берите...
Я сталкивался с тем, что было 2 одинаковых объекта, но наполнение у них разное было... Также через Exists смотрел "внутренности" полученного объекта и по результатам отработки функции "понимал", что именно за объект мне попался.
  • 0

#3 Dmitry N

Dmitry N

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

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

Отправлено 22 октября 2009 - 05:38

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

А Handle у этих объектов разный? Я встречал ситуации, когда в Delphi приложении были разные объекты с одинаковым именем.

А ещё у Delphi приложений есть особенность: пока объект не отобразился на экране в первый раз, он создан как-бы наполовину: для него не назначен handle и, соответственно, у него нет родительского окна. В результате, он может находится в дереве объектов в неправильном месте. Как только объект отрисовывается на экране, он сразу перепрыгивает на нужное место в дереве. Возможно, "глючный" объект в вашем случае как раз такой недосозданный объект.
  • 0
С уважением,
Дмитрий

#4 pozval

pozval

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Позняк Валерий Антонович

Отправлено 22 октября 2009 - 09:27

Попробуйте метод Exists для объекта. Например, если по указанному пути метод возвращает для объекта true, значит это ваш объект, иначе перебором следующий берите...
Я сталкивался с тем, что было 2 одинаковых объекта, но наполнение у них разное было... Также через Exists смотрел "внутренности" полученного объекта и по результатам отработки функции "понимал", что именно за объект мне попался.

путь объекта p1:=Sys.Process('PSO_DataInputClient').VCLObject('dlgLoginForm').VCLObject('dxLayoutControl1');
у обоих Exists=true
вопрос - как их перебирать в скрипте, а не в браузере?
  • 0

#5 pozval

pozval

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Позняк Валерий Антонович

Отправлено 22 октября 2009 - 09:29

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

А Handle у этих объектов разный? Я встречал ситуации, когда в Delphi приложении были разные объекты с одинаковым именем.

А ещё у Delphi приложений есть особенность: пока объект не отобразился на экране в первый раз, он создан как-бы наполовину: для него не назначен handle и, соответственно, у него нет родительского окна. В результате, он может находится в дереве объектов в неправильном месте. Как только объект отрисовывается на экране, он сразу перепрыгивает на нужное место в дереве. Возможно, "глючный" объект в вашем случае как раз такой недосозданный объект.

Handle у глючного отсутствует
  • 0

#6 Darkus

Darkus

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

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

Отправлено 22 октября 2009 - 09:37

Попробуйте метод Exists для объекта. Например, если по указанному пути метод возвращает для объекта true, значит это ваш объект, иначе перебором следующий берите...
Я сталкивался с тем, что было 2 одинаковых объекта, но наполнение у них разное было... Также через Exists смотрел "внутренности" полученного объекта и по результатам отработки функции "понимал", что именно за объект мне попался.

путь объекта p1:=Sys.Process('PSO_DataInputClient').VCLObject('dlgLoginForm').VCLObject('dxLayoutControl1');
у обоих Exists=true
вопрос - как их перебирать в скрипте, а не в браузере?

А у самих объектов содержимое одинаковое? Можно получить оба объекта в переменную, например p1, p2 - а дальше искать у них то, в чём они отличаются.. p1.control1.exists, p2.control1.exists...
Хотя ниже вы сами дали проще ответ "Handle у глючного отсутствует"
  • 0

#7 pozval

pozval

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Позняк Валерий Антонович

Отправлено 23 октября 2009 - 06:12

Всем большое спасибо.
Вопрос удалось успешно решить.
  • 0

#8 Darkus

Darkus

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

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

Отправлено 23 октября 2009 - 06:18

В общем то было бы неплохо выложить сюда решение, как думаете? :)
  • 0

#9 icetemper

icetemper

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

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

Отправлено 23 октября 2009 - 07:26

В общем то было бы неплохо выложить сюда решение, как думаете? :)

Присоединяюсь к вопросу, полезно будет.
  • 0

#10 pozval

pozval

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Позняк Валерий Антонович

Отправлено 26 октября 2009 - 14:55

вариант решения, основанный на разном количестве Child - у глюка их меньше
как бороться с объектами с Child=0 пока и сам не знаю, а такие тоже есть

// proc - родительский процесс
// name_object - имя дублированного объекта
// ChildCount - минимальное число детей
function FindObject(proc,name_object,ChildCount);
var
n1,z1;
begin
n1 := ['ObjectIdentifier', 'ChildCount'];
z1 := [name_object, ChildCount];
result := proc.FindChild(n1, z1, 10);

while ((not result.exists) and (ChildCount < 20)) do
begin
ChildCount:=ChildCount+1;
z1 := [name_object, ChildCount];
result := proc.FindChild(n1, z1, 10);
end;
end;

объект
Sys.Process('PSO_TemplateCreatorClient').VCLObject('MainForm').VCLObject('TemplatePageControl').VCLObject('TemplateListTabSheet').VCLObject('frTC_ViewTemplateList').VCLObject('dxLayoutControl1').VCLObject('TemplateListGrid').Window('TcxGridSite')

ветвление в 2 точках:
TemplatePageControl
dxLayoutControl1

p1 := Sys.Process('PSO_TemplateCreatorClient').VCLObject('MainForm');
p1:=FindObject(p1,'TemplatePageControl',3);

p1:=p1.VCLObject('TemplateListTabSheet').VCLObject('frTC_ViewTemplateList');
p1:=FindObject(p1,'dxLayoutControl1',1);
  • 0

#11 pozval

pozval

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Позняк Валерий Антонович

Отправлено 28 октября 2009 - 15:05

самым простым решением оказался возврат к TestComplete 7.0 там двойников нет
  • 0


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

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