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

Фотография

TestComplete + Ingragistics TollBars


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

#1 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 31 января 2007 - 11:15

Всем привет,

Хотела начать автоматацию тестирования своего приложения и сразу же столкнулась с проблемой - в приложении используется Ingragistics Tollbars, внутри которого расположено меню. TestComplete не определяет пункты меню, при записи скрипта просто записывает клики по координатам для объекта WinFormsObject("_FormMain_Toolbars_Dock_Area_Top").
Object Browser показывает огромное количество методов и свойств для этого тулбара, какие именно нужны для доступа к пунктам меню, мне непонятно.

Возможно, у кого-нибудь есть опыт работы в TestComplete с Infragistics Toolbars (точнее это Infragistics2.Win.UltraWinToolbars)? Подскажите как к нему подступиться. Использую TestComplete4.
  • 0

#2 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 31 января 2007 - 11:29

Infragistic контролы могут меняться от вресии к версии.

В любом случае:
1) В ТестКомплите 5 есть встроенная функциональность для работы с главным меню
2) Кроме меню есть много других чудных контролов, с которыми Вы столкнетесь, так что лучше начинайте разбираться с их внутренней логикой

Вот пример функции, которая используется у меня для выбора пункта из главного меню. Скорее всего она не заработает, но поможет сориетироваться.

//[TestComplete JScript]==============================
// Function:    SelectMainMenu
// Description: selects a menu item from Infragistic Main menu
// Parameters:
//  -pProcess  - process of the application
//  -oMenu     - main menu, object
//  -sMenuItem - menu item to select, string 
// Return: <none>
// NOTES: menu items should be splitted with "|" symbol, e.g. "File|Options", "Administration|Edit|Account Roles" 

function SelectMainMenu(pProcess, oMenu, sMenuItem)
{
  var aMenu = sMenuItem.split("|");
  var i, j; // counter
  var iX = 0, iY = 0; // coordinates for clicking
  var iCount; // menu items count for each toolbar/popup menu
  var obj; // temporary object for different menuitems
  var iLevels = aMenu.length-1;
  
  // * * * Selecting top level menu item...
  iCount = oMenu.ToolbarsManager.Toolbars.Item(0).Tools.Count; // number of menu items in main menu
  for(i = 0; i < iCount; i++)
  {
    obj = oMenu.ToolbarsManager.Toolbars.Item(0).Tools.Item(i);
    Log.Message("Checking menu '" + obj.CaptionResolved.OleValue + "'");
    if(obj.CaptionResolved.OleValue.match(aMenu[0]))
    {
      oMenu.Click(iX + obj.WidthResolved/2, iY + obj.Height/2);
      break;
    }
    else
    {
      iX += obj.WidthResolved*obj.VisibleResolved;
    }
  }
  
  // * * * After top level menu selected selecting other menus...
  //for(j = iLevels; j > 0; j--)
  for(j = 1; j <= iLevels; j++)
  {
  iX = 0; iY = 0;
  obj = pProcess.WinFormsObject("DropDownForm", "", 1).WinFormsObject("PopupMenuControlTrusted", "");
  iCount = obj.MenuAgent.MenuItems.Count;
  for(i = 0; i < iCount; i++)
  {
    Log.Message("Checking menu item '" + obj.MenuAgent.MenuItems.Item(i).Text.OleValue + "'");
    if(StrTran (obj.MenuAgent.MenuItems.Item(i).Text.OleValue, "&", "").match(aMenu[j]))
    {
      obj.Click(iX + 10, iY + 10);
      break;
    }
    else
    {
      iY += 25;
    }
  }
  } // j= iLevels...
}

здесь используется функция StrTran, вот она:
function StrTran(sString, sSearch, sReplace)
{
  while(sString.search(sSearch) != -1)
    sString = sString.replace(sSearch, sReplace);
  return sString;
}

пример вызова функции:

SelectMainMenu(Sys.Process("MyProcess"), Sys.Process(...).WinFormsObject("_FormMain_Toolbars_Dock_Area_Top), "File|Help|About")

символы "&" игнорируются, то есть не надо писать типа "&File|&Help|A&bout"

Расскажите потом, чем закончились пробы, плз, очень самому интересно =)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#3 AlexP

AlexP

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

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

Отправлено 31 января 2007 - 11:41

...TestComplete не определяет пункты меню, при записи скрипта просто записывает клики по координатам для объекта WinFormsObject...

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


Здравствуйте!
Гляньте вот этот топик: http://forums.softwa...?showtopic=7479 Проблема, как я понял, схожая.
  • 0

#4 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 31 января 2007 - 11:46

чем же схожая?
там делфи-приложение, тут - Ingragistic controls (скорее всего C#, но это не должно иметь значение)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#5 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 31 января 2007 - 11:58

Genka, спасибо огромное, я даже не ожидала такого быстрого ответа :) Буду разбираться. Да, приложение действительно написано на С#.
  • 0

#6 AlexP

AlexP

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

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

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

чем же схожая?
там делфи-приложение, тут - Ingragistic controls (скорее всего C#, но это не должно иметь значение)

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


Многие советы, которые были даны в той ветке не завязаны на определённый язык ;)
  • 0

#7 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


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

ну в общем-то да, но советы насчет привязки к битмапам не слишком хороши для .NET приложений: все свойства и методы видны, только иногда трудно разобраться, что как работает (например, вот на эту функцию я в свое время потратил целый день, но это оказалось самой сложной задачей по Инфраджистику, если честно)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#8 AlexP

AlexP

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

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

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

но советы насчет привязки к битмапам не слишком хороши для .NET приложений: все свойства и методы видны, только иногда трудно разобраться, что как работает

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


Я абсолютно согласен и сам очень активно использую методы и свойства, но я знаю C#, использую “сторонние” контролы. И то, иногда встречаются такие экземпляры (например, контрол стороннего производителя, который был изрядно "усовершенствован" нашим программером), что впору за голову хвататься. Как ты уже заметил, "иногда трудно разобраться, что как работает", а сроки поджимают (в IT сфере по-другому и быть не может). Вот в такие минуты не стоит забывать про примитивные, но весьма быстрые варианты решения проблем.
  • 0

#9 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


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

Оно работает!!! Спасибо, Genka! Невероятно! :acute:

Но появилась новая проблема - оказалось, что и дерево у меня тоже Infragistics :( Не хочу показаться не скромной, но может быть у Вас есть что-нибудь по теме Infragistics UltraWinTree?
  • 0

#10 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


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

AlexP, подпишусь под каждым словом :)
полностью согласен и сам так делаю :)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#11 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 31 января 2007 - 14:01

Но появилась новая проблема - оказалось, что и дерево у меня тоже Infragistics :( Не хочу показаться не скромной, но может быть у Вас есть что-нибудь по теме Infragistics UltraWinTree?


есть :)

//================================================================================
// Function:    TreeSelect
// Description: selects an item in Infragistic tree view
// Parameters:
//  -tree - tree view, object
//  -item - item in the tree, string
// Return: true if an item selected, false if one of the tree items not found
// NOTES:
//  1) tree item should be separated with symbol "|"
//  2) any item shouldn't exactly match to tree item
//     e.g. TreeSelect(objTree, "Indices") will select item "Indices(62)", "Indices (33)", etc.
function TreeSelect (tree, item) // "Node1|Node2"
{
  var i, j;
  var node = tree; // current Node
  var aNodes = item.split("|");
  var iHeight = tree.AverageNodeHeight;
  var iX = 22, iY = iHeight/2; // X, Y-coordinates to perform click
  var iDeltaX = 20, iDeltaY = tree.AverageNodeHeight;
  var bVal = false;
  var bCollapsed = true;
  
  try
  {
    tree.CollapseAll();
  }
  catch(e)
  {
    Log.Message("Exception: " + e);
    bCollapsed = false;
  }
  for(i = 0; i < aNodes.length; i++)
  {
    iX += iDeltaX;
    for(j = 0; j < node.Nodes.Count; j++)
    {
      Log.Message("Comparing item '" + node.Nodes.Item(j).Text.OleValue + "' with value '" + aNodes[i] + "'");
      if(node.Nodes.Item(j).Text.OleValue.match(aNodes[i]))
      {
        //node.Nodes.Item(j).Selected = true; // this type of selection could not be used because in this case
                                              // event OnClick (or smth. like this) not happens and information
                                              // which depends on events in tree view will not be updated
        tree.Click(iX, iY); // selecting item
        node.Nodes.Item(j).Expanded = true; // expanding item
        node = node.Nodes.Item(j);
        bVal = true;
        break;
      }
      else if (i > 1 && !bCollapsed) // skip higest element
      {
        node.Expanded = false;
      }
      iY += iDeltaY;
    }
    if(!bVal)
      {
        Log.Error("TreeSelect: item '" + aNodes[i] + "' not found in tree view");
        return false;
      }
    bVal = false;
    iY += iDeltaY;
  }
  return true;
}

тут есть два момента:
1) если дерево большое и имеет скроллы, то, скорее всего, функция не сработает (сам пока с таким не сталкивался, потому смысла переписывать функцию не было)
2) сейчас уже точно не помню, но какой-то код был добавлен для специфичного treeview, т.е. часть этого кода будем вам просто бесполезна. Разбираться, что именно там не надо, нету времени, если честно. Но этот лишний код не влияет на работу со "стандартными" Infragistic tree view

Ну и еще: скоро выяснится, что у Вас еще есть тулбары, гриды и т.п.
Рекомендую сначала изучить приведенные примеры и попытаться написать свои функции, прежде чем просить выложить готовое. Вам же полезнее ;)

В качестве небольшой консультации вот вам пример: если в контроле есть дочерние элементы (например, кнопки на тулбаре), то процесс поиска нужных дочерних обектов должен выглядеть примерно так (поясняю на примере тулбаров с кнопками):

1) в Object Browser находите контрол вернего уровня (в нашем случае сам тулбар)
2) пытаетесь найти среди его пропертей хоть какую-то пропертю, в которой есть упоминание о ваших кнопках (например текст одной из них)
3) скорее всего п.2 не срабатывает. Это значит, что кнопки являются частью другой проперти. Ищете проперти, чьи значения равны "IDispatch" и чьи названия похожи на то, что вы ищете (т.е. ясно, что пропертя DisabledColor - ну явно не подходит, просто пропускаете ее и ищете дальше). Дважды кликаете по проперте, которая вам кажется подходящей и смотрите её внутренние проперти. В конце концов вы наткнетесь на пропертю ToolbarsManager.
4) В ТулбарсМанагере вы найдете пропертю Toolbars, а уж в ней - пропертю Item, возле которой есть кнопочка Params
5) Задаете параметр (например, 0 для первого тулбара), повторяете дабл клик и снова смотрите проперти. Находите пропертю Tools... А в ней опять Item[Param]

а уж внутри этого второго Item[Params] и прячутся кнопки, до которых вы так хотели достучаться...

Процесс несколько трудоемкий, но привыкнуть можно :)))

...Ну и опять-таки, скажите потом, сработало или нет. Хорошо, что с меню всё заработало, радует :)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#12 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 31 января 2007 - 16:02

Еще раз спасибо, Genka, дерево тоже заработало! :acute:
Вы мой спаситель! И кажется, я нашла что там было лишнее:

     else if (i > 1 && !bCollapsed) // skip higest element
     {
       node.Expanded = false;
     }

Если node попадает за пределы окна и требует скроллинга, скрипт действительно не срабатывает.

Спасибо за подробное объяснение того, как искать Properties в TestComplete. Я так и делала. Но их там так много! Не знаешь за что браться! Ведь там кроме пропертей еще есть и методы, и я пробовала методы Child(), get_Controls(), GetChildWindows(). А надо было использовать ToolbarsManager. Кроме того, я бы не догадалась делать клики по координатам. Числа iX = 22, iDeltaX = 20 для дерева - откуда они взяты, это постоянные величины?
  • 0

#13 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 01 февраля 2007 - 09:37

Учитывая популярностьInfragistic контролов я решил написать несколько статей по наиболее часто используемым из них. Надеюсь, хватит терпения и найдется достаточно времени.

Писать, скорее всего, буду на нглийском, и выкладывать на сайте AQA Community (если, конечно, саппорт тима зааппрувит). Ибо слишком много вопросов по этим контролам, причем повсюду...

Кроме того, я бы не догадалась делать клики по координатам


на самом деле это нужно не всегда. Для активации нужного элемента дерева достаточно воспользоваться методом set_Selected. То есть вместо
tree.Click(iX, iY);

можно написать
node.Nodes.Item(j).set_Selected(true)

Чем это хорошо: в этом случае не надо заморачиваться с рассчетом координат каждого нода и выбор нужного элемента будет произведен независимо от того, находится ли он в пределах видимости или за ними.

Но есть тут одно НО: если в приложении для этого дерева обрабатывается событие AfterSelect, то при использовании метода set_Selected это событие не произойдет и программа будет работать неправильно.
Например, в программе при выборе нода обновляется информация для других контролов.

Числа iX = 22, iDeltaX = 20 для дерева - откуда они взяты, это постоянные величины?


Это именно то, чего делать не рекомендуется :)))))))))
iX = 22 - это смещение собственно элемента дерева (первого), это та самая область, в которой находится крестик, по которому щелкают, чтобы нод раскрылся

iDeltaX = 20 - это смещение каждого следующего нода (второй уровень и глубже), те самые крестики

Что плохо: что эти числа захардкоджены :( . Но у меня не было времени особо заморачиваться с ними и искать, где они спрятаны.

Числа получены эмпирическим путем (короче, методом тыка)

И еще: спасибо Вам за фидбэк, теперь я знаю, что работает оно не только у меня... =)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#14 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 01 февраля 2007 - 10:00

Спасибо, Genka, Вы так подробно отвечаете.
У меня остался последний вопрос, по поводу строки:

obj = pProcess.WinFormsObject("DropDownForm", "", 1).WinFormsObject("PopupMenuControlTrusted", "");

Откуда узнать, что есть такие объекты DropDownForm и PopupMenuControlTrusted?
Я вижу, что у процесса есть метод WinFormsObject, но названия таких объектов нигде не прописаны.
  • 0

#15 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 01 февраля 2007 - 12:38

Genka, Вы так подробно отвечаете


Я сам пока только учу ТестКомплит, потому объясняя что-то сам начинаю понимать лучше :acute:

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

Откуда узнать, что есть такие объекты DropDownForm и PopupMenuControlTrusted?
Я вижу, что у процесса есть метод WinFormsObject, но названия таких объектов нигде не прописаны


да, вы их и не увидите в ОБджект Браузере. Выше я уже упоминал, что работа с меню - самое сложное, что я встречал на данный момент. Сюда же можно отнести и работу с Popup menu.

DropDownForm и PopupMenuControlTrusted появляются только в момент клика по меню и исчезают, если вы переключите задачу на ТестКомплит. Чтобы понять, как с ними работать, надо:

1) Записать скрипт методами ТестКомплита и посмотреть, с какими объектами он имеет дело при первом и втором кликах мышью.
2) Для просмотра свойств и методов этого контрола стандартными средствами не обойтись. Потому в записанном скрипте оставляем только тот код, который делает первый клик по меню. Если запустить этот скрипт, то он остановится нажав на пункте меню. Меню останется раскрытым.
Далее используется один из методов BuiltIn.EnumProperties, BuiltIn.EnumMethods или BuiltIn.EnumEvents (в зависимости от того, что вам нужно), в качестве параметра передаем тот объект, с которым при записи скрипта работал ТестКомплит при втором щелчке (в данном случае это WinFormsObject("DropDownForm", "", 1).WinFormsObject("PopupMenuControlTrusted", "")) и дописываем тот первый скрипт, в котором мы оставили только первый клик мышью, добавляя проход по пропертям и выводя их имена и значения. Вот пример цикла для вывода пропертей и их значений:

// [TestComplete JScript]
properties = BuiltIn.EnumProperties(object, true);
  while(properties.HasNext())
  {
    try
    {
      prop = properties.Next();
      if(typeof(BuiltIn.GetValue(object, prop.Name)) == "object")
      {
        //GetPropertiesTree(object.prop.Name);
        Log.Warning(prop.Name + ": IDispatch");
      }
      else
      {
        Log.Message(prop.Name + "='" + BuiltIn.GetValue(object, prop.Name) + "'");
      }
    }
    catch(e)
    {
      Log.Error("Exception during processing property '" + prop.Name + "':\n" + e.desription);
    }
  }

фуф... пора выпить чаю =)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#16 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


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

и еще: вот эта функция для работы с tree view - не очень хорошая
лучше не пересчитывать координаты каждый раз, а воспользоваться свойством Bounds

но сил на описание уже нет =)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#17 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


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

Эх, посмотреть, что пишет TestComplete на второй клик, я сама и не догадалась :) А скрипт, который определяет проперти, вообще неоценимый. Спасибо!
Я только начала работать в TestComplete, все это очень полезно. И буду рада почитать Ваши статьи про Ingragistics.
  • 0

#18 Ksenia

Ksenia

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 01 февраля 2007 - 14:13

Насчет координат в Tree да, мне это сразу не очень понравилось. Буду переписывать функцию, но сначала мне нужно в очень короткий срок заавтоматизировать приложение...
  • 0

#19 Genka

Genka

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

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 02 февраля 2007 - 10:05

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

В том посте, где я говорил о событии AfterSelect, я ошибся.
На самом деле при использовании метода set_Selected это событие происходит. Но при этом не изменяется свойство ActiveNode.
Тут надо отметить, что у Инфраджистик дерева может быть выбрано несколько нодов одновременно, но только один из них может быть активным.

Поэтому если в приложении при обработке события AfterSelect (или другом событии) используется свойство ActiveNode, то приложение будет работать с неправильным нодом.
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#20 Dmitry N

Dmitry N

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

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

Отправлено 04 февраля 2007 - 10:39

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

Позвольте вклиниться в ваш разговор и добавить пару комментариев. :)

To Genka:

DropDownForm и PopupMenuControlTrusted появляются только в момент клика по меню и исчезают, если вы переключите задачу на ТестКомплит. Чтобы понять, как с ними работать, надо:

Есть такая замечательная фича в ТС - Finder Tool. Он находится на окошке Object Properties которое можно открыть из контекстного меню Object Browser. Так вот, если Finder Tool перетащить на какой-нибудь оконный объект, то вы увидите свойства и методы этого объекта в окне Object Properties. При нажатии кнопки 'Highlight object in the Object Tree', откроется Object Browser с выделенным искомым объектом.
Так как Finder Tool надо перетаскивать на нужный объект, казалось бы использовать эту фичу для "отлова" динамических окон типа контекстного меню невозможно. Однако, если кликнуть на окне Object Properties правой кнопкой, выбрать элемент меню Panel Options и снять галку с опции Capture Mouse, то Finder Tool преображается. Теперь его не надо перетаскивать на объект - теперь вы видите свойства того объекта, который находится под курсором в данный момент. Для того, чтобы "зафиксировать" выбранный объект, надо нажать Shift-Ctrl-A. Если даже выбранное окно закроется, вы все равно сможете посмотреть на его свойства и методы.

To Ksenia:

Если node попадает за пределы окна и требует скроллинга, скрипт действительно не срабатывает.

Вам поможет метод ноды 'BringIntoView'. Вот вариант скрипта, которым пользуюсь я (JScript):
function Test()
{
  var p = Sys.Process("MyApp");
  var form = p.WinFormsObject("Form1");
  var tree = form.WinFormsObject("ultraTree1");
  var path = "Node|SubNode|OneMoreSubNode";
  
  form.Activate();
  ClickTreeNode(tree, path);
}

function ClickTreeNode(tree, path)
{
  var nodes = path.split("|");
  var parentNode = tree;
  var node = null;
  for (var i = 0; i < nodes.length; i++) {
    node = GetTreeNode(parentNode, nodes[i]);
    if (node == null) {
      Log.Error("The '" + nodes[i] + "' node is not found");
      return;
    }
    
    node.BringIntoView();
    if (i < (nodes.length - 1)) {
      node.Expanded = true;
      parentNode = node;
    }
    else {
      // Click node
      var x = tree.ScreenLeft + node.Bounds.Left + node.Bounds.Width / 2;
      var y = tree.ScreenTop + node.Bounds.Top + node.Bounds.Height / 2;
      Sys.Desktop.MouseDown(VK_LBUTTON, x, y);
      Sys.Desktop.MouseUp(VK_LBUTTON, x, y);
    }
  }
  
  Log.Event("The '" + path + "' node is clicked");
}

function GetTreeNode(parentNode, nodeName)
{
  var node = null;
  for (var i = 0; i < parentNode.Nodes.Count; i++) {
    node = parentNode.Nodes.Item(i);
    if  (node.Text == nodeName) {
      return node;
    } 
  }
  return null;
}

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


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

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