Предоставляет ли Webelement.Object. <method>исходный результат или клон? - PullRequest
1 голос
/ 06 ноября 2019

TDLR: Центральный вопрос:

Правда ли, что в IE метод .Object объекта веб-теста и все «под-методы» напрямую предоставляют доступ к исходным объектам DOM, ас Chrome и FireFox UFT не возвращает исходные экземпляры объекта DOM, но клонирует, копирует или некоторые другие репрезентативные экземпляры?

Подробности: шаги воспроизведения, которые работают в сочетании с IE, и которые должны работать со всеми поддерживаемымибраузеры в соответствии с документацией отказывают в связи с Chrome и Firefox без уважительной причины.

Анализ показывает, что это вызвано неожиданным поведением или ошибкой в ​​UFT.

Поэтому я опишупроблема в общем. (Извините, пока нет SSCE.)

В частности:

Если я использую T T.Object.parentNode на уровне UFT тестового объекта для ссылки на родительский элемент,и затем вызовите там .childNodes, чтобы определить непосредственных потомков родительского элемента, тогда применяется следующее:

Ожидаемый: список, предоставленный childNodes, содержит среди других возможных экземпляров также экземпляр T.Object.

Факт: список, предоставленный childNodes, содержит (среди других возможных дочерних элементов) объект T.Object, только если IE является браузером, в котором находится DOM. Если используется Chrome или Firefox, список, предоставленный T.Object.parentNode.childNodes, содержит элемент, представляющий точно такой же элемент DOM, что и T.Object.parentNode, но это не тот же экземпляр объекта, т.е. экземпляр объекта отсутствуетE в списке, предоставленном childNodes, для которого выражение UFT VBScript "E is T.Object.parentNode" оценивается как true.

На уровне JavaScript можно показать, что допущение "A.parentNode.childNodes возвращаетсписок, содержащий экземпляр объекта A "всегда выполняется (где A - любой элемент (кроме корня) с вложенными элементами). Однако на уровне UFT можно понять, что это предположение применяется только в связи с IE, но не в связи с Chrome или Firefox.

Но документация UFT утверждает, что нативный объект DOM доступен напрямую. через .object, и из этого мы заключаем, что вызовы и возвращаемые значения методов таких объектов DOM должны проходить напрямую.

Вместо этого для Chrome и Firefox UFT, кажется, имеет механизм, так что, например,списки (например, NodeList, предоставленный childNodes) не передаются неизмененными как результат функции, но элементы списка клонируются или что-то подобное, так что предоставляются не собственные экземпляры, а только копии / представители / клоны.

Это правда? Тогда я считаю это ошибкой, либо в документации, либо в поддержке Chrome и Firefox в UFT. Есть ли обходной путь?

Я только сейчас начинаю обращаться к Chrome и Firefox как к целевым браузерам по разным причинам, и из-за вышеуказанных обстоятельств центральный универсальный код, который используется, неожиданно для меня прерывается, и я не понимаюЯ не знаю ни одного общего обходного пути, поэтому мне пришлось бы разрабатывать индивидуальный обходной путь для каждого конкретного случая, которого у меня буквально сотни.

Есть предложения?

1 Ответ

1 голос
/ 06 ноября 2019

Это правда, что в IE UFT предоставляет фактический COM-объект, используемый IE, через свойство .Object. Также верно, что для всех других браузеров (Firefox, Chrome, Edge, Mobile) UFT создает объект-обертку, который перенаправляет вызовы в собственный элемент DOM браузера (поскольку эти браузеры не представляют свой DOM в качестве COM-объектов).

Если я правильно понимаю ваш вопрос, вы зависите от правил идентификации объекта COM. В предыдущей (профессиональной) жизни я работал над оболочками COM для UFT, и я не помню, чтобы мы рассматривали это как вариант использования. Вы можете открыть дефект для UFT, я не уверен, насколько это возможно исправить, скорее всего, они скажут, что это ограничение и обновят документацию.

Если вы хотите проверить, если .Objectобъект ссылается на тот же базовый элемент DOM, который я бы предложил установить для некоторого свойства, например:

counter = 0
Function UniqueValue(obj)
    If TypeName(obj.unique_value) = "Empty" Then
        obj.unique_value = "unique_value_" & counter
        counter = counter + 1
    End If
End Function

' After this The element will have "unique_value_0" and the link "unique_value_1"
UniqueValue Browser("Example Domain").Page("Example Domain").WebElement("Example Domain").Object
UniqueValue Browser("Example Domain").Page("Example Domain").WebElement("Example Domain").Object

UniqueValue Browser("Example Domain").Page("Example Domain").Link("More information...").Object
...