2

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

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

我需要一个自动单元测试来产生与手动单击链接时完全相同的结果。

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

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

有没有办法在框架中做到这一点?

我发现了一个类似的题为Simulate mouse click to window 而不是 screen 的问题,但是我猜这种方法只对 OS X 有效,对 iPhone OS 无效。

4

4 回答 4

1

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

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

这个答案很好的演练

于 2010-05-11T14:02:20.840 回答
1

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

于 2010-04-24T03:04:33.083 回答
1

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

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

于 2010-05-06T17:40:52.987 回答
0

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

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

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

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

于 2010-05-06T17:09:35.627 回答