worm 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/screen.rb +156 -0
- data/lib/selector_builder.rb +6 -0
- data/lib/worm.rb +66 -0
- data/spec/screen_spec.rb +83 -0
- data/spec/selector_builder_spec.rb +12 -0
- metadata +84 -0
data/lib/screen.rb
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
class Screen
|
2
|
+
|
3
|
+
def initialize(screen_data = nil)
|
4
|
+
if screen_data.nil?
|
5
|
+
@screen_data = MultiJson.load(Frank::Cucumber::Gateway.new.send_get('dump'))
|
6
|
+
else
|
7
|
+
@screen_data = screen_data
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def all_views
|
12
|
+
add_views(@screen_data)
|
13
|
+
@views
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_views(json)
|
17
|
+
json["subviews"].each do |view|
|
18
|
+
add_view view
|
19
|
+
add_views(view) unless view["subviews"].count == 0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def view_by_id(id)
|
24
|
+
@found_view = nil
|
25
|
+
view_by_id_with_data(@screen_data, id)
|
26
|
+
@found_view
|
27
|
+
end
|
28
|
+
|
29
|
+
def view_by_label(label)
|
30
|
+
@found_view = nil
|
31
|
+
view_by_label_with_data(@screen_data, label)
|
32
|
+
@found_view
|
33
|
+
end
|
34
|
+
|
35
|
+
def view_class(label)
|
36
|
+
view_by_label(label)["class"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def view_frame_width(label)
|
40
|
+
view_frame(label)["size"]["width"]
|
41
|
+
end
|
42
|
+
|
43
|
+
def view_frame_height(label)
|
44
|
+
view_frame(label)["size"]["height"]
|
45
|
+
end
|
46
|
+
|
47
|
+
def view_frame(label)
|
48
|
+
view_by_label(label)["frame"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def view_is_visible(label)
|
52
|
+
view_by_label(label)["isHidden"] == 0
|
53
|
+
end
|
54
|
+
|
55
|
+
def view_x(label)
|
56
|
+
view_by_label(label)["accessibilityFrame"]["origin"]["x"]
|
57
|
+
end
|
58
|
+
|
59
|
+
def view_y(label)
|
60
|
+
view_by_label(label)["accessibilityFrame"]["origin"]["y"]
|
61
|
+
end
|
62
|
+
|
63
|
+
def view_origin(label)
|
64
|
+
view_by_label(label)
|
65
|
+
end
|
66
|
+
|
67
|
+
def view_tag(label)
|
68
|
+
view_by_label(label)["tag"]
|
69
|
+
end
|
70
|
+
|
71
|
+
def view_accessibility_height(label)
|
72
|
+
view_by_label(label)["accessibilityFrame"]["size"]["height"]
|
73
|
+
end
|
74
|
+
|
75
|
+
def view_accessibility_width(label)
|
76
|
+
view_by_label(label)["accessibilityFrame"]["size"]["width"]
|
77
|
+
end
|
78
|
+
|
79
|
+
def get_class(view_data)
|
80
|
+
view_data["class"]
|
81
|
+
end
|
82
|
+
|
83
|
+
def get_label(view_data)
|
84
|
+
view_data["accessibilityLabel"]
|
85
|
+
end
|
86
|
+
|
87
|
+
def accessible_buttons
|
88
|
+
buttons = []
|
89
|
+
all_views.each do |view|
|
90
|
+
if get_class(view).include? 'Button'
|
91
|
+
buttons << get_label(view) unless get_label(view).nil?
|
92
|
+
end
|
93
|
+
end
|
94
|
+
buttons
|
95
|
+
end
|
96
|
+
|
97
|
+
def accessible_text_fields
|
98
|
+
texts = []
|
99
|
+
all_views.each do |view|
|
100
|
+
if get_class(view).include? 'UITextField'
|
101
|
+
texts << get_label(view) unless get_label(view).nil?
|
102
|
+
end
|
103
|
+
end
|
104
|
+
texts
|
105
|
+
end
|
106
|
+
|
107
|
+
def accessible_tables
|
108
|
+
tables = []
|
109
|
+
all_views.each do |view|
|
110
|
+
if get_class(view).include? 'TableView'
|
111
|
+
tables << get_label(view) unless get_label(view).nil?
|
112
|
+
end
|
113
|
+
end
|
114
|
+
tables
|
115
|
+
end
|
116
|
+
|
117
|
+
def accessible_labels
|
118
|
+
labels = []
|
119
|
+
all_views.each do |view|
|
120
|
+
if get_class(view).include? 'Label'
|
121
|
+
labels << get_label(view) unless get_label(view).nil?
|
122
|
+
end
|
123
|
+
end
|
124
|
+
labels
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
def add_view(view)
|
129
|
+
@views = [] unless @views
|
130
|
+
@views << view
|
131
|
+
end
|
132
|
+
|
133
|
+
def view_by_id_with_data(json,id)
|
134
|
+
if json["uid"] == id
|
135
|
+
@found_view = json
|
136
|
+
else
|
137
|
+
if json["subviews"].count > 0
|
138
|
+
json["subviews"].each do |view|
|
139
|
+
view_by_id_with_data(view,id)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def view_by_label_with_data(json,label)
|
146
|
+
if json["accessibilityLabel"].eql? label
|
147
|
+
@found_view = json
|
148
|
+
else
|
149
|
+
if json["subviews"].count > 0
|
150
|
+
json["subviews"].each do |view|
|
151
|
+
view_by_label_with_data(view,label)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
data/lib/worm.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'frank-cucumber/console'
|
2
|
+
require 'frank-cucumber/frank_helper'
|
3
|
+
require 'screen'
|
4
|
+
require 'selector_builder'
|
5
|
+
require 'multi_json'
|
6
|
+
|
7
|
+
class Worm
|
8
|
+
include Frank::Cucumber::FrankHelper
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
Frank::Cucumber::FrankHelper.use_shelley_from_now_on
|
12
|
+
end
|
13
|
+
|
14
|
+
def use_physical
|
15
|
+
Frank::Cucumber::FrankHelper.test_on_physical_device_via_bonjour
|
16
|
+
end
|
17
|
+
|
18
|
+
def press(label)
|
19
|
+
screen = Screen.new
|
20
|
+
Frank::Console.new.touch(SelectorBuilder.build(screen.view_class(label), label))
|
21
|
+
end
|
22
|
+
|
23
|
+
def buttons
|
24
|
+
Screen.new.accessible_buttons
|
25
|
+
end
|
26
|
+
|
27
|
+
def text_fields
|
28
|
+
Screen.new.accessible_text_fields
|
29
|
+
end
|
30
|
+
|
31
|
+
def labels
|
32
|
+
Screen.new.accessible_labels
|
33
|
+
end
|
34
|
+
|
35
|
+
def tables
|
36
|
+
Screen.new.accessible_tables
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_text(text, label)
|
40
|
+
screen = Screen.new
|
41
|
+
Frank::Console.new.touch(SelectorBuilder.build(screen.view_class(label), text))
|
42
|
+
end
|
43
|
+
|
44
|
+
def type(text)
|
45
|
+
Frank::Console.new.type_into_keyboard(text)
|
46
|
+
end
|
47
|
+
|
48
|
+
def landscape
|
49
|
+
frankly_set_orientation('landscape')
|
50
|
+
end
|
51
|
+
|
52
|
+
def portrait
|
53
|
+
frankly_set_orientation('portrait')
|
54
|
+
end
|
55
|
+
|
56
|
+
def touch_alert(button)
|
57
|
+
touch("view:'UIAlertButton' marked:'#{button}'")
|
58
|
+
end
|
59
|
+
|
60
|
+
def selector(label)
|
61
|
+
screen = Screen.new
|
62
|
+
SelectorBuilder.build(screen.view_class(label), label)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
data/spec/screen_spec.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'screen'
|
2
|
+
require 'multi_json'
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Screen do
|
6
|
+
|
7
|
+
let(:json) {MultiJson.load('{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"subviews":[{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":44,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"testLabel","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UIView"},{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel1","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"},{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel2","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"},{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":2,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"textField1","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UITextField"},{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":2,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"textField2","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UITextField"}],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIWindow"}')}
|
8
|
+
let(:server){Frank::Cucumber::Gateway.any_instance.stub(:send_get).with('dump').and_return(json)}
|
9
|
+
let(:screen){ screen = Screen.new(json)}
|
10
|
+
|
11
|
+
let(:json1) {MultiJson.load('{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel1","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"}')}
|
12
|
+
let(:server1){Frank::Cucumber::Gateway.any_instance.stub(:send_get).with('dump').and_return(json)}
|
13
|
+
let(:screen1){ screen = Screen.new(json)}
|
14
|
+
|
15
|
+
context 'getting views' do
|
16
|
+
it 'can get all the views' do
|
17
|
+
screen.all_views.count == 2
|
18
|
+
end
|
19
|
+
it 'can get a view by id' do
|
20
|
+
screen.view_by_id(1).should == json
|
21
|
+
end
|
22
|
+
it 'can get a nested view by id' do
|
23
|
+
screen.view_by_id(44).should == MultiJson.load('{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":44,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"testLabel","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UIView"}')
|
24
|
+
end
|
25
|
+
it 'can get a view by label' do
|
26
|
+
screen.view_by_label("testLabel").should == MultiJson.load('{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":44,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"testLabel","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UIView"}')
|
27
|
+
end
|
28
|
+
it 'can get a nested view by label' do
|
29
|
+
screen.view_by_label('buttonLabel1').should == MultiJson.load('{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel1","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"}')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context 'getting view properties by label' do
|
33
|
+
it 'can get the view class' do
|
34
|
+
screen.view_class("testLabel").should == "UIView"
|
35
|
+
end
|
36
|
+
it 'can get the nested view class' do
|
37
|
+
screen.view_class("textField1").should == "UITextField"
|
38
|
+
end
|
39
|
+
it 'can get the view width' do
|
40
|
+
screen.view_frame_width("testLabel").should == 148
|
41
|
+
end
|
42
|
+
it 'can get the view height' do
|
43
|
+
screen.view_frame_height("testLabel").should == 888
|
44
|
+
end
|
45
|
+
it 'can get the view visibility' do
|
46
|
+
screen.view_is_visible("testLabel").should be_true
|
47
|
+
end
|
48
|
+
it 'can get the view x-coordinates' do
|
49
|
+
screen.view_x("testLabel").should == 20
|
50
|
+
end
|
51
|
+
it 'can get the view y-coordinates' do
|
52
|
+
screen.view_y("testLabel").should == 0
|
53
|
+
end
|
54
|
+
it 'can get the view tag' do
|
55
|
+
screen.view_tag("testLabel").should == 0
|
56
|
+
end
|
57
|
+
it 'can get the view accessibility frame height' do
|
58
|
+
screen.view_accessibility_height("testLabel") == 444
|
59
|
+
end
|
60
|
+
it 'can get the view accessibility frame width' do
|
61
|
+
screen.view_accessibility_height("testLabel") == 555
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'getting view properties from raw json' do
|
65
|
+
it 'can get the class from raw view data' do
|
66
|
+
screen.get_class(json1).should == "UIButton"
|
67
|
+
end
|
68
|
+
it 'can get the accessibility label from raw view data' do
|
69
|
+
screen.get_label(json1).should == "buttonLabel1"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
context 'getting all view elements' do
|
73
|
+
it 'can get a list of all the buttons on the screen' do
|
74
|
+
screen.accessible_buttons.should == ["buttonLabel1", "buttonLabel2"]
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'can get a list of all the text fields' do
|
78
|
+
screen.accessible_text_fields.should == ["textField1", "textField2"]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'selector_builder'
|
3
|
+
|
4
|
+
describe SelectorBuilder do
|
5
|
+
context 'building a selector' do
|
6
|
+
it 'should build a valid selector' do
|
7
|
+
type = 'UILabel'
|
8
|
+
label = 'testLabel'
|
9
|
+
SelectorBuilder.build(type, label).should == "view:'UILabel' marked:'testLabel'"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: worm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jeremy Stewart
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: frank-cucumber
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.1.8
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.1.8
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: An irb driver for Frankified apps
|
47
|
+
email: jlstewart379@gmail.com
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- lib/worm.rb
|
53
|
+
- lib/selector_builder.rb
|
54
|
+
- lib/screen.rb
|
55
|
+
- spec/selector_builder_spec.rb
|
56
|
+
- spec/screen_spec.rb
|
57
|
+
homepage: https://github.com/jlstewart379/worm.git
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.8.24
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: An irb driver for Frankified apps
|
81
|
+
test_files:
|
82
|
+
- spec/selector_builder_spec.rb
|
83
|
+
- spec/screen_spec.rb
|
84
|
+
has_rdoc:
|