Posted at

Frank-Cucumberをpryから叩いてみた

More than 5 years have passed since last update.

Frank-Cucumberを使ってiOSアプリへアクセスするまとめ。


  • Cucumber-driverを 使わずに pryrspecから叩くことを狙います。


  • 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


  1. アクセスしたいViewをShelly selectorで選択して

  2. FrankHelperにメソッドがあれば、それを使う。

  3. 無ければ 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では未実装。