2010-04-24 32 views
2

我正在嘗試爲iPhone應用程序設置自動單元測試。我使用的是UIWebView,需要模擬不同鏈接上的點擊。我試過doing this with JavaScript,但它不會產生與我手動點擊鏈接時相同的結果。主要問題是鏈接的屬性設置爲target如何在iPhone的Cocoa中模擬鼠標點擊UIWebView?

當您手動點擊標準的「​​彈出」鏈接(例如<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。

回答

1

我想你可以通過直接呼籲UIViewtouchesBegan/touchesEnded方法(檢查UIResponder類)模擬觸摸。

+0

尼斯演練我試圖使用類似於示例代碼這裏提供:http://cocoawithlove.com/2008/10/synthesizing-touch-event-on-iphone.html但它不工作。在一個普通的UIView子類上,它顯然會調用touchesBegan/touchesEnded方法,因爲代碼示例直接調用它。問題是,當你將它發送到UIWebView時,它不會傳遞該事件,就好像用戶在該位置點擊任何HTML元素時所點擊的那樣。 – Senseful 2010-04-28 17:51:12

0

對於您的具體情況,在模擬器中測試並使用MacOS事件生成器進行點擊可能就足夠了。

用於記錄和發送活動的私人電話是GraphicServices/GSEvent.h的一部分,標準使用的風險自負。每個UIEvent實際上都是一個引用__GSEvent的UIInternalEvent,因此對於錄製,您可以使用_gsEvent屬性來獲取基礎事件。

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

我沒有使用過任何這方面的東西,但它看起來像GSSendSystemEvent將是一個良好的開端。

1

這樣做的正確方法是構建自己的UIEvent,然後通過-sendEvent:方法將此事件發佈到您的UIApplication實例。

但是,似乎沒有構建UIEvent的公共API,因此您可能會不幸運。

+1

我試着創建一個UIEvent,如http://cocoawithlove.com/2008/10/synthesizing-touch-event-on-iphone.html所述,我甚至修改了一下代碼,使人造UITouch的屬性完全相同因爲它們是一個真正的UITouch。但是,這仍然不會觸發瀏覽器的簡單點擊。 – Senseful 2010-05-12 00:46:45

1

你能存儲的點擊的數據結構,你在測試中使用,然後模擬這裏所描述described here

標準觸摸事件的位置---只要發現你沒有帶多少運氣這個鏈接的例子。我可以建議的唯一其他選項是在測試中運行html以替換任何_target鏈接(您知道UIWebView在手動單擊時正確處理這些鏈接,因此我認爲單元測試可以使用小型陷阱?)。在this answer

+0

感謝您的建議。不幸的是,手動修改鏈接並沒有幫助,因爲我正在測試按下這樣的鏈接時的行爲。如果我修改鏈接,測試不會測試正確的行爲,然後是無用的。 – Senseful 2010-05-12 00:49:32