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

Фотография

Использование Tree Model:DOM


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

#1 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 24 декабря 2010 - 12:21

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

Столкнулся с проблемой тестирования новостей на web странице. Проблема заключается в следующем: новости постоянно добавляются и те новости которые я использую, для проверки их работоспособности, постоянно меняют свой Index.

Есть ли решение данной проблемы ?

Инструмент: Test Complete 7.52

Язык: С++

Прошу ответить в ближайшее время!

Может быть лучше будет перевести автоматизированное тестирование с DOM на TAG, может ли это помочь ?
  • 0

#2 Dmitry N

Dmitry N

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

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

Отправлено 27 декабря 2010 - 07:46

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

То есть, у Вас нужный объекта на странице постоянно меняет своё местоположение в иерархии объектов или даже меняет своё имя? Вряд ли переключение на Tag Вам поможет. Уж лучше попробовать работать с Tree. Лучшим решением будет поиск нужного объекта по каким-либо уникальным свойствам используя методы Find или FindChild. Можно искать, например, по тексту внутри объекта (свойство innerHTML, например).
  • 0
С уважением,
Дмитрий

#3 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 27 декабря 2010 - 07:49

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

То есть, у Вас нужный объекта на странице постоянно меняет своё местоположение в иерархии объектов или даже меняет своё имя? Вряд ли переключение на Tag Вам поможет. Уж лучше попробовать работать с Tree. Лучшим решением будет поиск нужного объекта по каким-либо уникальным свойствам используя методы Find или FindChild. Можно искать, например, по тексту внутри объекта (свойство innerHTML, например).

Объект меняет своё положение в иерархии объектов. Попробуем методы, правда текст тоже не постоянный.
  • 0

#4 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 27 декабря 2010 - 13:01

А в чём разница между innerHTML и textContent ? Там и там отображается один и тот же текст.
  • 0

#5 Sunshine

Sunshine

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

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

Отправлено 27 декабря 2010 - 13:28

А в чём разница между innerHTML и textContent ? Там и там отображается один и тот же текст.


Это вам повезло. Возьмите тег с большей вложенностью, тогда в innerHTML вы увидите весь HTML-код, который находится внутри текущего тега, а в textContent только отображаемый текст(кажется) - это в FF, а в IE этого свойства вообще нет.
  • 0

#6 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 27 декабря 2010 - 13:35


А в чём разница между innerHTML и textContent ? Там и там отображается один и тот же текст.


Это вам повезло. Возьмите тег с большей вложенностью, тогда в innerHTML вы увидите весь HTML-код, который находится внутри текущего тега, а в textContent только отображаемый текст(кажется) - это в FF, а в IE этого свойства вообще нет.

Понятно, Спасибо огромное!!! А я то думаю почему при тестировании в ие глюки появляются.
  • 0

#7 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 28 декабря 2010 - 13:43

А возможно ли задать поиск объекта по id ? и можете по подробнее рассказать про метод Find ? Я в помощнике посмотрел и не понял два последних параметра которые передаются.(TestObj.Find(PropNames, PropValues, Depth, Refresh))
И еще, там нужно указать TestObj - в моём случае это будет сама страница ?
  • 0

#8 Sunshine

Sunshine

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

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

Отправлено 30 декабря 2010 - 14:50

А возможно ли задать поиск объекта по id ? и можете по подробнее рассказать про метод Find ? Я в помощнике посмотрел и не понял два последних параметра которые передаются.(TestObj.Find(PropNames, PropValues, Depth, Refresh))
И еще, там нужно указать TestObj - в моём случае это будет сама страница ?


1. Возможно. Для tree можно примерно так(часть кода выдрана из хелпа TC):

function FindById(page, id) {
PropArray = new Array("idStr");
ValuesArray = new Array(id);

ConvertedPropArray = ConvertJScriptArray(PropArray);
ConvertedValuesArray = ConvertJScriptArray(ValuesArray);

return page.FindChild(ConvertedPropArray, ConvertedValuesArray, 16000, true);
}

function ConvertJScriptArray(AArray)
{
// Uses the Dictionary object to convert a JScript array
var objDict = Sys.OleObject("Scripting.Dictionary");
objDict.RemoveAll();
for (var j in AArray)
objDict.Add(j, AArray[j]);
return objDict.Items();
}

Для DOM можно так:
function FindById(page, id) {
return page.document.getElementById(id);
}

2.
Depth: Глубина вложенности, на которую можно опускаться TC в поисках объекта относительно TestObj.

Refresh: Если true, то обновить кэш и поискать объект ещё раз, если сразу не получилось:

var object = TestObj.Find(PropNames, PropValues, Depth, true);

это аналогично

var object = TestObj.Find(PropNames, PropValues, Depth, false);
if (!object.Exists) {
TestObj.Refresh();
object = TestObj.Find(PropNames, PropValues, Depth, false);
}

Вроде так, могу ошибаться.
  • 0

#9 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 11 января 2011 - 06:36

А как мне потом взаимодействовать с найденным объектом? допустим объект кнопка: id = 1, page указан(используется код который указал Sunshine). Как будет выглядеть клик на эту кнопку ?
  • 0

#10 Dmitry N

Dmitry N

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

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

Отправлено 11 января 2011 - 07:12

obj.Click();
  • 0
С уважением,
Дмитрий

#11 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 11 января 2011 - 08:04

obj.Click();

Спасибо!
  • 0

#12 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 12 января 2011 - 10:52

Sunshine можете помочь, возникла проблема с использованием вашего кода. Ошибка появляется на строчке
return page.document.getElementById(id). Пишет что document - есть null или не является объектом. Как это поправить ? И что такое document в данном случае ?
  • 0

#13 Sunshine

Sunshine

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

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

Отправлено 12 января 2011 - 14:56

Sunshine можете помочь, возникла проблема с использованием вашего кода. Ошибка появляется на строчке
return page.document.getElementById(id). Пишет что document - есть null или не является объектом. Как это поправить ? И что такое document в данном случае ?


В настройках вашего проекта Open Applications -> Web Testing -> Tree Model установите в DOM или Hybrid - проверьте, поможет ли?
  • 0

#14 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 13 января 2011 - 05:11


Sunshine можете помочь, возникла проблема с использованием вашего кода. Ошибка появляется на строчке
return page.document.getElementById(id). Пишет что document - есть null или не является объектом. Как это поправить ? И что такое document в данном случае ?


В настройках вашего проекта Open Applications -> Web Testing -> Tree Model установите в DOM или Hybrid - проверьте, поможет ли?

Пробовал, не помогло. А там точно должно быть document а не document.all ?
  • 0

#15 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 13 января 2011 - 06:36

Победил проблему с document :smile: , но возникла другая: он не может почему то найти нужный мне объект по id(ведь в функцию передаётся просто id, который можно посмотреть через ObjectBrowser или нет?). В лог записывается следующее:
Type Message Time Link
Unable to find the object getElementById(239). 9:36:01

Объект чей id тут указан есть и отображается на странице.
  • 0

#16 Sunshine

Sunshine

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

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

Отправлено 13 января 2011 - 08:31

Победил проблему с document :smile: , но возникла другая: он не может почему то найти нужный мне объект по id(ведь в функцию передаётся просто id, который можно посмотреть через ObjectBrowser или нет?). В лог записывается следующее:
Type Message Time Link
Unable to find the object getElementById(239). 9:36:01

Объект чей id тут указан есть и отображается на странице.


Как победили проблему с document?

см. свойство idStr, а не id. То, что вам нужно подставлять в getElementById в качестве параметра - это значение атрибута id нужного вам тега, т.е. если где-то на странице есть такой тег: <a id="mysuperlink"/>, то чтобы получить на него ссылку надо писать так:
getElementById("mysuperlink")
при этом в свойстве id у этого объекта (если смотреть через Object Browser) может стоять какое-либо число, в вашем случае - это 239. Это число, конечно, можно использовать для поиска объекта в дереве Sys - его можно подставлять в качестве параметра методу FindId(), например, так:
page.FindId(239)
Однако, закладываться на поиск по этому числу не стоит в случае работы с веб-объектами, т.к. на сколько я понимаю, 100% сказать, какой будет id у объекта в любой момент времени невозможно.

Надеюсь, я не запутал вас ещё больше.
  • 0

#17 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 13 января 2011 - 09:12


Победил проблему с document :smile: , но возникла другая: он не может почему то найти нужный мне объект по id(ведь в функцию передаётся просто id, который можно посмотреть через ObjectBrowser или нет?). В лог записывается следующее:
Type Message Time Link
Unable to find the object getElementById(239). 9:36:01

Объект чей id тут указан есть и отображается на странице.


Как победили проблему с document?

см. свойство idStr, а не id. То, что вам нужно подставлять в getElementById в качестве параметра - это значение атрибута id нужного вам тега, т.е. если где-то на странице есть такой тег: <a id="mysuperlink"/>, то чтобы получить на него ссылку надо писать так:
getElementById("mysuperlink")
при этом в свойстве id у этого объекта (если смотреть через Object Browser) может стоять какое-либо число, в вашем случае - это 239. Это число, конечно, можно использовать для поиска объекта в дереве Sys - его можно подставлять в качестве параметра методу FindId(), например, так:
page.FindId(239)
Однако, закладываться на поиск по этому числу не стоит в случае работы с веб-объектами, т.к. на сколько я понимаю, 100% сказать, какой будет id у объекта в любой момент времени невозможно.

Надеюсь, я не запутал вас ещё больше.

Нет не запутали а помогли очень сильно!!! Спасибо. А проблему с document победил очень просто.
Я сделал так что при запуске определённой функции(функция открытия браузера) некой переменной w присваивается следующее значение:
w = page.document.all
где page = p.Page(url+"*"), p = Aliases.firefox;

Я подствил эту переменную вместо page.document и всё заработало. А что делать если idStr - пустая строка??? И какой параметр можно использовать чтобы объект был более уникален??? А при изменении на веб странице, например добавления каких либо элементов , параметр id изменятся будет ????
И еще вопрос))) Иcпользуя этот метод мне как потом к объекту?? И еще в Page прописывается Sys["Process"]("firefox")["Page"](url) - например ?
  • 0

#18 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 14 января 2011 - 08:57

Вы оказались правы, искать объекты по id не выход.Я решил использовать свойство outerHTML, или лучше что то другое ? Можете еще сказать правильно ли я модернизовал функцию поиска:
function Find(PropNames, PropValues, Depth, Refresh) 
{

  PropArray = new Array(PropNames);
  ValuesArray = new Array(PropValues);

  ConvertedPropArray = ConvertJScriptArray(PropArray);
  ConvertedValuesArray = ConvertJScriptArray(ValuesArray);
  return w.getElement(PropValues);
}   

function ConvertJScriptArray(AArray)
{
// Uses the Dictionary object to convert a JScript array
  var objDict = Sys.OleObject("Scripting.Dictionary");
  objDict.RemoveAll();
  for (var j in AArray)
  objDict.Add(j, AArray[j]);
  return objDict.Items();
}

  • 0

#19 Sunshine

Sunshine

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

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

Отправлено 17 января 2011 - 09:36

Вы оказались правы, искать объекты по id не выход.Я решил использовать свойство outerHTML, или лучше что то другое ? Можете еще сказать правильно ли я модернизовал функцию поиска:

function Find(PropNames, PropValues, Depth, Refresh) 
{

  PropArray = new Array(PropNames);
  ValuesArray = new Array(PropValues);

  ConvertedPropArray = ConvertJScriptArray(PropArray);
  ConvertedValuesArray = ConvertJScriptArray(ValuesArray);
  return w.getElement(PropValues);
}   

function ConvertJScriptArray(AArray)
{
// Uses the Dictionary object to convert a JScript array
  var objDict = Sys.OleObject("Scripting.Dictionary");
  objDict.RemoveAll();
  for (var j in AArray)
  objDict.Add(j, AArray[j]);
  return objDict.Items();
}



Смотря что вы хотели сделать. Пока что я вижу функцию, конвертирующий JS-массив в VB-массив и функцию непонятного для меня назначения.
  • 0

#20 Sunshine

Sunshine

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

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

Отправлено 17 января 2011 - 09:50



Победил проблему с document :smile: , но возникла другая: он не может почему то найти нужный мне объект по id(ведь в функцию передаётся просто id, который можно посмотреть через ObjectBrowser или нет?). В лог записывается следующее:
Type Message Time Link
Unable to find the object getElementById(239). 9:36:01

Объект чей id тут указан есть и отображается на странице.


Как победили проблему с document?

см. свойство idStr, а не id. То, что вам нужно подставлять в getElementById в качестве параметра - это значение атрибута id нужного вам тега, т.е. если где-то на странице есть такой тег: <a id="mysuperlink"/>, то чтобы получить на него ссылку надо писать так:
getElementById("mysuperlink")
при этом в свойстве id у этого объекта (если смотреть через Object Browser) может стоять какое-либо число, в вашем случае - это 239. Это число, конечно, можно использовать для поиска объекта в дереве Sys - его можно подставлять в качестве параметра методу FindId(), например, так:
page.FindId(239)
Однако, закладываться на поиск по этому числу не стоит в случае работы с веб-объектами, т.к. на сколько я понимаю, 100% сказать, какой будет id у объекта в любой момент времени невозможно.

Надеюсь, я не запутал вас ещё больше.

Нет не запутали а помогли очень сильно!!! Спасибо. А проблему с document победил очень просто.
Я сделал так что при запуске определённой функции(функция открытия браузера) некой переменной w присваивается следующее значение:
w = page.document.all
где page = p.Page(url+"*"), p = Aliases.firefox;

Я подствил эту переменную вместо page.document и всё заработало. А что делать если idStr - пустая строка??? И какой параметр можно использовать чтобы объект был более уникален??? А при изменении на веб странице, например добавления каких либо элементов , параметр id изменятся будет ????
И еще вопрос))) Иcпользуя этот метод мне как потом к объекту?? И еще в Page прописывается Sys["Process"]("firefox")["Page"](url) - например ?


1. А что делать если idStr - пустая строка??? Прописать id в теге, искать относительно объектов, у которых id прописан. Варианты есть - используйте тот, который будет удобнее.
2. И какой параметр можно использовать чтобы объект был более уникален??? id как раз и есть атрибут, который должен быть уникальным внутри всего сформированного html.
3. А при изменении на веб странице, например добавления каких либо элементов , параметр id изменятся будет ???? Аттрибут id тега при добавлении новых элементов меняться не будет, если только вы не сделаете это специально. Свойство id у объекта в дереве sys будет меняться и без добавления новых элементов.
4. И еще вопрос))) Иcпользуя этот метод мне как потом к объекту?? Не понял.
5. И еще в Page прописывается Sys["Process"]("firefox")["Page"](url) - например ? Не понял.
  • 0


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

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