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

Фотография

Рекурсивная проверка сайта


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

#1 Strike

Strike

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

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

Отправлено 20 декабря 2009 - 15:16

Привет!

Ребята с начала попрошу не ругаться, если это обсуждалось, я не смог найти нужной для себя информации.
У меня QTP 9.0
Задача - рекурсивно пройтись по всем ссылкам сайта начиная с главной страницы и сделать многочисленные
проверки на всех страницах.
Я новичок, прочитал встроенный help, кое-как попавшиеся мануалы, на среднем уровне разбираюсь в программировании.

Я себе представляю это так:
При выполнении теста
1. Получение первой ссылки из некого массива
2. Открытие страницы
3. Занесение ее в OR
4. Создание чекпоинтов
5. Проверка по чекпоинтам
6. Сбор всех (уникальных) ссылок со страницы и занесение их в массив
7. Переход по следующей ссылке из массива
8. переход к пункту 2

Первый вопрос который возникает реально ли это в QTP?
Второй вопрос, как динамически создавать объекты в Object repository и необходимо ли мне это делать в моей задаче?

Я очень надеюсь на Вашу помощь и любую информацию для разрешения данной задачи.

Заранее огромное спасибо за уделенное мне время.
  • 0

#2 Jed Meyers

Jed Meyers

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Jed Ezriela Meyers

Отправлено 22 декабря 2009 - 14:52

Не могу подсказать как все правильно в вашем случае оформить, но метод ChildObjects и descriptive programming вам могут помочь.

1. Получение первой ссылки из некого массива
Этот массив можно задавать через DataTable

2. Открытие страницы
.Link().Click
3. Занесение ее в OR
Если считаете нужным. При большом обьеме похожих обьектов я лично считаю это нецелесообразным.

4. Создание чекпоинтов
Если все чекпоинты заранее известны и фиксированы, то параметры для них можно тоже хранить в DataTable.

5. Проверка по чекпоинтам
Чекпоинты можно реализовать с помощью функций и вывода результата в Reporter.

6. Сбор всех (уникальных) ссылок со страницы и занесение их в массив
Set ObjDesc = Description.Create
ObjDesc("micclass").Value = "Link"
.ChildObjects(ObjDesc)
7. Переход по следующей ссылке из массива
8. переход к пункту 2

Мне кажется, будет тяжело реализовать чекпоинты на различных страницах если у них много разных параметров.
Если, например, нужно проверять тайтл браузера или что-то подобное, то это реализуемо.
  • 0

#3 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 22 декабря 2009 - 15:06

Привет!

Ребята с начала попрошу не ругаться, если это обсуждалось, я не смог найти нужной для себя информации.
У меня QTP 9.0
Задача - рекурсивно пройтись по всем ссылкам сайта начиная с главной страницы и сделать многочисленные
проверки на всех страницах.
Я новичок, прочитал встроенный help, кое-как попавшиеся мануалы, на среднем уровне разбираюсь в программировании.

Я себе представляю это так:
При выполнении теста
1. Получение первой ссылки из некого массива
2. Открытие страницы
3. Занесение ее в OR
4. Создание чекпоинтов
5. Проверка по чекпоинтам
6. Сбор всех (уникальных) ссылок со страницы и занесение их в массив
7. Переход по следующей ссылке из массива
8. переход к пункту 2

Первый вопрос который возникает реально ли это в QTP?
Второй вопрос, как динамически создавать объекты в Object repository и необходимо ли мне это делать в моей задаче?

Я очень надеюсь на Вашу помощь и любую информацию для разрешения данной задачи.

Заранее огромное спасибо за уделенное мне время.


Задача красивая стоит. Теоретически можно ее на QTP реализовать. (Правда, не уверен, что не на QTP не будет проще).
Уточняющие моменты:
1. Версия 9.0 используется потому, что есть проблемы с более старшими версиями / нет возможности обновиться / как-то не было необходимости в апгрейде? (Вопрос далеко не праздный, как может показаться на первый взгляд. Я не уверен, что в 9.0 доступны те же функции API для работы с репозиторием, что и в 9.5)
2. Что подразумевается под созданием чекпоинтов? Что именно планируется проверять?
3. Что хочется в итоге получить:
a) Код, который на эталонной версии приложения проходит по всем страницам и сохраняет референсные данные (т.н. baseline), которые будут использовать при проверке разрабатываемой новой версии. И потом запускать этот же код, реализующий алгоритм обхода приложения, на тестируемой версии приложения и сравнивать данные с тестируемой версии с Baseline
b) Код, который проходит по эталонной версии приложения, заполняет QTP-шный ОР, создает там какие-то QTP-шные чекпоинты и параллельно создает код для простых QTp-шных тестов. которые потом будут запускаться на тестируемой версии приложения?
  • 0

#4 Strike

Strike

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

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

Отправлено 23 декабря 2009 - 13:36

2 Jed Meyers, Спасибо за Ваш ответ. Есть дополнительные вопросы:
1. где можно найти подробное описание методов ChildObjects и descriptive programming (на русском или английском)
2. Реализация чекпоинтов через функции - это я так понял если не использовать стандартные чекпоинты, есть ли способ
делать проверки по стандартным чекпоинтам в случае если они заранее не определены?
3. Добавление объектов в OR. Да объекты действительно идентичны и добавлять их в OR мне тоже не хочется, но как сильно я потеряю
в функциональности? Может мне стоит заносить в OR страницу как объект, колдовать над ней а потом удалять?

2 ch_ip, Спасибо за Вашу заинтересованность.
1. К сожалению нет возможности использовать более новую версию, по крайней мере пока этот проект не принесет какие-то плоды.
2. Возможно я не правильно выразился, я вообще хочу использовать стандартные чекпоинты для начала, такие как 'Checking Pages', 'Checking Text'. Изначальный план попытаться адаптировать QTP, под сайты сделанные на одной платформе, т.е. достаточно идентичные.
Вообще по сути будет 4 типа страниц, во всех сайтах:
- главная
- категорийная страница, на ней будут располагаться ссылки на категории продуктов
- продуктовая страница, на ней располагается список продуктов в виде - названия продукта, описания и картинки
- Всплывающее окно с полным описанием продукта

Собственно, проверять конечно хочется побольше, но сейчас основная цель, просто проба, т.е. какие то стандартные проверки, а я так понимаю это стандартные чекпоинты.

3. Спасибо, за предложенные варианты, это упростило ответ. Что-то приближенное к варианту B. Единственное эталонная версия приложения это некий набор конфигов, возможно информация с другого ресурса, например проверка имени продукта, предполагается, что необходимо
будет брать имя с XLS файла и сравнивать его с именем на сайте. Описание продукта возможно взять с другого сайта и посмотреть что у нас такое же.
Проверки наверно достаточно сложные предстоят, поэтому и говорю сейчас только о каком-то каркасе проекта.

Очень заинтересовала фраза, что возможно QTP не совсем лучший вариант. Есть ли у Вас какие- то соображения по поводу альтернатив?
  • 0

#5 Jed Meyers

Jed Meyers

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Jed Ezriela Meyers

Отправлено 23 декабря 2009 - 15:46

1. где можно найти подробное описание методов ChildObjects и descriptive programming (на русском или английском)
2. Реализация чекпоинтов через функции - это я так понял если не использовать стандартные чекпоинты, есть ли способ
делать проверки по стандартным чекпоинтам в случае если они заранее не определены?
3. Добавление объектов в OR. Да объекты действительно идентичны и добавлять их в OR мне тоже не хочется, но как сильно я потеряю
в функциональности? Может мне стоит заносить в OR страницу как объект, колдовать над ней а потом удалять?


1. В хелпе с примерами описано. На sqaforums есть пару тем.
2. Приведите, пожалуйста, примеры чекпоинтов которые вам понадобятся.
3. Исходя из того что вы сказали, я бы рекомендовал не использовать OR.
  • 0

#6 Strike

Strike

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

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

Отправлено 24 декабря 2009 - 00:01

1. где можно найти подробное описание методов ChildObjects и descriptive programming (на русском или английском)
2. Реализация чекпоинтов через функции - это я так понял если не использовать стандартные чекпоинты, есть ли способ
делать проверки по стандартным чекпоинтам в случае если они заранее не определены?
3. Добавление объектов в OR. Да объекты действительно идентичны и добавлять их в OR мне тоже не хочется, но как сильно я потеряю
в функциональности? Может мне стоит заносить в OR страницу как объект, колдовать над ней а потом удалять?


1. В хелпе с примерами описано. На sqaforums есть пару тем.
2. Приведите, пожалуйста, примеры чекпоинтов которые вам понадобятся.
3. Исходя из того что вы сказали, я бы рекомендовал не использовать OR.


Вроде более менее ясно стало как все это работает, однако столкнулся с проблемой.
Необходимо идентифицировать страницу по части URL, делаю я так

Set wcPage = Description.Create
   wcPage("URL").value = ".*" + PartOfURL + ".*"

Но при попытке собрать ссылки со страниц, появляется ошибка 'General run error'

Set wcPage = Description.Create
   wcPage("URL").value = ".*" + PartOfURL + ".*"
   Set Links = Description.Create
   Links("micclass").Value = "Link"
   Set AllLinks =  Browser(wcBrowser).Page(wcPage).ChildObjects(Links)

Проблема 100% не в идентификации браузера, т.к. пробывал его закрывать
Browser(wcBrowser).Close
все ок



Либо нельзя по части УРЛ идентифицировать страницу(что будет очень обидно), либо вообще нельзя страницу по УРЛ распознавать, подскажите, пожалуйста, где я ошибаюсь.

По поводу пункта 2.
BitMap checkpoint, Text Checkpoint

Например - нужно проверить, что картинка которая является ссылкой имеет верные значения,
href
image
title(alt)
Эти верные значения хранятся к примеру в XLS(хотя на самом деле, что будет удобнее использовать, там и
будет хранится) файле за исключением картинки, их нужно сравнить и на сколько я понимаю это может сделать BitMap checkpoint
Есть ли у Вас какие-либо советы как организовать данную проверку?
  • 0

#7 Jed Meyers

Jed Meyers

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Jed Ezriela Meyers

Отправлено 24 декабря 2009 - 10:01

По поводу первого случая. У Browser и Page обычно описания совпадают. Попробуйте так.
Dim sUrlPart, oBrowserDesc, oLinks, oAllLinks 


Set oBrowserDesc = Description.Create
Set oLinks = Description.Create

oBrowserDesc("url").Value = ".*" & sUrlPart & ".*" 
'для обьединения стрингов используйте оператор &
'если в sUrlPart есть символы RegExp вроде ? то перед ними надо ставить \, что бы они обрабатывались как обычные стринги

oLinks ("micclass").Value = "Link"

Set oAllLinks =  Browser(oBrowserDesc).Page(oBrowserDesc).ChildObjects(Links)


Во втором случае, вы можете использовать BitmapCheckpoint. А для проверки пропертей обьекта можно просто использовать if.
Например, вы знаете заранее, что у картинок "html id" равен "image1", "image2", и тд. Вы хотите проверить что href картинок равен "http://test.url/1", "http://test.url/2"
Заносите это все в таблицу в столбики HTML_ID и HREF например. Потом:

Dim iRow, sSheetID, sImageHref, oImageDesc, oBrowserDesc

'используем локальный sheet в дата таблице
'такой код будет работать даже если action переименовать или поменять местами
sSheetID = Environment("ActionName")

'создаем обьект описания для картинки и браузера
Set oImageDesc = Description.Create
Set oBrowserDesc = Description.Create
oBrowserDesc("url").Value = "browser url"

'Проходим по каждой заполненой строке в таблице
For iRow = 1 To DataTable.GetSheet(sSheetID).GetRowCount
  DataTable.SetCurrentRow(iRow)

  'получаем из таблицы нужный html id картинки
  oImageDesc("html id").Value = DataTable.Value("HTML_ID", sSheetID)

  'из нужной картинки на странице вытягиваем href
  sImageHref = Browser(oBrowserDesc).Page(oBrowserDesc).Image(oImageDesc).GetROProperty("href")

  'если полученый href соответствует заданному в таблице
  If sImageHref = DataTable.Value("HREF", sSheetID) Then
	'то выводим в репорт Pass
	Reporter.ReportEvent micPass, "Проверка href", "Image html id = " & DataTable.Value("HTML_ID", sSheetID)
  Else
	'тут в выводе Fail в последний параметр можно добавить ожидаемый и полученный href
	Reporter.ReportEvent micFail, "Проверка href", "Image html id = " & DataTable.Value("HTML_ID", sSheetID)
  End If
'переходим на следущую строку в таблице  
Next

  • 0

#8 Strike

Strike

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

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

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

Jed Meyers, Спасибо, очень помогли.

Однако я столкнулся с такими проблемами, все касательно сабжа:
1. Переход по ссылке. Я хочу использовать метод Click ссылки, а не Navigate браузера, для
большей "похожести" на действия пользователя, но код приведенный ниже никак не работает,
не может найти такой объект на странице
Set wcNextLink = Description.Create
wcNextLink("url").Value = wcLinkHref
Browser(wcBrowser).Page(wcBrowser).Link(wcNextLink).Click

URL в переменной wcLinkHref на странице точно есть.
А вот так работает:
Browser(wcBrowser).Navigate(wcLinkHref)

Подскажите пожалуйста почему скрипт не может найти ссылку на странице?

2. Оказалось не так-то просто сделать алгоритм который будет бегать по всем страничкам сайта.
Сложности заключаются в том что мне необходимо проверять все страницы принадлежащие сайту,
но ссылки на страницах могут пересекаться, или это вообще может быть анкор типа "#top" или какой-нибудь Javascript.
Из всего этого вытекает что нужно на каждой странице проверять, был ли скрипт на ней
уже или нет. И вот здесь я исписал кипы бумаг в попытках придумать алгоритм который, будет быстро определять "статус" страницы - проверена/не проверена. Но все упирается в то что мне необходимо
вести массив, и URL каждой странице искать в нем и проверять статус страницы, при кол-ве страниц скажем 500 уже будет ощутима потеря производительности этого подхода.
Есть ли у Вас какие-либо соображения как можно реализовать это?

3. Обработка ссылок с Javascript и анкорами
Как я уже сказал выше на страницах часто встречаются анкоры и JavaScript. Но как их проверять?
Например если ссылка с href = java script:close, есть ли шанс ее проверить? Или ссылка вызывает
какую то JavaScript функцию как проверить что функция выполнилась без ошибок?
По поводу анкоров в принципе понятно, если есть анкор типа #10123, то нужно поискать элемент с таким name'ом. Но опять же, слишком долго собирать все ссылки и смотреть у них name. Можеть быть есть более быстрый способ?

4. Как правильно пользоваться RegExp'ом для идентификации браузера:
например есть часть URL aa/bb/page.html (после html тоже может быть продолжение URL). Я идентифицирую браузер так:
Dim URLPart
URLPart = "aa/bb/page.html"
wcBrowser("url").Value = ".*" & URLPart & ".*"
Начали закрадываться сомнения, что это не правильно, т.к. иногда браузер не идентифицируется, возможно
ошибка в другом, но сначала решил убедится что код выше корректен.

Заранее огромное спасибо за любую помощь!
  • 0

#9 Strike

Strike

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

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

Отправлено 27 декабря 2009 - 16:41

Простите, вопрос №1 и №4 отпали. Внимательно перечитал пост, помогло вот это:
'если в sUrlPart есть символы RegExp вроде ? то перед ними надо ставить \, что бы они обрабатывались как обычные стринги

Остаются в силе вопрос №2 и №3

Спасибо!
  • 0


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

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