DevExpress ListTree Control
#1
Отправлено 06 ноября 2007 - 10:30
Есть на форме DevExpress ListTree control. В нем два объекта типа CheckBox (т.е. я могу галку поставить :))) )...но в ObjectBrowser показывются как :
["WinFormsObject"]("VTLScrollBar", "", 1)
["WinFormsObject"]("HTLScrollBar", "", 1).
Я хочу по очереди делать Check/Uncheck этих двух объектов. Делаю так :
w3 = w2["WinFormsObject"]("MemberListTreeControl", "", 2);
while (w3["HasChildren"]) {
w3["Select"]();
w3["NodesIterator"]["GetNextVisible"](w3["Nodes"]);
}
проблема в том что у объeктов Nodes нету метода Click. А у родительского объекта TreeList нету ничего типа Child или Items. Может надо по другому делать ?
#2
Отправлено 06 ноября 2007 - 10:44
проблема в том что у объeктов Nodes нету метода Click. А у родительского объекта TreeList нету ничего типа Child или Items. Может надо по другому делать ?
скорее всего вам надо взять координаты нужного Node и сделать Click для всего treeList, но в конкретных координатах.
Чтобы узнать координаты Node'a попробуйте посмотреть его свойсвтво AccessibilityObject.Bounds. Если не
Если там все параметры равны нулю, то попробуйте посмотреть свойство UIElement.Bounds.
Если и это не подойдет, попробуйте посмотреть свойство AccessibilityObject для всего treeList, в нем может быть коллекция типа Items, а там уже надо смотреть внимательно
ЗЫ это лишь теоретические рассуждения, основанные на работе с Инфраджистиками, но может поможет
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#3
Отправлено 06 ноября 2007 - 11:14
проблема в том что у объeктов Nodes нету метода Click. А у родительского объекта TreeList нету ничего типа Child или Items. Может надо по другому делать ?
скорее всего вам надо взять координаты нужного Node и сделать Click для всего treeList, но в конкретных координатах.
Чтобы узнать координаты Node'a попробуйте посмотреть его свойсвтво AccessibilityObject.Bounds. Если не
Если там все параметры равны нулю, то попробуйте посмотреть свойство UIElement.Bounds.
Если и это не подойдет, попробуйте посмотреть свойство AccessibilityObject для всего treeList, в нем может быть коллекция типа Items, а там уже надо смотреть внимательно
ЗЫ это лишь теоретические рассуждения, основанные на работе с Инфраджистиками, но может поможет
В AccessibilityObject.Bounds все по нулям, UIElement вообще нету, а в treeList нету Коллекции типа Items. =((
#4
Отправлено 06 ноября 2007 - 12:43
В AccessibilityObject.Bounds все по нулям, UIElement вообще нету, а в treeList нету Коллекции типа Items. =((
в общем, посмотрел я этот ТрииЛист. Конечно, работать с ДевЭкспрессовскими контролами просто ужасно по сравнению с Инфраджистиками. Но проблему вашу я решил.
Прежде всего, необходимо понять, как этот контрол устроен. Есть Nodes, но в каждом из Nodes есть колонки. Ваш чекбокс, который надо включать/выключать - это отдельная колонка в триЛистее. К сожалению, я не нашел способа, как можно посмотреть в Object Browser'e значение конкретного Noda и конкретной колонки. Поэтому вот вам алгоритм.
1) узнать номер колонки, в которой находится чекбокс. Для этого в первой строке триЛиста включите галочку и выполните вот такой вот код
Log.Message(treeList.Nodes.Item(0).GetValue(5));
Здесь 0 - это номер ноды, 5 - номер колонки. Вам вместо 5 надо подставлять значения 0, 1, ..., n , пока в логе вам не выведется Checked. Вы нашли номер колонки, в которой находятся чекбоксы.
Теперь для того, чтобы в какой-то ноде включить/выключить этот чекбокс, достаточно выполнить код
treeList.Nodes.Item(1).SetValue(5, 0);
здесь:
1 - номер ноды
5 - номер колонки (которую вы нашли перед этим)
0 - состояние чекбокса (0 - выключено, 1 - включено)
Конечно, можно было оформить это в виде красивого кода, но думаю, что вы разберетесь. Тем более, что сделать осталось немного :)
Если что, я тренировался на примере, который поставляется с эвалюэйшн версией ДевЭкспресса, раздел Explorer. Вот пример кода, который у меня работает
function Test17() { Sys.Process("TreeListMainDemo").WinFormsObject("frmMain").Activate(); var treeList = Sys.Process("TreeListMainDemo").WinFormsObject("frmMain").WinFormsObject("treeList1"); Log.Message(treeList.Nodes.Item(0).GetValue(5)); Log.Message(treeList.Nodes.Item(1).GetValue(5)); treeList.Nodes.Item(1).SetValue(5, 0); BuiltIn.Delay(2000); treeList.Nodes.Item(1).SetValue(5, 1); }
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#5
Отправлено 06 ноября 2007 - 13:44
В AccessibilityObject.Bounds все по нулям, UIElement вообще нету, а в treeList нету Коллекции типа Items. =((
1) узнать номер колонки, в которой находится чекбокс. Для этого в первой строке триЛиста включите галочку и выполните вот такой вот кодLog.Message(treeList.Nodes.Item(0).GetValue(5));
Здесь 0 - это номер ноды, 5 - номер колонки. Вам вместо 5 надо подставлять значения 0, 1, ..., n , пока в логе вам не выведется Checked. Вы нашли номер колонки, в которой находятся чекбоксы.
Теперь для того, чтобы в какой-то ноде включить/выключить этот чекбокс, достаточно выполнить кодtreeList.Nodes.Item(1).SetValue(5, 0);
здесь:
1 - номер ноды
5 - номер колонки (которую вы нашли перед этим)
0 - состояние чекбокса (0 - выключено, 1 - включено)
Конечно, можно было оформить это в виде красивого кода, но думаю, что вы разберетесь. Тем более, что сделать осталось немного :)
Огромное Спасибо, что помогаете разобраться в этом !!! Но у меня чего-то не получилось узнать номер колонки...сделал так :
w3 = w2["WinFormsObject"]("MemberListTreeControl", "", 2); for (var i = 0; i < 100; i++ ) { Log.Message(w3["Nodes"]["Item"](1).GetValue(i)); }
для Item(1) и Item(0). У меня в Логе все пустые строки...т.е. Value никакого не ставиться, хотя в CheckBoxe галку поставил:( Может быть так что номер колонки больше чем 100 ? Вообще логики не понимаю, зачем так нумеровать ?
#6
Отправлено 06 ноября 2007 - 13:54
для Item(1) и Item(0). У меня в Логе все пустые строки...т.е. Value никакого не ставиться, хотя в CheckBoxe галку поставил:( Может быть так что номер колонки больше чем 100 ? Вообще логики не понимаю, зачем так нумеровать ?
колонок может быть сколько угодно, но это вы можете проверить лекго, посмотрев свойство Columns.Count
и еще можно попробовать вот так
Log.Message(w3["Nodes"]["Item"](1).GetValue(i).OleValue)
только оберните эту команду в try...catch
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#7
Отправлено 06 ноября 2007 - 14:18
для Item(1) и Item(0). У меня в Логе все пустые строки...т.е. Value никакого не ставиться, хотя в CheckBoxe галку поставил:( Может быть так что номер колонки больше чем 100 ? Вообще логики не понимаю, зачем так нумеровать ?
колонок может быть сколько угодно, но это вы можете проверить лекго, посмотрев свойство Columns.Count
и еще можно попробовать вот так
Log.Message(w3["Nodes"]["Item"](1).GetValue(i).OleValue)
только оберните эту команду в try...catch
неа..ловится exception что объект либо null либо его нет. Странно то, что Сolumns.COunt у меня две, так и должно быть, но почему тогда не ловится что CheckBox выделен ?!
Я смог добраться через ObjectBrowser до свойства с текстом который около CheckBox должен писаться, но как добится того чтобы CheckBox заработал не знаю. Я даже так попробовал :
Log.Message(w3["Nodes"]["FirstNode"]["GetValue"](i)); все равно пустые строчки..ничего про статус Checked
#8
Отправлено 06 ноября 2007 - 15:00
Log.Message(w3["Columns"]["Item_2"](0).FieldName.OleValue); (именно Item_2!! )
он выводит имена филдов. Т.е. я вижу как называется колонка и по идее я должен тогда знать ее номер. В данном случае "0"
Далее : w3["Nodes"]["Item"](0).SetValue(0, 0); //судя по тому что колонка нулевая и надо выключить CheckBox, то SetValue (0 , 0); и ничего не изменяется.
НО, я делаю это от элемента Item, а не от Item_2. У Item_2 нету метода SetValue.
#9
Отправлено 06 ноября 2007 - 15:42
А вообще, попросите разработчиков написать небольшое тестовое приложение с Вашим контролом и выложите его здесь!
#10
Отправлено 06 ноября 2007 - 15:47
Напишите имя класса контрола (выберите дерево и гляньте свойство "ClrFullClassName").
А вообще, попросите разработчиков написать небольшое тестовое приложение с Вашим контролом и выложите его здесь!
ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
#11
Отправлено 06 ноября 2007 - 15:53
ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
А "ProductName" и "ProductVersion"?
#12
Отправлено 06 ноября 2007 - 16:03
ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
А "ProductName"?
MyProduct. А как это может влиять на проблему ?
#13
Отправлено 06 ноября 2007 - 16:16
MyProduct. А как это может влиять на проблему ?
Просто хотелось узнать, какой именно DevExpress'овский контрол используется (для написания тестовой формы).
#14
Отправлено 06 ноября 2007 - 16:17
MyProduct. А как это может влиять на проблему ?
Просто хотелось узнать, какой именно DevExpress'овский контрол используется (для написания тестовой формы).
ну так обычный XtraTreeList control. Он у них помоему один с treeList.
#15
Отправлено 06 ноября 2007 - 16:25
ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
..........
ну так обычный XtraTreeList control. Он у них помоему один с treeList.
то ли тут играет роль версия ДевЭкспресса, то ли одно из двух
потому что у меня
ClrFullClassName = DevExpress.XtraTreeList.TreeList
Dev.Express v.6.3
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#16
Отправлено 06 ноября 2007 - 16:29
ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
..........
ну так обычный XtraTreeList control. Он у них помоему один с treeList.
то ли тут играет роль версия ДевЭкспресса, то ли одно из двух
потому что у меня
ClrFullClassName = DevExpress.XtraTreeList.TreeList
Dev.Express v.6.3
Т.е. у вас после строчек типа :
w3["Nodes"]["Item"](0)["SetValue"](0, 1);
w3["Nodes"]["Item"](1)["SetValue"](0, 1);
если запустить скрипт автоматически, CheckBox' ы отмечаются ?
Какая разница использую я их контрол в их сборке, или вставляю его в свой какой-то класс. Свойства же его я не меняю.
#17
Отправлено 06 ноября 2007 - 16:57
Т.е. у вас после строчек типа :
w3["Nodes"]["Item"](0)["SetValue"](0, 1);
w3["Nodes"]["Item"](1)["SetValue"](0, 1);
если запустить скрипт автоматически, CheckBox' ы отмечаются ?
Какая разница использую я их контрол в их сборке, или вставляю его в свой какой-то класс. Свойства же его я не меняю.
конечно. Отмечаются и отключаются, как и положено
если бы не отмечались, я бы не стал писать
;)Вот пример кода, который у меня работает
а насчет классов... попробуйте (если есть возможность) проверить этот код с простым приложением и простым контролом. Если заработает - значит класс, который наследуется от treeList и используется в вашем приложении, что-то перекрывает/перегружает. Методы какие-то.
Ну или версии у нас разные и в вашей версии работа с этим контролом должна делаться как-то иначе
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#18
Отправлено 06 ноября 2007 - 17:23
Т.е. у вас после строчек типа :
w3["Nodes"]["Item"](0)["SetValue"](0, 1);
w3["Nodes"]["Item"](1)["SetValue"](0, 1);
если запустить скрипт автоматически, CheckBox' ы отмечаются ?
Какая разница использую я их контрол в их сборке, или вставляю его в свой какой-то класс. Свойства же его я не меняю.
конечно. Отмечаются и отключаются, как и положено
если бы не отмечались, я бы не стал писать;)Вот пример кода, который у меня работает
а насчет классов... попробуйте (если есть возможность) проверить этот код с простым приложением и простым контролом. Если заработает - значит класс, который наследуется от treeList и используется в вашем приложении, что-то перекрывает/перегружает. Методы какие-то.
Ну или версии у нас разные и в вашей версии работа с этим контролом должна делаться как-то иначе
Спасиб еще раз за дискуссию...я провел еще один экспиримент. Сохранил свойства объекта своего (целой формы), а потом записал скрипт где отмечаю CheckBox один, а второй наоборот снимаю галку. И в конце сравниваю два объекта...кароче TC говорит, что они одинаковые. Т.е. он не видит получается этих CheckBox вообще
#19
Отправлено 06 ноября 2007 - 17:35
P.S. У DevExpress'а есть ещё какой-то XtraTreeListBlending, а контрол более старой версии, не имел приставки Xtra (впрочем, это не точно).
#20
Отправлено 06 ноября 2007 - 17:41
Глянул на этот XtraTreeList: я так понял, что там всё опирается на columns. То есть, если мы хотим создать ноду с checkbox'ом, то нам придётся добавлять две колонки: колонка с checkbox'ом (объект TreeListColumn) будет иметь тип RepositoryItemCheckEdit. Если у Вас именно такая реализация, то попробуйте поиграть с объектом TreeListColumn (он принадлежит главной форме или панели, смотря на чём лежит дерево). Если другая, то лучше выложить примерчик, быстрее разберёмся ;)
P.S. У DevExpress'а есть ещё какой-то XtraTreeListBlending, а контрол более старой версии, не имел приставки Xtra (впрочем, это не точно).
Да. Это я уже отметил, что все там на колонках построено...я даже могу получить название филда от одной из колонок :
Log.Message(w3["Columns"]["Item_2"](0).FieldName.OleValue); //это колонка со значением
, а перед этой строчкой на форме стоит чекбокс типа включать / не включать это значение. У колонки с чекбоксами ФилдНэйм отсутствует. Так вот у меня не получилось, через Columns пробиться до CheckBox. Все равно мне кажется что надо как-то делать через [Nodes], хотя вы наверное быстрее меня разберетесь.
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных