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/).