Использование Tree Model:DOM
#1
Отправлено 24 декабря 2010 - 12:21
Столкнулся с проблемой тестирования новостей на web странице. Проблема заключается в следующем: новости постоянно добавляются и те новости которые я использую, для проверки их работоспособности, постоянно меняют свой Index.
Есть ли решение данной проблемы ?
Инструмент: Test Complete 7.52
Язык: С++
Прошу ответить в ближайшее время!
Может быть лучше будет перевести автоматизированное тестирование с DOM на TAG, может ли это помочь ?
#2
Отправлено 27 декабря 2010 - 07:46
То есть, у Вас нужный объекта на странице постоянно меняет своё местоположение в иерархии объектов или даже меняет своё имя? Вряд ли переключение на Tag Вам поможет. Уж лучше попробовать работать с Tree. Лучшим решением будет поиск нужного объекта по каким-либо уникальным свойствам используя методы Find или FindChild. Можно искать, например, по тексту внутри объекта (свойство innerHTML, например).
Дмитрий
#3
Отправлено 27 декабря 2010 - 07:49
Объект меняет своё положение в иерархии объектов. Попробуем методы, правда текст тоже не постоянный.Здравствуйте.
То есть, у Вас нужный объекта на странице постоянно меняет своё местоположение в иерархии объектов или даже меняет своё имя? Вряд ли переключение на Tag Вам поможет. Уж лучше попробовать работать с Tree. Лучшим решением будет поиск нужного объекта по каким-либо уникальным свойствам используя методы Find или FindChild. Можно искать, например, по тексту внутри объекта (свойство innerHTML, например).
#4
Отправлено 27 декабря 2010 - 13:01
#5
Отправлено 27 декабря 2010 - 13:28
А в чём разница между innerHTML и textContent ? Там и там отображается один и тот же текст.
Это вам повезло. Возьмите тег с большей вложенностью, тогда в innerHTML вы увидите весь HTML-код, который находится внутри текущего тега, а в textContent только отображаемый текст(кажется) - это в FF, а в IE этого свойства вообще нет.
#6
Отправлено 27 декабря 2010 - 13:35
Понятно, Спасибо огромное!!! А я то думаю почему при тестировании в ие глюки появляются.
А в чём разница между innerHTML и textContent ? Там и там отображается один и тот же текст.
Это вам повезло. Возьмите тег с большей вложенностью, тогда в innerHTML вы увидите весь HTML-код, который находится внутри текущего тега, а в textContent только отображаемый текст(кажется) - это в FF, а в IE этого свойства вообще нет.
#7
Отправлено 28 декабря 2010 - 13:43
И еще, там нужно указать TestObj - в моём случае это будет сама страница ?
#8
Отправлено 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);
}
Вроде так, могу ошибаться.
#9
Отправлено 11 января 2011 - 06:36
#10
Отправлено 11 января 2011 - 07:12
Дмитрий
#11
Отправлено 11 января 2011 - 08:04
Спасибо!obj.Click();
#12
Отправлено 12 января 2011 - 10:52
return page.document.getElementById(id). Пишет что document - есть null или не является объектом. Как это поправить ? И что такое document в данном случае ?
#13
Отправлено 12 января 2011 - 14:56
Sunshine можете помочь, возникла проблема с использованием вашего кода. Ошибка появляется на строчке
return page.document.getElementById(id). Пишет что document - есть null или не является объектом. Как это поправить ? И что такое document в данном случае ?
В настройках вашего проекта Open Applications -> Web Testing -> Tree Model установите в DOM или Hybrid - проверьте, поможет ли?
#14
Отправлено 13 января 2011 - 05:11
Пробовал, не помогло. А там точно должно быть document а не document.all ?
Sunshine можете помочь, возникла проблема с использованием вашего кода. Ошибка появляется на строчке
return page.document.getElementById(id). Пишет что document - есть null или не является объектом. Как это поправить ? И что такое document в данном случае ?
В настройках вашего проекта Open Applications -> Web Testing -> Tree Model установите в DOM или Hybrid - проверьте, поможет ли?
#15
Отправлено 13 января 2011 - 06:36
Type Message Time Link
Unable to find the object getElementById(239). 9:36:01
Объект чей id тут указан есть и отображается на странице.
#16
Отправлено 13 января 2011 - 08:31
Победил проблему с document , но возникла другая: он не может почему то найти нужный мне объект по 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 у объекта в любой момент времени невозможно.
Надеюсь, я не запутал вас ещё больше.
#17
Отправлено 13 января 2011 - 09:12
Нет не запутали а помогли очень сильно!!! Спасибо. А проблему с document победил очень просто.
Победил проблему с document , но возникла другая: он не может почему то найти нужный мне объект по 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 у объекта в любой момент времени невозможно.
Надеюсь, я не запутал вас ещё больше.
Я сделал так что при запуске определённой функции(функция открытия браузера) некой переменной w присваивается следующее значение:
w = page.document.all
где page = p.Page(url+"*"), p = Aliases.firefox;
Я подствил эту переменную вместо page.document и всё заработало. А что делать если idStr - пустая строка??? И какой параметр можно использовать чтобы объект был более уникален??? А при изменении на веб странице, например добавления каких либо элементов , параметр id изменятся будет ????
И еще вопрос))) Иcпользуя этот метод мне как потом к объекту?? И еще в Page прописывается Sys["Process"]("firefox")["Page"](url) - например ?
#18
Отправлено 14 января 2011 - 08:57
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(); }
#19
Отправлено 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-массив и функцию непонятного для меня назначения.
#20
Отправлено 17 января 2011 - 09:50
Нет не запутали а помогли очень сильно!!! Спасибо. А проблему с document победил очень просто.
Победил проблему с document , но возникла другая: он не может почему то найти нужный мне объект по 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 у объекта в любой момент времени невозможно.
Надеюсь, я не запутал вас ещё больше.
Я сделал так что при запуске определённой функции(функция открытия браузера) некой переменной 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) - например ? Не понял.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных