如何在Cocoa中为iPhone模拟鼠标点击UIWebView?

时间:2010-04-24 02:59:36

标签: iphone cocoa-touch automation uiwebview mouseclick-event

我正在尝试为iPhone应用程序设置自动单元测试。我正在使用UIWebView,需要模拟不同链接上的点击。我尝试了doing this with JavaScript,但它没有产生与手动点击链接时相同的结果。主要问题是链接的target属性设置为。{/ p>

当您手动点击标准“弹出”链接(例如<a href="http://example.com" target="_blank">)时,UIWebView将忽略点击事件,并且不会导航到任何内容。如果您尝试通过JavaScript dispatchEvent()方法自动点击此相同的链接,UIWebView将完全忽略target属性,并将在当前页面中正常打开链接。

我需要进行自动单元测试才能生成完全与手动点击链接时相同的结果。

我相信这种自动化单元测试正常工作的唯一方法是在特定的x / y坐标(即链接所在的位置)模拟鼠标点击。由于单元测试仅在内部使用,因此私有API调用很好。

似乎这应该是可能的,因为iPhone应用程序isimulate似乎做了类似的事情。

有没有办法在框架中执行此操作?

我发现了一个名为Simulate mouse click to window instead of screen的类似问题,但我猜这种方法仅适用于OS X,而不适用于iPhone OS。

4 个答案:

答案 0 :(得分:1)

我想您可以直接在touchesBegan上调用touchesEnded / UIView方法来模拟触摸。(查看UIResponder类)。

答案 1 :(得分:1)

执行此操作的正确方法是构建您自己的UIEvent,然后通过其UIApplication方法将此事件发布到您的-sendEvent:实例。

但是,似乎没有用于构建UIEvent的公共API,因此您可能会运气不佳。

答案 2 :(得分:1)

您是否可以将点击的位置存储在您在测试中使用的数据结构中,然后按照此处所述模拟标准触摸事件described here

---只是发现你在这个链接上的例子没有太多运气。我可以建议的唯一其他选项是在从测试运行时操作html来替换任何_target链接(你知道UIWebView在手动点击时可以正确处理这些,所以我认为一个小的bodge可以用于单元测试吗?)。

this answer

中的精彩演练

答案 3 :(得分:0)

对于您的具体情况,在模拟器中测试并使用MacOS事件生成器进行点击可能就足够了。

录制和发送活动的私人电话是GraphicServices / GSEvent.h的一部分,标准使用由您自行承担风险免责声明。每个UIEvent实际上都是一个引用__GSEvent的UIInternalEvent,因此对于记录,您可以使用_gsEvent属性来获取基础事件。

@property (nonatomic,assign) struct __GSEvent *_gsEvent;

我没有使用任何这些东西,但看起来GSSendSystemEvent是一个很好的起点。