3

我必须右键单击一个网络元素。我尝试了以下方法:

为简单起见,假设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

我的问题是:

  1. 为什么我必须更改设备重播类型才能使右键单击工作?其中,单击方法工作正常。

  2. 为什么,通过Mercury.DeviceReplay对象,MouseClick方法不起作用?

  3. 我怎样才能通过FireEvent方法做到这一点?(请详细解释FireEvent方法,仅供参考:我是QTP的新手)

  4. 还有什么其他方法可以做到这一点?

谁能解释一下为什么有些方法有效而有些方法无效。

谢谢, 斯里塔姆

4

1 回答 1

3

默认情况下,QTP 使用事件重放在 Web 元素上运行大多数步骤,这意味着它将DOM 事件发送到底层 DOM 元素。当一个人与网页交互时,浏览器会生成许多 DOM 事件(例如mousemove mousedown contextmenu),并且 Web 应用程序可能会依赖这些事件中的任何一个来触发所需的行为。QTP 不知道每个 Web 应用程序将使用哪些事件,因此会重现 QTP 的开发人员认为有趣的子集(例如ClickQTP replaysmousedown和。因为某处mouseup还有一个事件(我不记得顺序)并且有不。clickRightClickcontextmenuclick

您在#2中尝试的操作失败的可能原因是因为应用程序期望的其他事件不是由 QTP 创建的。

当您指定ReplayType=2(如案例#3)时,您告诉 QTP 的 web 包使用设备重放,这意味着它将鼠标物理移动到请求的位置并执行操作。这意味着浏览器认为一个真实的人正在移动鼠标,并将重现与人类执行操作时完全相同的事件。

您应该得到与案例#1完全相同的结果(明确使用DeviceReplay)。我可以想到它仍然失败的两个原因。

  1. 在您的代码示例中,您已'obj.MouseClick getX, getY,RIGHT_MOUSE_BUTTON注释掉该行,这可能是复制/粘贴错误,但如果这也是您尝试运行的内容,它将解释为什么什么也没发生。
  2. 更可能的解释是您正在使用abs_xabs_y重播点击,这是左上角的WebElement,也许这没有到达正确的 DOM 元素。设备重放模式与您的实现不同的方式是它在(RightClick默认情况下)尝试获取元素的宽度和高度并执行以下操作的中间单击:WebElementobj.MouseClick getX+(width/2), getY+(height/2), RIGHT_MOUSE_BUTTON

还有另一种执行右键单击的方法,那就是:

webElem.Click micNoCoordinates, micNoCoordinates, micRightBtn

但我建议反对它,因为webElem.RightClick如果不是更好的话,至少应该也能正常工作。

于 2012-12-11T08:14:56.340 回答