我正在测试的应用程序中有一些按钮和菜单需要实际点击才能发送所有信息,而 FireEvent 样式的点击似乎并没有削减它。TestPartner 和 QTP 都可以使用实际点击。TestPartner 总是这样做(慢),而 QTP 通过将“ReplayType”从 1 更改为 2 来做到这一点。
Setting.WebPackage("ReplayType") = 2
所以我的问题是。反正有没有在 WatiN 或 Selenium 中获得真正的点击?我一直找不到那个选项。
谢谢你,乔什
我正在测试的应用程序中有一些按钮和菜单需要实际点击才能发送所有信息,而 FireEvent 样式的点击似乎并没有削减它。TestPartner 和 QTP 都可以使用实际点击。TestPartner 总是这样做(慢),而 QTP 通过将“ReplayType”从 1 更改为 2 来做到这一点。
Setting.WebPackage("ReplayType") = 2
所以我的问题是。反正有没有在 WatiN 或 Selenium 中获得真正的点击?我一直找不到那个选项。
谢谢你,乔什
Selenium 2 可以触发真正的点击,而不是像 Selenium 1 那样尝试合成点击和击键。它与操作系统进行了很多交互以在本机上执行这些操作,这解决了很多 Selenium 1 问题,例如它是触发单击还是 mouseup 或 mousedown?
Selenium 2 处于其第二个 alpha 阶段,目前非常稳定。您可以从http://code.google.com/p/selenium/downloads/list获得 Selenium 2.0a2 。
我一直在研究 .NET 绑定,并且对它们的发展方式非常满意。
使用 WatiN,可以访问 IE 窗口中元素的“本机”界面。使用它,您可以获得任何元素的屏幕坐标。
using mshtml; //Add a reference to Microsoft.mshtml that comes with WatiN.
using WatiN.Core.Native.InternetExplorer;
public static System.Drawing.Point GetScreenPoint(IEElement element)
{
IHTMLElement nativeElement = element.AsHtmlElement;
IHTMLElement2 offsetElement = (IHTMLElement2)nativeElement;
IHTMLRect clientRect = offsetElement.getBoundingClientRect();
IHTMLDocument2 doc = (IHTMLDocument2)nativeElement.document;
IHTMLWindow3 window = (IHTMLWindow3)doc.parentWindow;
int windowLeft = window.screenLeft;
int windowTop = window.screenTop;
int elementLeft = clientRect.left;
int elementTop = clientRect.top;
int width = nativeElement.offsetWidth;
int height = nativeElement.offsetHeight;
int clickX = windowLeft + elementLeft + (width / 2);
int clickY = windowTop + elementTop + (height / 2);
return new System.Drawing.Point(clickX, clickY);
}
要使用它:
Button myButton = browser.Button(Find.ById("myButton"));
System.Drawing.Point clickPoint = GetScreenPoint((IEElement)myButton.NativeElement);
MyClick(clickPoint);
显然元素必须是可见的。我不知道如何检查那个副手,但我认为你可以改变 body 的 scrollTop 和 scrollLeft 属性来滚动。
您还需要一种方法来实际进行点击,但可能已经在 stackoverflow 上找到了答案。
当ReplayType设置为设备(2) 时,QTP 实际移动鼠标并执行单击(可以看到鼠标光标移动)。我对 Selenium 不是很熟悉,但据我所知,重播是在纯 JavaScript 中完成的,因此它可以触发 DOM 事件(就像 QTP 在 event 中所做的那样ReplayMode),但它不能像 QTP 那样模拟真正的点击。