HP QTP 11: выполнение сценария не выполняется при работе в Firefox, но средство просмотра отладки показывает результат операции

Я пытаюсь запустить нашу автоматизацию, написанную для IE, в Firefox 3.6 и сталкиваюсь с этой неприятной проблемой: у меня есть код:

Set cellDataItems = Browser().Page().WebElement().Object.getElementsByTagName("div")
For i = 0 to cellDataItems.length -1 
    MsgBox (cellDataItems.item(i).innerHTML)
Next

Когда скрипт переходит в строку с MsgBox, если останавливается с ошибкой:

TypeError: объект obj [FuncName] не определен

Затем нажимаю отладку, вижу, что i = 0. Я добавил cellDataItems.item (i) .innerHTML в средство просмотра отладки, он показывает его значение (см. Ниже) без ошибок. Кроме того, cellDataItems.item (i) .textContent отлично отображается в средстве просмотра отладки.

Значение cellDataItems.item (i) .innerHTML при i = 0:

<table class="x-grid3-row-table" style="width: 100px;" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="x-grid3-col x-grid3-cell x-grid3-td-0 x-grid3-cell-first " style="width: 98px; text-align: left;" tabindex="0"><div class="x-grid3-cell-inner x-grid3-col-0" unselectable="on"><div align="left">AUD/USD</div></div></td></tr></tbody></table>

Итак, почему скрипт выдает эту ошибку, но программа просмотра отладки показывает ее? Спасибо!

Обновление. В консоли Firefox я вижу более подробную информацию:

Ошибка: obj [FuncName] не определено. Исходный файл: file: /// C: /Program%20Files/HP/QuickTest%20Professional/Bin/Mozilla/Common/components/ScriptWrapperXPCOM.js -> file: /// c: / program% 20files / hp / quicktest% 20professional / bin / JSFiles / mzDotObj.js Строка: 76

обновление 2:

MsgBox (eval(cellDataItems.item(i).innerHTML)) 

Когда использую eval - работает! Может быть, есть способ отладки кода расширения QTP для firefox?

обновление 3: Как это возможно: выражение "colItem.className" имеет значение "x-panel", но после того, как я выполняю выражение

sClassName = colItem.className

значение sClassName пусто: строка 570 была выполнена, но sclassName все еще пуст

Это работает: sClassName = eval ("colItem.className")

Как такое вообще возможно? !!!!!! Или я схожу с ума, или у QTP 11 внутри дефект biiig!


person vmg    schedule 17.08.2011    source источник
comment
Это действительно похоже на дефект в QTP 11 (точнее в патче для поддержки Firefox3.6). Я бы порекомендовал открыть заявку в службу поддержки HP.   -  person Motti    schedule 07.09.2011
comment
Спасибо за помощь! Вы можете посмотреть мои расследования ниже.   -  person vmg    schedule 07.09.2011


Ответы (1)


Я нашел причину и нашел обходной путь.

Итак, где-то в связанной библиотеке у меня есть код:

Set itemCol = windows.item(i) ' line 1
sClassName = itemCol.className ' line 2

А в другой библиотеке у меня есть выражение:

arrMyTradeInfo=GlobalDictionary.Item("gdTrades")

С этим кодом во время выполнения строки 1 QTP выдаст ошибку:

TypeError: obj [FuncName] не определено. Но если я изменю код на (обратите внимание на имя функции "item" - теперь оно в нижнем регистре) - строка 1 будет работать !!!:

arrMyTradeInfo=GlobalDictionary.item("gdTrades")

Но тогда он не будет работать в строке 2 - см. Обновление 3 в самом вопросе - значение sClassName будет пустым, но itemCol.className может содержать строку. В другой библиотеке у меня есть функция (обратите внимание на параметр className):

Function GetFirstObjectByClassName(byVal Parent, byVal className, byVal tag)
    Dim result
     result = getElementsByClassName(Parent, className, tag)
     If (UBound(result)<0) Then
        set GetFirstObjectByClassName = Nothing
    Else
        set GetFirstObjectByClassName = result (0)
    End If   
End Function

Когда я изменил его имя на другое (например, csName), строка 2 работает !!!

Function GetFirstObjectByClassName(byVal Parent, byVal csName, byVal tag)
    Dim result
     result = getElementsByClassName(Parent ,csName, tag)
     If (UBound(result)<0) Then
        set GetFirstObjectByClassName = Nothing
    Else
        set GetFirstObjectByClassName = result (0)
    End If   
End Function

Итак, это обходной путь. Я не могу объяснить, почему это происходит, я предполагаю: VBScript не является строго типизированным. И в QTP они реализовали что-то вроде «вызовов виртуальных функций», как в C ++ и Java, на основе какой-то информации о типе времени выполнения, но для объектов DOM из Firefox произошла некоторая коллизия, они неправильно собрали RTTI.

Итак, главный вывод и беспокойство: только одна неправильная буква (элемент вместо элемента) может сломать ваш код, который работает с firefox dom и даст вам много приятных часов отладки! Итак, будьте осторожный!

Открою тикет с поддержкой HP.

person vmg    schedule 07.09.2011