Существует несколько различий между WebElement(...).FireEvent
и WebElement.Object.fireEvent
: первый запускает функцию QTP, которая выполняет все виды работ, а второй непосредственно переходит к элементу DOM. Вот список нескольких вещей, которые делает QTP, но которые не выполняются в собственном методе DOM (может быть и больше).
- Если элемент не виден, QTP делает его видимым (это включает в себя активацию вкладки и прокрутку в представлении)
- Поддержка QTP воспроизведение устройства , в этом случае оно будет перемещать курсор и имитировать реальный щелчок (это дает вам лучшую симуляцию взаимодействия реальных людей с приложением)
- QTP записывает в отчет, что он выполнил
FireEvent
шаг
Что касается вашей проблемы, в целом вы можете использовать собственный метод DOM для передачи объекта события, но когда я попробовал его, я не смог заставить его работать из QTP
set doc = Browser("B").Page("P").WebElement("W").Object.ownerDocument
set ev = doc.createEventObject()
ev.shiftKey = True
Browser("B").Page("P").WebElement("W").Object.FireEvent "onclick", ev
Однако при запуске из браузера работает нечто эквивалентное.
Начиная с QTP11, есть поддержка запуска файлов JavaScript из скрипта с использованием Page("P").RunScript
, пока вы не сможете смоделировать эту возможность вручную. Следующий фрагмент кода работает для меня (я использую объект из репозитория, чтобы получить IE 10-специфичный uniqueID
элемента, поэтому мне больше не нужно его идентифицировать).
' Use QTP's object identification instead of reproducing the logic in JavaScript
id = Browser("B").Page("P").WebElement("W").Object.uniqueID
' Construct JavaScript script
script = "var e = document.createEventObject(); e.shiftKey = true; " & _
"document.getElementById('" &id & "').fireEvent('onclick', e);"
' Run it on the browser
Browser("B").Page("P").Object.parentWindow.eval script
Если ничего не помогло, вы можете попробовать написать небольшой веб-расширяемый проект и поддержать эту функцию.