rufus 0.4 → 0.5

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZWEwMjYzOGIxOTIzNTk2MGQ5ZTZiZGM2ZWJhNzA4ZDA3ZjhmN2E0MQ==
4
+ ZGE1MmQwYzQ3YzA1YTFjZDQzYmJkMzI5OTdlYWJiZTA0MjMxNmEwMw==
5
5
  data.tar.gz: !binary |-
6
- YTRjZWViZGRlMWQ4ODc0MWI0NWYzOTU3ZTk5MDgwNTE2NDkzM2JhYg==
6
+ ZDk3OGRlZDVkYjdlOTQ0MTEzNzcyZTYyZjcxOWViOTdkYmNhOTEzNQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NGQxNTEzZDRiNTRmYWI1YTdmMGFhYTJmMmJmMmU0NmM3Mjg3MGRkY2E3YjQx
10
- MGIzNGU0NTYzOTViZWMwY2I2M2QxZmRhOWE2ZmNiMzNmNmRkOWQwOWJkZDFm
11
- OTFmNWU3NDA1YzkwOWU5NDg0MjE2ZTljN2UwYTc5ZmI5YzEzYTg=
9
+ ZWZiZTJkZTBjMzJhMDA0OTAxNWE0NjQyYzlhM2Y3ZDYzMTQ0MmQ1NmE3ZTFl
10
+ ZmFhNDQwZDE1YWM5N2I3Mjc2ODBmYjdjMTNjMDY3MDIwNmE0YWYwMjc0ZTA5
11
+ MWJlZmIwYzIyZTIwMzk1YjUzYjVmMzZmMjE1YjdjOTE3NWUzNzU=
12
12
  data.tar.gz: !binary |-
13
- YWVlYTUxNDM1MDRlY2JjMTE4ZTMzYWFjNzA3NjI4ZGM4YWJmZTRhOTg1ZDE3
14
- ZTY2NGYzYWQyNmRkZmMxMzg2NmJiY2M2N2VhYThkZjIyZTczOTI0NzAzNTU3
15
- M2I3MTA3MDJmODZhMGFlZDM0ZTBmZDk4NzFmYzliOTcyNGJhNDQ=
13
+ NDNjNGRlYjY1ODAwYThkNTQ0ZTQyMmM1ZmVhNDAxMWM4Yjg1MDgzZGMzYjk0
14
+ MDllYzJkMzY5Y2FiYzViZWUzNjdhYjIyN2FiZDkzYmMyMTA5ZGQ5MWI0YjBi
15
+ MDljYzViMTcyYTA0ZjE2NTQ0YTExNWEwNzQzYWIwZTNhNmJlNTc=
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm: 1.9.3
3
+ script: rake specs
@@ -9,5 +9,7 @@
9
9
  #import <UIKit/UIKit.h>
10
10
 
11
11
  @interface EnabledPageViewController : UIViewController
12
+ @property (weak, nonatomic) IBOutlet UITextField *enabledTextField;
13
+ @property (weak, nonatomic) IBOutlet UITextField *notEnabledTextField;
12
14
 
13
15
  @end
@@ -13,26 +13,22 @@
13
13
  @end
14
14
 
15
15
  @implementation EnabledPageViewController
16
+ @synthesize enabledTextField, notEnabledTextField;
17
+
16
18
 
17
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
18
- {
19
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
20
- if (self) {
21
- // Custom initialization
22
- }
23
- return self;
24
- }
25
19
 
26
- - (void)viewDidLoad
20
+ -(void)viewDidLoad
27
21
  {
28
- [super viewDidLoad];
29
- // Do any additional setup after loading the view from its nib.
22
+ [enabledTextField setEnabled:NO];
23
+ [notEnabledTextField setEnabled:NO];
24
+ [self performSelector:@selector(enableTheTextField) withObject:nil afterDelay:5];
30
25
  }
31
26
 
32
- - (void)didReceiveMemoryWarning
27
+ -(void)enableTheTextField
33
28
  {
34
- [super didReceiveMemoryWarning];
35
- // Dispose of any resources that can be recreated.
29
+ [enabledTextField setEnabled:YES];
36
30
  }
37
31
 
32
+
33
+
38
34
  @end
@@ -1,20 +1,42 @@
1
1
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="4437" systemVersion="13A451" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
2
+ <document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="4510" systemVersion="12F45" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
3
3
  <dependencies>
4
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3662"/>
4
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
5
5
  </dependencies>
6
6
  <objects>
7
7
  <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="EnabledPageViewController">
8
8
  <connections>
9
+ <outlet property="enabledTextField" destination="CNH-j4-jZp" id="igO-L4-d1r"/>
10
+ <outlet property="notEnabledTextField" destination="C8U-NZ-tS3" id="pGf-qt-wJY"/>
9
11
  <outlet property="view" destination="2" id="3"/>
10
12
  </connections>
11
13
  </placeholder>
12
14
  <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
13
15
  <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
14
- <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
16
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1004"/>
15
17
  <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
18
+ <subviews>
19
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="This text field is enabled after 5 seconds" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="CNH-j4-jZp">
20
+ <rect key="frame" x="214" y="285" width="349" height="30"/>
21
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
22
+ <accessibility key="accessibilityConfiguration" label="enabledTextField">
23
+ <bool key="isElement" value="NO"/>
24
+ </accessibility>
25
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
26
+ <textInputTraits key="textInputTraits"/>
27
+ </textField>
28
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="This textbox will never be enabled" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="C8U-NZ-tS3">
29
+ <rect key="frame" x="264" y="382" width="241" height="30"/>
30
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
31
+ <accessibility key="accessibilityConfiguration" label="notEnabledTextField">
32
+ <bool key="isElement" value="NO"/>
33
+ </accessibility>
34
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
35
+ <textInputTraits key="textInputTraits"/>
36
+ </textField>
37
+ </subviews>
16
38
  <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
17
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackTranslucent"/>
39
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
18
40
  </view>
19
41
  </objects>
20
42
  </document>
@@ -14,7 +14,9 @@
14
14
  @property (weak, nonatomic) IBOutlet UIButton *existsPageButton;
15
15
  @property (weak, nonatomic) IBOutlet UIButton *showAlertButton;
16
16
  @property (weak, nonatomic) IBOutlet UIButton *rufusButton;
17
+ @property (weak, nonatomic) IBOutlet UIButton *enabledPageButton;
17
18
 
19
+ - (IBAction)toEnabledPage:(id)sender;
18
20
  - (IBAction)toRufusPage:(id)sender;
19
21
  - (IBAction)showAlert:(id)sender;
20
22
  - (IBAction)toExistsPage:(id)sender;
@@ -10,6 +10,7 @@
10
10
  #import "RufusPageViewController.h"
11
11
  #import "ExistsPageViewController.h"
12
12
  #import "DisplayedPageViewController.h"
13
+ #import "EnabledPageViewController.h"
13
14
 
14
15
  @interface RUViewController ()
15
16
 
@@ -45,8 +46,12 @@
45
46
 
46
47
  ExistsPageViewController *existsPageViewController = [[ExistsPageViewController alloc] init];
47
48
  [[self navigationController] pushViewController:existsPageViewController animated:YES];
48
-
49
-
49
+ }
50
+
51
+ -(void)toEnabledPage:(id)sender
52
+ {
53
+ EnabledPageViewController *enabledPageViewController = [[EnabledPageViewController alloc] init];
54
+ [[self navigationController] pushViewController:enabledPageViewController animated:YES];
50
55
  }
51
56
 
52
57
  - (IBAction)toDisplayedPage:(id)sender {
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
2
+ <document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="4510" systemVersion="12F45" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
3
3
  <dependencies>
4
4
  <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
5
5
  </dependencies>
@@ -7,6 +7,7 @@
7
7
  <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="RUViewController">
8
8
  <connections>
9
9
  <outlet property="displayedPageButton" destination="cx3-SH-qUq" id="ntd-NP-UTK"/>
10
+ <outlet property="enabledPageButton" destination="8Xe-wy-gw2" id="mNp-pl-GZO"/>
10
11
  <outlet property="existsPageButton" destination="ptK-30-J0y" id="eem-Ie-lJP"/>
11
12
  <outlet property="rufusButton" destination="4" id="11"/>
12
13
  <outlet property="showAlertButton" destination="VTc-fX-2Iw" id="ndi-Zu-qSy"/>
@@ -37,7 +38,7 @@
37
38
  <textInputTraits key="textInputTraits"/>
38
39
  </textField>
39
40
  <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" misplaced="YES" text="Rufus Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="24">
40
- <rect key="frame" x="333" y="174" width="219" height="21"/>
41
+ <rect key="frame" x="324" y="180" width="107" height="21"/>
41
42
  <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
42
43
  <accessibility key="accessibilityConfiguration" label="rufusLabel"/>
43
44
  <constraints>
@@ -73,10 +74,13 @@
73
74
  <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8Xe-wy-gw2">
74
75
  <rect key="frame" x="306" y="388" width="146" height="30"/>
75
76
  <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
76
- <accessibility key="accessibilityConfiguration" label="enabledPageButon"/>
77
+ <accessibility key="accessibilityConfiguration" label="enabledPageButton"/>
77
78
  <state key="normal" title="Enabled Page Button">
78
79
  <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
79
80
  </state>
81
+ <connections>
82
+ <action selector="toEnabledPage:" destination="-1" eventType="touchUpInside" id="4YW-DD-SpI"/>
83
+ </connections>
80
84
  </button>
81
85
  <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cx3-SH-qUq">
82
86
  <rect key="frame" x="300" y="434" width="158" height="30"/>
data/config.yml ADDED
@@ -0,0 +1,8 @@
1
+ browser: iOS
2
+ platform: Mac
3
+ version: 7.0
4
+ app: ./build/Debug-iphoneos/RufusApp.app
5
+ udid: 4550a561efc2c047637f342bd6320623ba98c385
6
+ use_physical: false
7
+ sim_app_path: <%=ENV['HOME']%>/Library/Application Support/iPhone Simulator/7.0/Applications/4550a561efc2c047637f342bd6320623ba98c385/RufusApp.app
8
+ device: iPhoneSimulator
@@ -5,13 +5,18 @@ Feature: Interacting with a view
5
5
  Given I have created a valid appium driver for iOS
6
6
 
7
7
  Scenario: Rotating the orientation of device to landscape
8
- Given the app is in the "landscape" orientation
9
- When I rotate the app to "portrait"
10
- Then the app is in the "portrait" orientation
8
+ Given the app is in the "portrait" orientation
9
+ When I rotate the app to "landscape"
10
+ Then the app is in the "landscape" orientation
11
11
 
12
12
  Scenario: Rotating the orientation twice
13
- Given the app is in the "landscape" orientation
14
- When I rotate the app to "portrait"
15
- And I rotate the app to "landscape"
16
- Then the app is in the "landscape" orientation
13
+ Given the app is in the "portrait" orientation
14
+ When I rotate the app to "landscape"
15
+ And I rotate the app to "portrait"
16
+ Then the app is in the "portrait" orientation
17
+ @sending
18
+ Scenario: Typing into a text field
19
+ Given I am on the "HomePage"
20
+ When I type "BooYah" into the text field defined "text_box"
21
+ Then the view marked "text_box" has the text "BooYah"
17
22
 
@@ -0,0 +1,20 @@
1
+ @rufus
2
+ Feature: Using Rufus
3
+
4
+ Background:
5
+ Given I am on the "HomePage"
6
+
7
+ Scenario: Getting an element by name without accessor
8
+ Then I do not need an accessor to find the view defined "rufusButton"
9
+
10
+ Scenario: Clicking on an element by name without accessor
11
+ Given I have clicked on view defined "rufusButton" with an accessor
12
+ Then I am on the "RufusPage"
13
+
14
+ Scenario: Getting the page source
15
+ Then I can print out the page data
16
+
17
+ Scenario: Getting page elements by class
18
+ Then I can get a list of the buttons
19
+
20
+
@@ -1,7 +1,7 @@
1
1
  require 'rufus/driver'
2
2
 
3
3
  Given(/^I have created a valid appium driver for iOS$/) do
4
- app_path = '/Users/jstewart/Library/Developer/Xcode/DerivedData/RufusApp-bseyccodcsszzhcwbshowgsppecs/Build/Products/Debug-iphoneos/RufusApp.app'
4
+ app_path = './build/Debug-iphoneos/RufusApp.app'
5
5
  config = $driver.config
6
6
  config["browser"].should eq "iOS"
7
7
  config["platform"].should eq "Mac"
@@ -16,4 +16,10 @@ When(/^I rotate the app to "([^"]*)"$/) do |orient|
16
16
  orientation = :portrait
17
17
  orientation = :landscape if orient.eql?('landscape')
18
18
  $driver.rotate orientation
19
+ end
20
+ When(/^I type "([^"]*)" into the text field defined "([^"]*)"$/) do |keys, which|
21
+ on(HomePage).send("view_#{which}_view").send_keys keys
22
+ end
23
+ Then(/^the view marked "([^"]*)" has the text "([^"]*)"$/) do |which, keys|
24
+ on(HomePage).send("view_#{which}_view").text.should eq keys
19
25
  end
@@ -0,0 +1,15 @@
1
+ Then(/^I do not need an accessor to find the view defined "([^"]*)"$/) do |which|
2
+ element = find(:name => which)
3
+ element.attribute('name').should eq which
4
+ end
5
+ Given(/^I have clicked on view defined "([^"]*)" with an accessor$/) do |which|
6
+ click(:name => which)
7
+ end
8
+ Then(/^I can print out the page data$/) do
9
+ page_source.include?('rufusButton').should be_true
10
+ end
11
+ Then(/^I can get a list of the buttons$/) do
12
+ elements_of_type('UIAButton').each do |element|
13
+ element.class.name.should eq('Selenium::WebDriver::Element')
14
+ end
15
+ end
@@ -22,8 +22,20 @@ Then(/^I will not find the view marked "([^"]*)" after waiting$/) do |arg|
22
22
  view = on(HomePage).view_zilch_view
23
23
  exists_after_wait?(view).should be_false
24
24
  end
25
- When(/^the view marked "([^"]*)" exists is( not)? displayed$/) do |which, not_displayed|
25
+ When(/^the view marked "([^"]*)" exists but is( not)? displayed$/) do |which, not_displayed|
26
26
  on(DisplayedPage).active?.should be_true
27
27
  view = on(DisplayedPage).send("view_#{which}_view")
28
28
  displayed_after_wait?(view).should == not_displayed.nil?
29
+ end
30
+ When(/^the view marked "([^"]*)" is( not)? enabled$/) do |which, not_enabled|
31
+ on(EnabledPage).active?.should be_true
32
+ view = on(EnabledPage).send("view_#{which}_view")
33
+ enabled_after_wait?(view).should == not_enabled.nil?
34
+ end
35
+ Then(/^in a block can see the existence of views "([^"]*)", "([^"]*)" and "([^"]*)"$/) do |view_1, view_2, view_3|
36
+ on(HomePage) do |screen|
37
+ screen.send("view_#{view_1}_view").exists?.should be_true
38
+ screen.send("view_#{view_2}_view").exists?.should be_true
39
+ screen.send("view_#{view_3}_view").exists?.should be_true
40
+ end
29
41
  end
@@ -8,5 +8,9 @@ Rufus::Navigation.routes = {
8
8
  :to_displayed => [
9
9
  [HomePage, :view_displayed],
10
10
  [DisplayedPage],
11
+ ],
12
+ :to_enabled => [
13
+ [HomePage, :view_enabled],
14
+ [EnabledPage],
11
15
  ]
12
16
  }
@@ -0,0 +1,13 @@
1
+ require 'rufus'
2
+
3
+ class EnabledPage
4
+ include Rufus
5
+
6
+ text(:view_enabled, :name => 'enabledTextField')
7
+ text(:view_not_enabled, :name => 'notEnabledTextField')
8
+
9
+ def active?
10
+ enabled_after_wait? view_enabled_view
11
+ end
12
+
13
+ end
@@ -5,15 +5,16 @@ class HomePage
5
5
 
6
6
  view(:view_rufus, :name =>'rufusButton')
7
7
  view(:view_zilch, :name => 'zilch')
8
+ text(:view_text_box, :name => 'rufusTextBox')
8
9
  button(:view_show_alert, :name => 'showAlertButton')
9
10
  alert(:alert_rufus, :name => 'Rufus Alert')
10
11
  button(:view_exists, :name => 'existsButton')
11
12
  button(:view_displayed, :name => 'displayedPageButton')
13
+ button(:view_enabled, :name => 'enabledPageButton')
12
14
  button(:alert_Ok, :name => 'Ok')
13
15
  button(:alert_Cancel, :name => 'Cancel')
14
16
 
15
17
 
16
-
17
18
  def active?
18
19
  view_rufus_view.exists?
19
20
  true
@@ -21,9 +21,18 @@ Feature: Interacting with views
21
21
  Scenario: Waiting for a view that is not there
22
22
  Given I am on the "HomePage"
23
23
  Then I will not find the view marked "zilch" after waiting
24
- @displayed
24
+
25
25
  Scenario: Waiting for a view to be displayed
26
26
  Given I have navigated to the "DisplayedPage" using the "to_displayed" route
27
27
  Then I am on the "DisplayedPage"
28
- And the view marked "invisible" exists is not displayed
28
+ And the view marked "invisible" exists but is not displayed
29
+
30
+ Scenario: Waiting for a view to be enabled
31
+ Given I have navigated to the "EnabledPage" using the "to_enabled" route
32
+ Then I am on the "EnabledPage"
33
+ And the view marked "not_enabled" is not enabled
34
+ @block
35
+ Scenario: Calling views in a block
36
+ Given I am on the "HomePage"
37
+ Then in a block can see the existence of views "rufus", "exists" and "displayed"
29
38
 
data/lib/rufus.rb CHANGED
@@ -31,13 +31,29 @@ module Rufus
31
31
  def enabled_after_wait?(view, timeout = 5)
32
32
  wait = Selenium::WebDriver::Wait.new :timeout => timeout
33
33
  begin
34
- wait.until{view.displayed?}
34
+ wait.until{view.enabled?}
35
35
  rescue Selenium::WebDriver::Error::TimeOutError
36
36
  return false
37
37
  end
38
38
  true
39
39
  end
40
40
 
41
+ def find(locator)
42
+ selenium.find(locator)
43
+ end
44
+
45
+ def click(locator)
46
+ selenium.find(locator).click
47
+ end
48
+
49
+ def page_source
50
+ selenium.page_source
51
+ end
52
+
53
+ def elements_of_type(type)
54
+ selenium.elements_by_tag(type)
55
+ end
56
+
41
57
  end
42
58
 
43
59
 
data/lib/rufus/driver.rb CHANGED
@@ -66,8 +66,10 @@ module Rufus
66
66
  end
67
67
 
68
68
  def type(keys, name)
69
- locator = {:name => name}
70
- find(locator).send_keys keys
69
+ element = find(:name => name)
70
+ element.click
71
+ sleep 1
72
+ element.send_keys keys
71
73
  end
72
74
 
73
75
  def sequence(*names, times)
@@ -147,6 +149,18 @@ module Rufus
147
149
  element.attribute(:name).eql? name
148
150
  end
149
151
 
152
+ def page_source
153
+ driver.page_source
154
+ end
155
+
156
+ def all_elements
157
+ elements_by_tag('UIAElement')
158
+ end
159
+
160
+ def elements_by_tag(name)
161
+ driver.find_elements(:tag_name, name)
162
+ end
163
+
150
164
  private
151
165
 
152
166
  def url(config)
@@ -171,14 +185,6 @@ module Rufus
171
185
  class_for(element).eql?('UIATableCell')
172
186
  end
173
187
 
174
- def all_elements
175
- elements_by_tag('UIAElement')
176
- end
177
-
178
- def elements_by_tag(name)
179
- driver.find_elements(:tag_name, name)
180
- end
181
-
182
188
  def driver
183
189
  if use_device
184
190
  @selenium ||= Rufus::Drivers::IOS_Device.for(@config,@url)
@@ -190,6 +196,5 @@ module Rufus
190
196
  def use_device
191
197
  @config["use_physical"] == true
192
198
  end
193
-
194
199
  end
195
200
  end
@@ -4,19 +4,18 @@ module Rufus
4
4
  module Navigation
5
5
  include PageNavigation
6
6
 
7
- def on(cls)
7
+ def on(cls, timeout = 10, &block)
8
8
  screen = cls.new
9
-
10
9
  wait = 0
11
- until wait == 59 do
12
-
10
+ until wait == timeout do
13
11
  if screen.active?
12
+ block.call screen if block
14
13
  return screen
15
14
  else
15
+ sleep 1
16
16
  wait += 1
17
17
  end
18
18
  end
19
-
20
19
  raise "Expected #{cls} to be active"
21
20
  end
22
21
  end
data/rakefile ADDED
@@ -0,0 +1,90 @@
1
+ require 'yaml'
2
+ require 'rspec/core/rake_task'
3
+ require 'cucumber/rake/task'
4
+ require 'erb'
5
+ require 'childprocess'
6
+
7
+ desc "Start appium and run features"
8
+ task :test => [:build_sim, :install_sim, :appium_sim, :specs, :features, :stop_sim_server]
9
+
10
+ desc "Running specs appium server"
11
+ RSpec::Core::RakeTask.new(:specs)
12
+
13
+ desc "build RufusApp for simulator"
14
+ task :build_sim do
15
+ Dir.chdir("./RufusApp") do
16
+ `xcodebuild -project RufusApp.xcodeproj -target RufusApp -sdk iphonesimulator -configuration Debug clean build 1>&2`
17
+ end
18
+ end
19
+
20
+ desc "build RufusApp for device"
21
+ task :build_device do
22
+ Dir.chdir("./RufusApp") do
23
+ `xcodebuild -project RufusApp.xcodeproj -target RufusApp -sdk iphoneos -configuration Debug clean build 1>&2`
24
+ end
25
+ end
26
+
27
+ desc "Run the features"
28
+ task :features do
29
+ `bundle exec cucumber --tags @rufus 1>&2`
30
+ end
31
+
32
+ desc "Starting the appium server"
33
+ task :appium_sim do
34
+ process = ChildProcess.build('rake', 'appium_server')
35
+ process.duplex = true
36
+ process.start
37
+ end
38
+
39
+ desc "Stops the appium server for simulator"
40
+ task :stop_sim_server do
41
+ system('pkill -9 -f node /usr/local/bin/appium --app #{ENV["HOME"]}/Library/Application Support/iPhone Simulator/#{config["version"]}/Applications')
42
+ end
43
+
44
+ desc "Starting appium server for simulator"
45
+ task :appium_server do
46
+ config = YAML.load(ERB.new(File.read('config.yml')).result)
47
+ app_path = config["sim_app_path"]
48
+ system('appium --app "' + app_path + '" --force-ipad --native-instruments-lib 1>&2')
49
+ end
50
+
51
+ desc "Install CoPilot to simulator"
52
+ task :install_sim do
53
+ config = YAML.load(ERB.new(File.read('config.yml')).result)
54
+ folder_dir="#{ENV['HOME']}/Library/Application Support/iPhone Simulator/#{config["version"]}/Applications"
55
+
56
+ top_dir="#{folder_dir}/#{config["udid"]}"
57
+ FileUtils.mkdir_p(top_dir)
58
+ FileUtils.mkdir_p("#{top_dir}/Documents")
59
+ FileUtils.mkdir_p("#{top_dir}/Library")
60
+ FileUtils.mkdir_p("#{top_dir}/tmp")
61
+
62
+ FileUtils.cp_r("./RufusApp/build/Debug-iphonesimulator/RufusApp.app", "#{top_dir}/RufusApp.app")
63
+
64
+ end
65
+
66
+ desc "Start the simulator"
67
+ task :start_sim do
68
+ system('open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app')
69
+ end
70
+
71
+ desc "Starting appium server for device"
72
+ task :appium do
73
+ config = YAML.load_file('config.yml')
74
+ app_path = config["app"]
75
+ udid = config["udid"]
76
+ `appium -U udid --app app_path 1>&2`
77
+ end
78
+
79
+ desc "Reset the simulator"
80
+ task :reset_sim do
81
+ %x{osascript<<APPLESCRIPT
82
+ tell application "System Events"
83
+ click menu item 5 of menu "iOS Simulator" of menu bar of process "iPhone Simulator"
84
+ tell window 1 of process "iPhone Simulator"
85
+ click button "Reset"
86
+ end tell
87
+ end tell
88
+ APPLESCRIPT}
89
+ end
90
+
data/rufus.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = "rufus"
3
- gem.version = "0.4"
3
+ gem.version = "0.5"
4
4
  gem.authors = ["Jeremy Stewart"]
5
5
  gem.email = ["jlstewart379@gmail.com"]
6
6
  gem.description = "Page object wrapper for Appium"
@@ -37,8 +37,6 @@ describe Rufus::Driver do
37
37
  expect{Rufus::Driver.new}.to raise_error(RuntimeError, 'No config.yml found')
38
38
  end
39
39
  end
40
-
41
-
42
40
  end
43
41
 
44
42
  context 'dealing with elements' do
@@ -94,6 +92,7 @@ describe Rufus::Driver do
94
92
 
95
93
  it 'can enter text into an element' do
96
94
  mock_driver.should_receive(:find_element).with(:name, 'rufusButton').and_return(mock_element)
95
+ mock_element.should_receive(:click)
97
96
  mock_element.should_receive(:send_keys).with('text')
98
97
  @driver.type('text', 'rufusButton')
99
98
  end
@@ -314,18 +313,42 @@ describe Rufus::Driver do
314
313
  mock_driver.should_receive(:rotate).with('portrait')
315
314
  @driver.rotate('portrait')
316
315
  end
316
+ end
317
+ end
317
318
 
319
+ context 'getting the page data' do
318
320
 
321
+ let(:yaml){double('YAML loader')}
322
+ let(:mock_driver){'a mock app driver'}
323
+ let(:url){'http://127.0.0.1:4723/wd/hub'}
319
324
 
325
+ before(:each) do
326
+ File.stub(:exists?).and_return(true)
327
+ @config = {"browser_name" =>"iOS", "platform"=>"Mac", "version"=>"6.1", "app"=>"/Users/app/path/rufus.app", "use_physical" => false}
328
+ YAML.should_receive(:load).and_return(@config)
329
+ @driver = Rufus::Driver.new
330
+ end
320
331
 
332
+ it 'can get all the page data' do
321
333
 
322
-
323
-
324
-
334
+ Rufus::Drivers::IOS_Simulator.should_receive(:for).with(@config, url).and_return(mock_driver)
335
+ mock_driver.should_receive(:page_source).and_return("some page data")
336
+ @driver.page_source.should eq("some page data")
325
337
  end
326
338
 
339
+ context 'getting element lists by class' do
340
+
341
+ let(:mock_list){'a mock list of elements'}
327
342
 
343
+ before(:each) do
344
+ Rufus::Drivers::IOS_Simulator.should_receive(:for).with(@config, url).and_return(mock_driver)
345
+ end
328
346
 
347
+ it 'can get all the buttons' do
348
+ mock_driver.should_receive(:find_elements).with(:tag_name, 'UIAButton').and_return(mock_list)
349
+ @driver.elements_by_tag('UIAButton').should eq(mock_list)
350
+ end
351
+ end
329
352
  end
330
353
  end
331
354
  end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require 'rufus/navigation'
3
+ include Rufus::Navigation
4
+
5
+ class RufusNavPage
6
+
7
+ end
8
+
9
+ describe Rufus::Navigation do
10
+
11
+ let(:mock_page){'mock page object'}
12
+ let(:mock_block){lambda{}}
13
+
14
+ context 'getting the active screen' do
15
+
16
+ before (:each) do
17
+ mock_page.should_receive(:new).and_return(mock_page)
18
+ end
19
+
20
+ it 'raises exception if screen does not become active' do
21
+ mock_page.should_receive(:active?).at_least(1).times.and_return false
22
+ expect{on(mock_page, 1)}.to raise_error
23
+ end
24
+
25
+ it 'returns the active screen' do
26
+ mock_page.should_receive(:active?).and_return true
27
+ on(mock_page).should eq mock_page
28
+ end
29
+
30
+ it 'can execute a block' do
31
+ mock_page.should_receive(:active?).and_return true
32
+ mock_block.should_receive(:call).with mock_page
33
+ on(mock_page, &mock_block)
34
+ end
35
+
36
+ end
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ end
data/spec/rufus_spec.rb CHANGED
@@ -7,8 +7,6 @@ require 'yaml'
7
7
  describe Rufus do
8
8
  include Rufus
9
9
 
10
-
11
-
12
10
  context 'waiting for an element to exist' do
13
11
 
14
12
  let(:mock_wait){'mock Selenium::WebDriver::Wait'}
@@ -85,4 +83,33 @@ describe Rufus do
85
83
  end
86
84
  end
87
85
  end
86
+
87
+ context 'elements without accessors' do
88
+
89
+ let(:selenium){'mock selenium driver'}
90
+ let(:mock_element){'mock selenium element'}
91
+
92
+ it 'can find an element by name' do
93
+ selenium.should_receive(:find).with({:name => 'rufusButton'}).and_return(mock_element)
94
+ mock_element.should_receive(:click)
95
+ click(:name => 'rufusButton')
96
+ end
97
+ end
98
+
99
+ context 'getting the raw page data' do
100
+
101
+ let(:selenium){'mock selenium driver'}
102
+ let(:elements){'mock list of elements'}
103
+
104
+ it 'can get the raw page data' do
105
+ selenium.should_receive(:page_source).and_return("source data")
106
+ page_source.should eq("source data")
107
+ end
108
+
109
+ it 'can get a list of buttons' do
110
+ selenium.should_receive(:elements_by_tag).with('UIAButton').and_return(elements)
111
+ elements_of_type 'UIAButton'
112
+ end
113
+
114
+ end
88
115
  end
data/spec/spec_helper.rb CHANGED
@@ -3,6 +3,8 @@ require 'rufus'
3
3
 
4
4
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
5
 
6
+
7
+
6
8
  RSpec.configure do |config|
7
9
  config.treat_symbols_as_metadata_keys_with_true_values = true
8
10
  config.run_all_when_everything_filtered = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rufus
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Stewart
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-07 00:00:00.000000000 Z
11
+ date: 2013-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: page_navigation
@@ -47,6 +47,7 @@ extra_rdoc_files: []
47
47
  files:
48
48
  - .gitignore
49
49
  - .gitmodules
50
+ - .travis.yml
50
51
  - Gemfile
51
52
  - Gemfile.lock
52
53
  - LICENSE.txt
@@ -268,7 +269,6 @@ files:
268
269
  - RufusApp/Frank/libFrankMac.a
269
270
  - RufusApp/Frank/libShelley.a
270
271
  - RufusApp/Frank/libShelleyMac.a
271
- - RufusApp/Rakefile
272
272
  - RufusApp/RufusApp.xcodeproj/project.pbxproj
273
273
  - RufusApp/RufusApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
274
274
  - RufusApp/RufusApp/Default-568h@2x.png
@@ -311,16 +311,20 @@ files:
311
311
  - RufusApp/RufusAppTests/RufusAppTests.h
312
312
  - RufusApp/RufusAppTests/RufusAppTests.m
313
313
  - RufusApp/RufusAppTests/en.lproj/InfoPlist.strings
314
+ - config.yml
314
315
  - features/alert.feature
315
316
  - features/driver.feature
317
+ - features/rufus.feature
316
318
  - features/step_definitions/alert_steps.rb.rb
317
319
  - features/step_definitions/driver_steps.rb
320
+ - features/step_definitions/rufus_steps.rb
318
321
  - features/step_definitions/view_steps.rb
319
322
  - features/support/core_ext/string.rb
320
323
  - features/support/env.rb
321
324
  - features/support/hooks.rb
322
325
  - features/support/routes.rb
323
326
  - features/support/screens/displayed_page.rb
327
+ - features/support/screens/enabled_page.rb
324
328
  - features/support/screens/exists_page.rb
325
329
  - features/support/screens/home_page.rb
326
330
  - features/support/screens/rufus_page.rb
@@ -332,11 +336,13 @@ files:
332
336
  - lib/rufus/drivers/iOS_device.rb
333
337
  - lib/rufus/drivers/iOS_simulator.rb
334
338
  - lib/rufus/navigation.rb
339
+ - rakefile
335
340
  - rufus.gemspec
336
341
  - spec/accessors_spec.rb
337
342
  - spec/drivers_specs/driver_spec.rb
338
343
  - spec/drivers_specs/iOS_device_spec.rb
339
344
  - spec/drivers_specs/iOS_simulator_spec.rb
345
+ - spec/navigation_spec.rb
340
346
  - spec/rufus_spec.rb
341
347
  - spec/spec_helper.rb
342
348
  - spec/view_spec.rb
data/RufusApp/Rakefile DELETED
@@ -1,28 +0,0 @@
1
- require 'cucumber'
2
- require 'cucumber/rake/task'
3
- require 'rspec/core/rake_task'
4
-
5
- desc "Build CoPilot for physical deployment"
6
- task :frankify do
7
-
8
- `xcodebuild -target RufusApp -xcconfig /Users/jstewart/rubymineprojects/rufus/rufusapp/frank/frankify.xcconfig -arch armv7 -configuration Debug -sdk iphoneos DEPLOYMENT_LOCATION=YES DSTROOT=\`pwd\`/Frank/Frankified_build FRANK_LIBRARY_SEARCH_PATHS=\`pwd\`/Frank clean build`
9
-
10
- end
11
-
12
- desc "Install CoPilot on iPad"
13
- task :fruitstrap do
14
-
15
- Dir.chdir("/Users/jstewart/documents/projects/copilot/frameworks/fruitstrap") do
16
-
17
- `./fruitstrap -b /Users/jstewart/Library/Developer/Xcode/DerivedData/RufusApp-bseyccodcsszzhcwbshowgsppecs/Build/Products/Debug-iphoneos/RufusApp.app 2>&1`
18
-
19
- end
20
- end
21
-
22
- desc "Start Appium server"
23
- task :appium do
24
-
25
- Dir.chdir("/Users/jstewart/rubymineprojects/rufus/appium") do
26
- `appium -U 4550a561efc2c047637f342bd6320623ba98c385 --app /Users/jstewart/Library/Developer/Xcode/DerivedData/RufusApp-bseyccodcsszzhcwbshowgsppecs/Build/Products/Debug-iphoneos/RufusApp.app`
27
- end
28
- end