【问题标题】:How to simulate a mouse click on a UIWebView in Cocoa for the iPhone?如何在 Cocoa for iPhone 中模拟鼠标点击 UIWebView?
【发布时间】:2011-02-11 18:45:37
【问题描述】:

我正在尝试为 iPhone 应用程序设置自动化单元测试。我正在使用 UIWebView 并且需要模拟对不同链接的点击。我试过doing this with JavaScript,但它不会产生与我手动单击链接时相同的结果。主要问题在于设置了target 属性的链接。

当您手动单击标准“弹出”链接(例如<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 无效。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我尝试使用类似于此处提供的示例的代码:cocoawithlove.com/2008/10/…,但它不起作用。在普通的 UIView 子类上,它显然会调用 touchesBegan/touchesEnded 方法,因为代码示例直接调用它。问题在于,当您将其发送到 UIWebView 时,它不会传递该事件,就好像用户在该点点击了恰好位于该位置的任何 HTML 元素一样。
    【解决方案2】:

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

    记录和发送事件的私人呼叫是GraphicServices/GSEvent.h 的一部分,标准使用风险自负。每个 UIEvent 实际上都是一个引用 __GSEvent 的 UIInternalEvent,因此对于记录,您可以使用 _gsEvent 属性来获取底层事件。

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

    我没有使用过这些东西,但看起来 GSSendSystemEvent 是一个不错的起点。

    【讨论】:

      【解决方案3】:

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

      但是,似乎没有用于构造 UIEvent 的公共 API,因此您可能不走运。

      【讨论】:

      • 我尝试按照cocoawithlove.com/2008/10/… 中的描述创建一个 UIEvent,我什至稍微修改了代码以使人工 UITouch 的属性与真实 UITouch 的属性完全相同。然而,这仍然不会触发对浏览器的简单点击。
      【解决方案4】:

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

      --- 刚刚发现您对这个链接上的示例不太满意。我可以建议的唯一其他选择是在从测试运行时操作 html 以替换任何 _target 链接(您知道 UIWebView 在手动单击时会正确处理这些,所以我认为单元测试可以使用一个小边框?)。

      this answer 中的精彩演练

      【讨论】:

      • 感谢您的建议。不幸的是,手动修改链接并没有帮助,因为我正在测试按下这样的链接时的行为。如果我修改链接,则测试不会测试正确的行为,然后就没用了。
      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多