LoginSignup
3
3

More than 5 years have passed since last update.

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

Posted at

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では未実装。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3