Quicktest Pro - найти первую кнопку после сопоставления текста

Я хочу использовать динамическое распознавание объектов (описательное программирование), чтобы найти первую кнопку с надписью "Удалить", которая появляется после некоторого заданного текста (например, первая кнопка "Удалить", которая появляется после текста "Элемент XYZ-123"). У меня есть хитрый способ сделать это, если и текст, и кнопка находятся внутри одной строки веб-таблицы, но я надеялся на более элегантное или надежное решение (надеюсь, не основанное на таблицах).

Я бы предпочел избегать использования свойства.Object, поскольку в документации утверждается, что свойство.Object возвращает объекты DOM только при тестировании в IE, а не в Firefox.

Спасибо!

3 ответа

Решение

Вот решение, которое использует sourceIndex атрибут, обратите внимание, что sourceIndex это свойство только для IE, но QTP имитирует его в Firefox, поэтому один и тот же скрипт будет работать в обоих браузерах. Вы можете использовать координаты на основе свойств, таких как abs_x а также abs_y если source_index не отвечает всем требованиям.

Следующий код отвечает на заданный вопрос, превращая его в общую функцию, оставляя читателю упражнение; о)

''#1. Create description for locator text 
Set textD = Description.Create()
textD("micclass").Value = "WebElement"
textD("innertext").Value = ".*Item XYZ-123.*"

''#2. Find locator sourceIndex
set texts = Browser("B").Page("P").ChildObjects(textD)
Set text = texts(texts.Count-1) ' Take last text '
textIdx = text.GetROProperty("source_index") ' works for FF too '

''#3. Create description for button 
Set buttonD = Description.Create()
buttonD("micclass").Value = "WebButton"
buttonD("value").Value = "Delete"
Set btns = Browser("B").Page("P").ChildObjects(buttonD)

''#4. Find first button after locator text 
For i = 0 To btns.Count
    If btns(i).GetROProperty("source_index") > textIdx Then
        btns(i).Click ' Or whatever you want to do with it '
        Exit For
    End If
Next

Что нужно отметить об этом решении:

  • Он не предполагает ничего об элементе, содержащем текст, если вы знаете, что это весь текст в элементе, вы можете удалить .*и / или добавить "HTML-тег" для повышения производительности.
    • Вот почему мы берем последний элемент, который соответствует описанию, первый элемент будет BODY и т.п.
  • В описании текста мы должны указать "micclass" = "WebElement", потому что по умолчанию ChildObject отфильтровывает WebElementПредполагая, что они неинтересны.

Предполагая, что не существует более простого способа сделать это, вы можете попробовать разобрать HTML. Найдите текст поиска в HTML и начните поиск в HTML с этой точки для кнопки "Удалить". Вы должны быть в состоянии извлечь идентификатор или другое идентифицирующее свойство из HTML, которое вы можете использовать для описательного программирования.

У вас есть примеры кода HTML и QTP, которые мы могли бы посмотреть, чтобы увидеть больше деталей? Возможно, есть более простой способ.

Позвольте мне сначала перефразировать вопрос.

Как получить ссылку на объект, содержащийся в WebTable, если номер строки неизвестен, но у вас есть уникальное значение ключа для поиска строки?

Это относится к кнопкам, флажкам, выпадающим спискам и любым другим объектам в таблице.

Реализация.

1) Найти строку

intRow = objWebTable.GetRowWithCellText(sKeyValueText, "Item") Вы можете указать столбец по имени или номеру

2) Получить дочерний объект

Установите objButton = objWebTable.ChildItem(intRow, intCol, "WebButton", 0). Вы можете указывать столбец только по номеру. Последний параметр вступает в силу, если у вас более одной кнопки в одной ячейке.

Посмотрите некоторые другие технические примеры в моем блоге ( http://automationbeyond.wordpress.com/).

Другие вопросы по тегам