我必须右键单击网络元素。我尝试了以下方法:
为简化代码,假设 webElem
引用有效的 Browser().Page().WebElement()
。
1)
Set obj=createobject("mercury.devicereplay")
getX = webElem.GetROProperty("abs_x")
getY = webElem.GetROProperty("abs_y")
'obj.MouseClick getX, getY,RIGHT_MOUSE_BUTTON
上面的代码不工作
2)
webElem.RightClick
此代码也不起作用
3) 以下代码有效:
Setting.WebPackage("ReplayType") = 2
webElem.RightClick
Setting.WebPackage("ReplayType") = 1
我的问题是:
为什么我必须更改设备重播类型才能使右键单击起作用?哪里,点击方法工作正常。
为什么通过
Mercury.DeviceReplay
对象,MouseClick
方法不起作用?我怎样才能通过
FireEvent
方法做到这一点? (请详细解释FireEvent
方法,仅供引用:我是 QTP 新手)还有哪些其他方法可以做到这一点?
谁能解释一下为什么有些方法有效而有些方法无效。
谢谢, 斯里坦
最佳答案
默认情况下,QTP 使用事件重播 在 Web 元素上运行大部分步骤,这意味着它发送 DOM events到底层 DOM 元素。当一个人与网页交互时,浏览器会生成许多 DOM 事件(例如 mousemove
mousedown
contextmenu
),Web 应用程序可能依赖于任何这些事件以触发所需的行为。 QTP 不知道每个 Web 应用程序将使用哪些事件,因此会重现 QTP 开发人员认为有趣的子集(例如 Click
QTP 重播 mousedown
、mouseup
和 click
。对于 RightClick
,某处还有一个 contextmenu
事件(我不记得顺序了)并且没有 点击
。
您在 #2 中尝试的操作失败的可能原因是应用程序期望的其他事件不是由 QTP 创建的。
当您指定 ReplayType=2
(例如 #3)时,您告诉 QTP 的网络包使用设备重放,这意味着它物理上 将鼠标移动到请求的位置并执行操作。这意味着浏览器认为真人正在移动鼠标,并且会重现与人类执行操作时完全相同的事件。
您应该得到与案例 #1 完全相同的结果(显式使用 DeviceReplay
)。我能想到它仍然失败的两个原因。
- 在您的代码示例中,您注释掉了行
'obj.MouseClick getX, getY,RIGHT_MOUSE_BUTTON
,这可能是一个复制/粘贴错误,但如果这也是您尝试运行的内容,它会解释为什么什么都没发生。 - 更可能的解释是您正在使用
abs_x
和abs_y
重播点击,这是WebElement
的左上角> 也许这没有到达正确的 DOM 元素。 device replay 模式下RightClick
的方式与您的实现不同的是,它在WebElement
中间单击(默认情况下)尝试获取元素的宽度和高度并执行:obj.MouseClick getX+(width/2), getY+(height/2), RIGHT_MOUSE_BUTTON
还有另一种执行右键单击的方法,那就是:
webElem.Click micNoCoordinates, micNoCoordinates, micRightBtn
但我建议不要使用它,因为 webElem.RightClick
如果不是更好的话,至少应该也能正常工作。
关于qtp - 右键单击QTP中的webelement有哪些不同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13815223/