Frank-Cucumberを使ってiOSアプリへアクセスするまとめ。
- Cucumber-driverを 使わずに
pry
やrspec
から叩くことを狙います。 -
frank console
も使わないようにします。 - Frank-Cucumner 1.1.12 を対象にしています。
まとめ
以下で一通り叩けるようになります。
require 'frank-cucumber/cli'
require 'frank-cucumber/rect'
include Frank::Cucumber::FrankHelper
Frank::Cucumber::FrankHelper.use_shelley_from_now_on
- アクセスしたいViewをShelly selectorで選択して
- FrankHelperにメソッドがあれば、それを使う。
- 無ければ
frankly_map(<セレクタ>, <ObjCメソッド名>, パラメータ, ...)
を呼ぶ。
接続
- 参考:
/usr/local/bin/frank
$ pry -r frank-cucumber/cli
pry> include Frank::Cucumber::FrankHelper
=> Object
pry> frankly_dump
{
"frame": { ... }
}
(JSONが表示される)
frankly_dumpの中身
- 参考:
Frank::Console#frankly_dump
pry> j=frank_server.send_get('dump');nil
pry> JSON.parse(j)
{"frame"=>{...}}
(Hashオブジェクトを得ることができる)
各種操作
touch
- 参考:
Frank::CLI#console
pry> Frank::Cucumber::FrankHelper.use_shelley_from_now_on
pry> sel="view:'UIRoundedRectButton' marked:'connect'"
pry> touch(sel)
キーボード入力
- 参考:
Frank::Cucumber#KeyboardHelper
pry> sel="view:'UITextFIeldLabel' marked:'192.168.1.1'"
pry> fill_in '192.168.1.1', {:with=>"127.0.0.1", :append_return=>true}
又は
pry> touch(sel)
pry> type_into_keyboard("127.0.0.1", :append_return=>true)
ドラッグ
任意の点から任意の点へのドラッグは未対応(らしい)が、「特定ののViewの中央から任意の位値」へのドラッグは可能。
# GLKView中央から上へ5pxの場所へ
pry> require 'frank-cucumber/rect'
pry> sel = "view:'GLKView' index:0"
pry> f = accessibility_frame(sel)
pry> f.center
=> #<OpenStruct x=160.0, y=250.0>
pry> frankly_map(sel, 'FEX_dragWithInitialDelayToX:y:', 160, 255)
pickerの選択
FrankHelperには無いがiOS-APIを叩けばできる。
- 例: 0番目のUIPickerViewの、0番目の項目の2番目の要素を選択
pry> frankly_map "view:'UIPickerView' index:0", \
'selectRow:inComponent:animated:', 3-1, 0, false
元のAPIは UIPickerView
の
-(void)selectRow:(NSInteger)row
inComponent:(NSInteger)component
animated:(BOOL)animated
要素の確認
エレメントの存在の確認
- 参考:
FrankHelper#check_element_exists
pry> element_exists "view:'GLKView'"
#=> true
Arrayでない点に注意
hidden属性の確認
- 参考:
FrankHelper#check_element_exists_and_is_visible
pry> element_is_not_hidden "view:'GLKView'"
#=> true
Arrayでない点に注意
enabled属性の確認
標準では未対応だが組み合わせで。
def element_is_enabled( sel )
return false unless
element_is_not_hidden(sel)
matches = frankly_map(sel, 'isEnabled')
matches.delete(false)
!matches.empty?
end
pry> element_is_enabled "view:'UIRoundedRectButton' marked:'exec'"
#=> true
表示されていることの確認
ボタンなら touch
が一番簡単。
表示されていない場合は RuntimeError
になる。
hidden属性を得るには
pry> frank_map sel, 'FEX_isVisible'
#=> Array<Boolean>
スクリーンキャプチャ
フルスクリーンキャプチャ
- 参考:
ImageCaptureRoute#handleRequestForPath:withConnection:
pry> frankly_screenshot "fullscreen.png"
#=> ファイルに保存される
部分キャプチャ
pry> frankly_screenshot "rect.png","0.0.100.200"
#=> (0,0)からwidth=100, height=200。
ピリオド区切り。
カンマで区切るとiOSアプリが落ちる。
指定のViewのキャプチャ
1.1.12では未実装。