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

Фотография

Обработка ComboBoxTree


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

#1 La-Li

La-Li

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

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

Отправлено 17 июня 2008 - 11:26

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

TestComplete 6, JScript
Впервые начала работу с ТС и сразу же столкнулась с нераспознаваемым контролом ComboBoxTree.
Схема работы программы такова:
1. Открывается ComboBoxTree
2. Выбирается "создать новый"
3. Создается новый сценарий
4. ComboBoxTree открывается еще раз
5. Нажимается "+" под вновь созданным сценарием
6. Из раскрывшегося дерева выбирается "создать новый"
7. Создается новый вариант развития в сценарии

Насколько я поняла, TC не видит ни элементов дерева, ни кнопок "+" и ориентируется только по координатам экрана. Так как после каждого созданного сценария список смещается и координаты меняются, воспроизвести скрипт не удается. А нужно именно создавать сценарии, а не выбирать уже существующие с неизменными координатами.

Подскажите пожалуйста, есть какой-то шанс с этим побороться?

В скрипте все это выглядит так, скриншот контрола прилагается:

function CreateBalticOil()
{
var p1;
var w1;
var w2;
p1 = Sys.Process("DocFlow");

p1.MainForm.WinFormsObject("_mainMenuStrip").ComboBoxTree.titleBar.Click(110, 13);
p1.TreeViewForm.mainPanel.panel.treeView.Click(72, 20);

w1 = p1.ScenarioTypeForm;
w2 = w1.comboBoxScenario;
w2.MouseWheel(-3);
w2.ClickItem("Разлив нефти");
w1.WinFormsObject("groupBox1").radioButtonDisk.ClickButton();
w1.buttonOK.ClickButton();
w1 = p1.ScenarioForm;
w1.panelScenarioControl.ScenarioControl.groupBoxName.textBoxName.Keys("BalticOil1");
w1.panelButtons.buttonOk.ClickButton();
w1 = p1.Window("#32770", "Открыть карту...");
w1.Window("SHELLDLL_DefView").Window("SysListView32", "FolderView").ClickItem("baltika.mxd", 0);
w1.Window("Button", "&Open").ClickButton();
}

function CreateBalticOilVR()
{
var p1;
var w1;
p1 = Sys.Process("DocFlow");
p1.MainForm.WinFormsObject("_mainMenuStrip").ComboBoxTree.titleBar.Click(111, 6);
w1 = p1.TreeViewForm.mainPanel.panel.treeView;
w1.Click(26, 183);
w1.Click(93, 202);
w1 = p1.CreateScenarioVersionForm;
w1.nameTextBox.Keys("BalticOilVR1");
w1.okButton.ClickButton();
p1.WinFormsObject("StartNewVariantDialog", "Начать новый вариант развития").WinFormsObject("Panel", "").WinFormsObject("Button", "ОК").ClickButton();
}
  • 0

#2 La-Li

La-Li

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

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

Отправлено 17 июня 2008 - 11:28

Скриншот почему-то не присоединяется, но вот здесь ComboBoxTree очень похожий контрол
  • 0

#3 AlexP

AlexP

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

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 17 июня 2008 - 12:57

Скриншот почему-то не присоединяется, но вот здесь ComboBoxTree очень похожий контрол


На чём написано приложение (открыто ли оно), какой контрол используется (лучше спросить у разработчиков)?

Подскажите пожалуйста, есть какой-то шанс с этим побороться?

Шанс есть почти всегда :) Скорее всего придётся работать через свойства и методы контрола...
  • 0

#4 La-Li

La-Li

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

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

Отправлено 17 июня 2008 - 15:06

Приложение написано на .NET 2.0, контрол самопальный, сделанный вручную из кусочков разных контролов.
Приложение, насколько я понимаю, закрыто. В связи с этим возникает вопрос - а как его скомпилировать как open application? Через какие-то особые настройки студии? К сожалению, я не совсем поняла, как это сделать, из соответствующего раздела справки. Если это сильно облегчит задачу, то можно попробовать попросить перекомпилировать.
  • 0

#5 AlexP

AlexP

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

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 17 июня 2008 - 15:12

Приложение написано на .NET 2.0, контрол самопальный, сделанный вручную из кусочков разных контролов.
Приложение, насколько я понимаю, закрыто. В связи с этим возникает вопрос - а как его скомпилировать как open application? Через какие-то особые настройки студии? К сожалению, я не совсем поняла, как это сделать, из соответствующего раздела справки. Если это сильно облегчит задачу, то можно попробовать попросить перекомпилировать.


Если .Net, то open. Для быстроты можно сюда выложить тестовый примерчик (пусть разработчики кинут на форму "самопальный" контрол с "фэйковыми" данными).
  • 0

#6 Dmitry N

Dmitry N

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

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

Отправлено 18 июня 2008 - 03:49

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

Приложение Open, это видно из скрипта (используется метод WinFormsObject). Объект, с которым надо "научится" работать - "Sys.Process("DocFlow").TreeViewForm.mainPanel.panel.treeView". Его тип можно узнать выведя в лог значение свойства ClrFullClassName.

Стандартный способ работы с кастомными контролами -- через их нативные свойства и методы. Так как они доступны в TestComplete, вам просто надо узнать у разработчиков как выполнять те или иные действия с контролом программно (попросить код C#) и использовать тот же метод в скрипте.

Так как контрол, скорее всего, динамически создаётся и "схлопывается", то в Object Browser его, вероятно, не найдешь, чтобы посмотреть доступные свойства и методы. Однако, это можно сделать с помощью Finder tool следующим образом:
  • Откройте окно Object Properties (есть кнопка на тулбаре и пункт в контекстном меню Object Browser'а).
  • Правой кнопкой щелкните где-нибудь внутри окна и выберите 'Properties' чтобы открыть диалог настроек.
  • В настройках отключите опцию 'Capture mouse' (кажется так) и закройте диалог.
  • В приложении раскройте комбо бокс, чтобы стало видно дерево. Наведите указатель мыши на дерево и дождитесь, пока в Object Properties не появятся свойства нужного контрола.
  • Нажмите Ctrl-Shift-A для фиксации выбранного объекта в Object Properties.
Всё, теперь даже если дерево с экрана пропадёт, информация о нём останется в Object Properties и вы сможете посмотреть какие свойства и методы есть у этого контрола.
  • 0
С уважением,
Дмитрий

#7 Kurliana

Kurliana

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

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

Отправлено 18 июня 2008 - 07:39

Может я не очень разобрался в сути вопроса..но в Rational были похожие вещи и они решались следующим образом:
На объект действовали методом Keys и затем выбор соответствующего подменю осуществлялся кнопками Down и Spase(в скрипте просто пробел).
Этот метод позволял не зависеть от размеров окна, разрешения и т.д.
P.s. я до сих пор делаю выбор из ниспадающих меню таким методом..если кто подскажет более хороший способ - велком!
Поправлюсь...это если ClickItem нет.
  • 0

#8 AlexP

AlexP

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

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 18 июня 2008 - 08:06

...На объект действовали методом Keys и затем выбор соответствующего подменю осуществлялся кнопками Down и Spase(в скрипте просто пробел).
Этот метод позволял не зависеть от размеров окна, разрешения и т.д.


Ваш вариант - возможный workaround, но:

...Так как после каждого созданного сценария список смещается и координаты меняются...


А это значит, что если нужный элемент не первый в списке\дереве, то число "Down" будет увеличиваться\уменьшаться. Следовательно, нужно определять, какой элемент сейчас выбран (после каждого "Down"). Опять же, мы приходим к работе через свойства и методы...
  • 0

#9 La-Li

La-Li

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

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

Отправлено 18 июня 2008 - 10:27

Спасибо за столь подробное объяснение, как отловить этот контрол - мне наивно казалось, что это в корне невозможно, потому что он закрывался каждый раз, когда я пыталась подвести к нему мышку.

Объект, с которым надо "научится" работать - "Sys.Process("DocFlow").TreeViewForm.mainPanel.panel.treeView". Его тип можно узнать выведя в лог значение свойства ClrFullClassName.

Оказывается, ClrFullClassName = Crownwood.DotNetMagic.Controls.TreeControl, взят отсюда. Не
совсем понятно с методами: нужно использовать те, которые находятся на закладке "Methods"->.NET, те, которые я найду непосредственно в коде, или первые уже включают в себя вторые (если приложение открыто?)? Код у меня появится ближе к концу дня, но вот например там есть метод SetNode(...). Как мне заставить скрипт выполнить его?

Форма с контролом по техническим причинам будет чуть позже.
  • 0

#10 Dmitry N

Dmitry N

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

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

Отправлено 18 июня 2008 - 11:02

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

Посмотрите здесь. Там есть пример скрипта для (возможно) вашего контрола.
  • 0
С уважением,
Дмитрий

#11 La-Li

La-Li

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

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

Отправлено 18 июня 2008 - 14:40

Уррра)!
Работает, кликает, жизнь просто прекрасна)!
Большое спасибо)
  • 0


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

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