saucelabs 0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1 @@
1
+ === Version 0.2
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+
4
+ gem 'rake'
5
+ gem 'saucelabs'
6
+ gem 'selenium-webdriver'
7
+ gem 'watir-webdriver'
8
+ gem 'net-http-persistent'
9
+
10
+ gemspec
@@ -0,0 +1,6 @@
1
+ guard :rspec, :all_on_start => true, :cmd => 'rspec --color --format Fuubar' do
2
+ watch(%r{^spec/*/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Pradeep K. Macharla
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,258 @@
1
+ # SauceLabs
2
+
3
+ saucelabs gem is written in simple ruby so as to be able to set the desired capabilities and browser options for selenium/watir grid execution
4
+ and also be able to dynamically set the browser choice through an environment variable and execute the same scripts across browsers.The gem was
5
+ initially written to help connect to saucelabs, however the current version support local execution, selenium grid execution and execution against
6
+ Sauce Labs cloud environment. Please bear in mind that to execute against Sauce Labs cloud, you would require to register and get a username, password
7
+ to access Sauce Labs on their [website] (http://www.saucelabs.com)
8
+ Also platform and device parameters in the desired capabilities object when creating a connection to
9
+ Sauce Labs. It can also be used to create a connection to local browser instance in addition to Sauce Labs
10
+ The gem has been tested on MRI ruby and JRuby. Please report any issues and I will try my best to fix asap.
11
+
12
+ ##Pre-Requisites
13
+ If you are planning to use a Selenium GRID or connect to Sauce Labs, it is assumed that you have an understanding on the Selenium GRID connection parameters. Sauce Labs works as a large Selenium GRID with username and password auth.
14
+
15
+ ## Background
16
+
17
+ saucelabs gem is intended to be able to extract 4 main parameters viz. browser, version, platform and device
18
+ that gets set in the desired capabilities object. The gem creation got inspired by the below blog post
19
+ http://seleniumframework.wordpress.com/2014/05/18/pattern-for-running-multiple-cucumber-projects-on-ci-server/
20
+ Though the gem name is saucelabs , it can be used to create browser instances locally and against any selenium grid.
21
+
22
+ ## Local Execution
23
+
24
+ ````ruby
25
+ require 'saucelabs'
26
+ SauceLabs.watir_browser(browser = :firefox, browser_options = {})
27
+ # or
28
+ require 'saucelabs'
29
+ SauceLabs.selenium_driver(browser = :firefox, browser_options = {})
30
+ ````
31
+ The methods use firefox as default browser and browser_options as optional parameter. You can specify other browsers
32
+ by the following:
33
+
34
+ ````ruby
35
+ SauceLabs.watir_browser(browser = :chrome, browser_options = {})
36
+ # or
37
+ SauceLabs.selenium_driver(browser = :chrome, browser_options = {})
38
+ ````
39
+
40
+ ## Executing against local selenium grid
41
+ It is assumed that you have started the grid as per the page [Grid 2] (http://code.google.com/p/selenium/wiki/Grid2)
42
+
43
+ Another example of being able to use chrome 35 on Windows8 platform
44
+
45
+ ````ruby
46
+ SauceLabs.watir_browser(browser = :'chrome35|windows8', browser_options = {:url => 'http://localhost:4444/wd/hub'})
47
+ # or
48
+ SauceLabs.selenium_driver(browser = :'chrome35|windows8', browser_options = {:url => 'http://localhost:4444/wd/hub'})
49
+ ````
50
+
51
+ ## Executing against Sauce Labs
52
+
53
+ Uses chrome 35 on Windows8 platform
54
+
55
+ ````ruby
56
+ SauceLabs.watir_browser(browser = :'chrome35|windows8', browser_options = {:url => 'http://username:password@ip:port/wd/hub'})
57
+ # or
58
+ SauceLabs.selenium_driver(browser = :'chrome35|windows8', browser_options = {:url => 'http://username:password@ip:port/wd/hub'})
59
+ ````
60
+
61
+ ## More ways and parameters (using conf)
62
+
63
+ Another example of being able to use chrome 35 on Windows8 platform (The :url can also be set using SauceLabs.conf, see below)
64
+
65
+ ````ruby
66
+ SauceLabs.watir_browser(browser = :'chrome35|windows8', browser_options = {})
67
+ # or
68
+ SauceLabs.selenium_driver(browser = :'chrome35|windows8', browser_options = {})
69
+ ````
70
+
71
+
72
+ Yet Another example of being able to use chrome on mac platform and Android device (The :url needs to be set using SauceLabs.conf, see below)
73
+
74
+ ````ruby
75
+ SauceLabs.watir_browser(browser = :'chrome|linux|android', browser_options = {})
76
+ # or
77
+ SauceLabs.selenium_driver(browser = :'chrome|linux|android', browser_options = {})
78
+ ````
79
+
80
+ Yet Another example of being able to use safari on mac platform and iphone device (The :url needs to be set using SauceLabs.conf, see below)
81
+
82
+ ````ruby
83
+ SauceLabs.watir_browser(browser = :'chrome|linux|iphone', browser_options = {})
84
+ # or
85
+ SauceLabs.selenium_driver(browser = :'chrome|linux|iphone', browser_options = {})
86
+ ````
87
+
88
+ A simple ruby code example with watir and executing locally:
89
+
90
+ ````ruby
91
+ require 'saucelabs'
92
+ include SauceLabs
93
+
94
+ ENV['BROWSER'] = "chrome"
95
+ @browser = SauceLabs.watir_browser
96
+ @browser.goto "http://www.google.com"
97
+ @browser.quit
98
+ ````
99
+
100
+ A simple ruby code example with selenium and executing locally:
101
+
102
+ ````ruby
103
+ require 'saucelabs'
104
+ include SauceLabs
105
+
106
+ ENV['BROWSER'] = "chrome"
107
+ @browser = SauceLabs.selenium_driver
108
+ @browser.navigate.to "http://www.google.com"
109
+ @browser.quit
110
+ ````
111
+
112
+ A simple ruby code example with watir and executes against saucelabs:
113
+
114
+ ````ruby
115
+ require 'saucelabs'
116
+ include SauceLabs
117
+
118
+ @browser = SauceLabs.watir_browser(:'chrome35|windows8', {:url => 'http://username:password@ip:port/wd/hub'})
119
+ @browser.goto "http://www.google.com"
120
+ @browser.quit
121
+ ````
122
+
123
+ A simple ruby code example with watir and executes against local selenium grid:
124
+ It is assumed that you have started the grid as per the page [Grid 2] (http://code.google.com/p/selenium/wiki/Grid2)
125
+
126
+ ````ruby
127
+ require 'saucelabs'
128
+ include SauceLabs
129
+
130
+ @browser = SauceLabs.watir_browser(:'chrome35|windows8', {:url => 'http://localhost:4444/wd/hub'})
131
+ @browser.goto "http://www.google.com"
132
+ @browser.quit
133
+ ````
134
+
135
+
136
+ ### Set BROWSER environment variable
137
+
138
+ In the above section, we have seen that it is very easy to set browser as a symbol
139
+ to the methods watir_browser and selenium_driver. However we would most likely want to dynamically set
140
+ the browser value. saucelabs reads from an environment variable 'BROWSER'. The following examples would help
141
+ understand the patterns. We can either use cucumber.yml file or set it on the command line as per your choice
142
+
143
+ ````yml
144
+ default: BROWSER=firefox --format pretty --color
145
+ chrome: BROWSER=chrome --format pretty --color
146
+ ie: BROWSER=ie --format pretty --color
147
+ ````
148
+
149
+ Execution from command line is simple too:
150
+
151
+ ````
152
+ cucumber BROWSER=chrome features
153
+ ````
154
+
155
+ The string pattern that is followed by this gem is as follows (Observer the '|' delimiter):
156
+
157
+
158
+ ````
159
+ chrome36|win81
160
+ safari|linux|iphone
161
+ chrome|linux|android
162
+ ````
163
+
164
+ Hence the following also applies:
165
+
166
+ ````yml
167
+ default: BROWSER=chrome36|win81 --format pretty --color
168
+ safari_mac: BROWSER=safari|linux|iphone --format pretty --color
169
+ chrome_android: BROWSER=chrome|linux|android --format pretty --color
170
+ ````
171
+
172
+
173
+
174
+ The first part determines the browser and its version
175
+ The second part determines the platform value that is set in capabilities object
176
+ The third part (used only for mobile device testing) determines the device
177
+
178
+
179
+
180
+ The following table is a mapping of all the platforms available on Sauce Labs website
181
+
182
+ | platform | description |
183
+ | --- | --- |
184
+ | windowsxp | Windows XP |
185
+ | osx109 | OS X 10.9 |
186
+ | osx106 | OS X 10.6 |
187
+ | osx108 | OS X 10.8 |
188
+ | linux | Linux |
189
+ | windows81 | Windows 8.1 |
190
+ | windows8 | Windows 8 |
191
+ | windows7 | Windows 7 |
192
+
193
+ The platform values can also be obtained from https://saucelabs.com/platforms
194
+
195
+ Additional platforms that are NOT on saucelabs however added to this gem to support selenium grid platforms
196
+
197
+ | platform | description |
198
+ | --- | --- |
199
+ | xp | XP|
200
+ | any | ANY |
201
+ | mac | MAC |
202
+ | unix | UNIX |
203
+ | vista | VISTA |
204
+ | windows | WINDOWS |
205
+
206
+
207
+
208
+ The following table is a mapping of all the devices available on Sauce Labs website
209
+
210
+ | device | description |
211
+ | --- | --- |
212
+ | iphone | iPhone |
213
+ | android | Android |
214
+
215
+
216
+ ### Setting parameters using a block
217
+
218
+ We can also set parameters like sauce url, http_persistent and browser options. Below are some examples:
219
+
220
+
221
+ ````ruby
222
+ SauceLabs.conf do | conf|
223
+ conf.url = 'http://username:password@ip:port/wd/hub' #Saucelabs connection url
224
+ conf.persistent_http = true
225
+ conf.browser_options = { :switches => %w[--disable-extensions],:chromeOptions => {"args" => ["test-type" ]}}
226
+ end
227
+ ````
228
+
229
+ ## Documentation
230
+
231
+ You can view the RDocs for this project [here] (http://rubydoc.info/github/machzqcq/saucelabs/master/frames).
232
+
233
+ ## Installation
234
+
235
+ Add this line to your application's Gemfile:
236
+
237
+ gem 'saucelabs'
238
+
239
+ And then execute:
240
+
241
+ $ bundle install/update
242
+
243
+ Require the module:
244
+
245
+ require 'saucelabs'
246
+
247
+ Or install it yourself as:
248
+
249
+ $ gem install saucelabs
250
+
251
+
252
+ ## Contributing
253
+
254
+ 1. Fork it ( https://github.com/[my-github-username]/fork )
255
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
256
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
257
+ 4. Push to the branch (`git push origin my-new-feature`)
258
+ 5. Create a new Pull Request
@@ -0,0 +1,18 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+
8
+ desc 'Run iOS tests'
9
+ task :ios do
10
+ Dir.chdir 'ios'
11
+ exec 'rspec'
12
+ end
13
+
14
+ desc 'Run Android tests'
15
+ task :android do
16
+ Dir.chdir 'android'
17
+ exec 'rspec'
18
+ end
@@ -0,0 +1 @@
1
+ default: --no-source --color --format pretty
@@ -0,0 +1,7 @@
1
+ Feature: Using saucelabs gem to invoke a local browser instance
2
+ Scenario: launch chrome browser locally
3
+ When I invoke chrome browser
4
+ Then I hit google website
5
+ Scenario: launch chrome browser locally using environment variable
6
+ When I invoke chrome browser and set environment variable
7
+ Then I hit google website
@@ -0,0 +1,14 @@
1
+ require 'saucelabs'
2
+
3
+ When(/^I invoke chrome browser$/) do
4
+ @browser = SauceLabs.selenium_driver(browser= :chrome)
5
+ end
6
+
7
+ Then(/^I hit google website$/) do
8
+ @browser.navigate.to "http://www.google.com"
9
+ end
10
+
11
+ When(/^I invoke chrome browser and set environment variable$/) do
12
+ ENV['BROWSER']= "chrome"
13
+ @browser = SauceLabs.selenium_driver
14
+ end
@@ -0,0 +1 @@
1
+ Android appium
@@ -0,0 +1 @@
1
+ Support for appium.txt
@@ -0,0 +1,53 @@
1
+ require 'saucelabs/sauce_browser_factory'
2
+ require 'saucelabs/parsed_values'
3
+
4
+ module SauceLabs
5
+ #attr_accessor :factory
6
+
7
+ #
8
+ # Creates a watir browser session and returns the browser object
9
+ #
10
+ # @example
11
+ # SauceLabs.watir_browser(browser = :chrome, browser_options = {})
12
+ # @param [String] the browser string passed into the method
13
+ # @param [Hash] the optional hash to specify browser options
14
+ # @return [Object] browser session
15
+ #
16
+
17
+ def self.watir_browser(browser = :firefox, browser_options={})
18
+ factory.watir_browser(browser,browser_options)
19
+ end
20
+
21
+ #
22
+ # Creates a Selenium driver session and returns the driver object
23
+ #
24
+ # @example
25
+ # SauceLabs.selenium_driver(browser = :chrome, browser_options = {})
26
+ # @param [String] the browser string passed into the method
27
+ # @param [Hash] the optional hash to specify browser options
28
+ # @return [Object] browser session
29
+ #
30
+
31
+ def self.selenium_driver(browser = :firefox, browser_options={})
32
+ factory.selenium_driver(browser,browser_options)
33
+ end
34
+
35
+ #
36
+ # Yields to Factory object if parameters are set using conf
37
+ #
38
+ # @return [Object] browser session
39
+ #
40
+
41
+ def self.conf
42
+ yield factory
43
+ end
44
+
45
+ private
46
+
47
+ def self.factory
48
+ @factory ||= SauceBrowserFactory.new
49
+ end
50
+
51
+
52
+
53
+ end
@@ -0,0 +1,129 @@
1
+ module SauceLabs
2
+ module ParsedValues
3
+
4
+ #
5
+ # Extracts browser, version, platform, device from the browser string
6
+ #
7
+ # @example
8
+ # extract_values_from(:'safari5|linux|iphone') will extract
9
+ # browser = safari
10
+ # version=5
11
+ # platform=Linux
12
+ # device=iPhone
13
+ #
14
+ # @param [String] the browser string passed into the method
15
+ # @return [String,String,String,String] browser, version, platform and device
16
+ #
17
+ def extract_values_from(browser_string)
18
+ browser = extract_browser(browser_string).to_sym
19
+ version = extract_version(browser_string)
20
+ platform = extract_platform(browser_string)
21
+ device = extract_device(browser_string)
22
+ return browser,version,platform,device
23
+ end
24
+
25
+ private
26
+
27
+ #
28
+ # Extracts browser from browser string
29
+ #
30
+ # @example
31
+ # extract_browser(:'safari5|linux|iphone') will extract
32
+ # browser = safari
33
+ #
34
+ # @param [String] the browser string passed into the method
35
+ # @return [String] the browser value
36
+ #
37
+ def extract_browser(value)
38
+ browser = value.to_s.split(/\d+/)[0]
39
+ browser = browser.to_s.split('|')[0] if browser.to_s.include? '|'
40
+ browser
41
+ end
42
+
43
+ #
44
+ # Extracts version from browser string
45
+ #
46
+ # @example
47
+ # extract_version(:'safari5|linux|iphone') will extract
48
+ # browser = safari
49
+ #
50
+ # @param [String] the browser string passed into the method
51
+ # @return [String] the version value
52
+ #
53
+ def extract_version(value)
54
+ value = value.to_s.split('|')[0] if value.to_s.include? '|'
55
+ regexp_to_match = /\d{1,}/
56
+ if (not regexp_to_match.match(value).nil?)
57
+ version = regexp_to_match.match(value)[0]
58
+ else
59
+ version = ''
60
+ end
61
+ version
62
+ end
63
+
64
+ #
65
+ # Extracts platform from browser string
66
+ #
67
+ # @example
68
+ # extract_platform(:'safari5|linux|iphone') will extract
69
+ # browser = safari
70
+ #
71
+ # @param [String] the browser string passed into the method
72
+ # @return [String] the platform value
73
+ #
74
+ def extract_platform(value)
75
+ platform = value.to_s.split('|')[1] if value.to_s.include? '|'
76
+ sauce_platforms
77
+ @sauce_platforms[platform] if not platform.nil?
78
+ end
79
+
80
+ #
81
+ # Extracts device from browser string
82
+ #
83
+ # @example
84
+ # extract_device(:'safari5|linux|iphone') will extract
85
+ # browser = safari
86
+ #
87
+ # @param [String] the browser string passed into the method
88
+ # @return [String] the device value
89
+ #
90
+
91
+ def extract_device(value)
92
+ device = value.to_s.split('|')[2] if value.to_s.include? '|'
93
+ sauce_devices
94
+ @sauce_devices[device] if not device.nil?
95
+ end
96
+
97
+ #
98
+ # Defines the platforms available on Sauce Labs as a Hash
99
+
100
+ def sauce_platforms
101
+ @sauce_platforms = Hash.new
102
+ @sauce_platforms["windowsxp"] = "Windows XP"
103
+ @sauce_platforms["osx109"] = "OS X 10.9"
104
+ @sauce_platforms["osx106"] = "OS X 10.6"
105
+ @sauce_platforms["osx108"] = "OS X 10.8"
106
+ @sauce_platforms["linux"] = "Linux"
107
+ @sauce_platforms["windows81"] = "Windows 8.1"
108
+ @sauce_platforms["windows8"] = "Windows 8"
109
+ @sauce_platforms["windows7"] = "Windows 7"
110
+ @sauce_platforms["any"] = "ANY"
111
+ @sauce_platforms["mac"] = "MAC"
112
+ @sauce_platforms["unix"] = "UNIX"
113
+ @sauce_platforms["vista"] = "VISTA"
114
+ @sauce_platforms["windows"] = "WINDOWS"
115
+ @sauce_platforms["xp"] = "XP"
116
+ end
117
+
118
+ #
119
+ # Defines the devices available on Sauce Labs as a Hash
120
+
121
+
122
+ def sauce_devices
123
+ @sauce_devices = Hash.new
124
+ @sauce_devices["iphone"] = "iPhone"
125
+ @sauce_devices["android"] = "Android"
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,29 @@
1
+ require "net/http"
2
+ require "net/https"
3
+
4
+ module SauceLabs
5
+ module RestApiBuilder
6
+
7
+ def post(body)
8
+
9
+ end
10
+
11
+ def puts(body)
12
+
13
+ end
14
+
15
+ def get(url)
16
+
17
+ end
18
+
19
+ def delete(url)
20
+
21
+ end
22
+
23
+ def sauce_credentials
24
+
25
+ end
26
+
27
+
28
+ end
29
+ end
@@ -0,0 +1,122 @@
1
+ require_relative 'parsed_values'
2
+ require 'selenium-webdriver'
3
+ require 'watir-webdriver'
4
+
5
+ module SauceLabs
6
+ #
7
+ # This class has the code necessary to create an instance of browser after making a connection to saucelabs.
8
+ # This class can also be used to create browser instance for local connections
9
+ #
10
+ class SauceBrowserFactory
11
+ include ParsedValues
12
+
13
+ attr_accessor :url,:options,:persistent_http
14
+
15
+ #
16
+ # Creates a watir browser session and returns the browser object
17
+ #
18
+ # @example
19
+ # SauceLabs.watir_browser(browser = :chrome, browser_options = {})
20
+ # @param [String] the browser string passed into the method
21
+ # @param [Hash] the optional hash to specify browser options
22
+ # @return [Object] browser session
23
+ #
24
+
25
+ def watir_browser(browser,browser_options)
26
+ target,options = browser_caps(browser,browser_options)
27
+ create_watir_browser(target,options)
28
+ end
29
+
30
+ #
31
+ # Creates a Selenium driver session and returns the driver object
32
+ #
33
+ # @example
34
+ # SauceLabs.selenium_driver(browser = :chrome, browser_options = {})
35
+ # @param [String] the browser string passed into the method
36
+ # @param [Hash] the optional hash to specify browser options
37
+ # @return [Object] browser session
38
+ #
39
+
40
+ def selenium_driver(browser,browser_options)
41
+ target,options = browser_caps(browser,browser_options)
42
+ create_selenium_driver(target,options)
43
+ end
44
+
45
+
46
+ #def capybara_driver(browser,browser_options)
47
+ #Capybara.register_driver :selenium do |app|
48
+ #Capybara::Selenium::Driver.new(app, :browser => browser)
49
+ #end
50
+ #Capybara.default_driver = :selenium
51
+ #target,options = browser_caps(browser,browser_options)
52
+ #create_selenium_driver(target,options)
53
+ #end
54
+
55
+ private
56
+
57
+ def create_watir_browser(target,options)
58
+ if options.empty?
59
+ Watir::Browser.new target
60
+ else
61
+ Watir::Browser.new target,options
62
+ end
63
+ end
64
+
65
+ def create_selenium_driver(target,options)
66
+ if options.empty?
67
+ Selenium::WebDriver.for target
68
+ else
69
+ Selenium::WebDriver.for target,options
70
+ end
71
+ end
72
+
73
+ #
74
+ # Returns the target and options including the capabilities
75
+ #
76
+ # @param [String] the browser string passed into the method
77
+ # @param [Hash] the optional hash to specify browser options
78
+ # @return [Symbol,Hash] browser as symbol and options as Hash
79
+ #
80
+
81
+ def browser_caps(browser,browser_options)
82
+ target = (browser.to_sym if ENV['BROWSER'].nil? or ENV['browser'].empty?) || (ENV['BROWSER'].to_sym)
83
+ browser,version,platform,device = extract_values_from(target)
84
+ options = {}
85
+ options.merge! browser_options
86
+ caps = capabilities(browser,version,platform,device)
87
+ options[:url] = url if url
88
+ if options.include? :url
89
+ browser = :remote
90
+ options[:desired_capabilities] = caps
91
+ end
92
+ options[:http_client] = http_client if persistent_http or options.delete(:persistent_http)
93
+ return browser,options
94
+ end
95
+
96
+
97
+ def capabilities(browser, version, platform,device={})
98
+ capabilities = Selenium::WebDriver::Remote::Capabilities.send browser
99
+ capabilities.version = version unless version.nil? or version.empty?
100
+ capabilities.platform = platform unless platform.nil? or platform.empty?
101
+ capabilities.device = device unless device.nil? or device.empty?
102
+ capabilities
103
+ end
104
+
105
+ #
106
+ # Returns a persistent http connection object
107
+ #
108
+ # @return [Object] Persistent http connection object
109
+ #
110
+
111
+ def http_client
112
+ client = Selenium::WebDriver::Remote::Http::Persistent.new
113
+ #client.proxy_uri="http://abc"
114
+ #client.read_timeout = 180
115
+ #client.socket_options = {}
116
+ client
117
+ end
118
+
119
+
120
+ end
121
+
122
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "saucelabs"
7
+ spec.version = "0.5"
8
+ spec.authors = ["Pradeep K. Macharla"]
9
+ spec.email = ["pradeep@seleniumframework.com"]
10
+ spec.summary = %q{Access saucelabs, selenium grid or local browser instance using simple ruby.}
11
+ spec.description = %q{Access saucelabs by passing browser, version, platform and device information}
12
+ spec.homepage = "https://github.com/machzqcq/saucelabs"
13
+ spec.license = "MIT"
14
+ spec.files = `git ls-files -z`.split("\x0")
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_dependency 'watir-webdriver', '>= 0.6.9'
20
+ spec.add_dependency 'selenium-webdriver'
21
+ spec.add_dependency 'net-http-persistent'
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "rspec"
25
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ class TestParsedValues
4
+ include SauceLabs::ParsedValues
5
+ end
6
+
7
+
8
+ describe SauceLabs::ParsedValues do
9
+
10
+ let(:parsed_values) { TestParsedValues.new }
11
+
12
+ it "should extract browser name" do
13
+ browser, version, platform,device = parsed_values.extract_values_from(:chrome)
14
+ expect(browser).to eql :chrome
15
+ end
16
+
17
+ it "should extract browser name if browser and version are specified" do
18
+ browser, version, platform,device = parsed_values.extract_values_from(:chrome35)
19
+ expect(browser).to eql :chrome
20
+ end
21
+
22
+ it "should extract version if version is specified along with browser" do
23
+ browser,version,platform,device = parsed_values.extract_values_from(:chrome35)
24
+ expect(version).to eql '35'
25
+ end
26
+
27
+ it "should extract platform if platform is specified along with browser" do
28
+ browser, version, platform,device = parsed_values.extract_values_from(:'chrome35|windows81')
29
+ expect(platform).to eql 'Windows 8.1'
30
+ end
31
+
32
+ it "should extract iphone device if iphone is specified along with platform and browser" do
33
+ browser, version, platform,device = parsed_values.extract_values_from(:'chrome35|windows81|iphone')
34
+ expect(device).to eql 'iPhone'
35
+ end
36
+
37
+ it "should extract android device if android is specified along with platform and browser" do
38
+ browser, version, platform,device = parsed_values.extract_values_from(:'chrome35|windows81|android')
39
+ expect(device).to eql 'Android'
40
+ end
41
+
42
+ it "should report platform nil if platform is not defined in sauce_platforms" do
43
+ browser, version, platform,device = parsed_values.extract_values_from(:'chrome35|windows82|android')
44
+ expect(platform).to be_nil
45
+ end
46
+
47
+ it "should report device nil if device is not defined in sauce_devices" do
48
+ browser, version, platform,device = parsed_values.extract_values_from(:'chrome35|windows82|xyz')
49
+ expect(device).to be_nil
50
+ end
51
+
52
+ end
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+ require 'selenium/webdriver/remote/http/persistent'
3
+
4
+ describe SauceLabs do
5
+
6
+ let(:watir_browser) { Watir::Browser }
7
+
8
+ context "Create Watir browser" do
9
+ it "should create a firefox instance if none specified" do
10
+ expect(watir_browser).to receive(:new).with(:firefox)
11
+ SauceLabs.watir_browser
12
+ end
13
+
14
+ it "should create a chrome instance if chrome specified" do
15
+ expect(watir_browser).to receive(:new).with(:chrome)
16
+ SauceLabs.watir_browser(:chrome)
17
+ end
18
+
19
+ it "should create a ie instance if ie specified" do
20
+ expect(watir_browser).to receive(:new).with(:ie)
21
+ SauceLabs.watir_browser(:ie)
22
+ end
23
+ end
24
+
25
+ context "Create Selenium driver" do
26
+ let(:selenium_driver) { Selenium::WebDriver }
27
+
28
+ it "should create a firefox instance if non specified" do
29
+ expect(selenium_driver).to receive(:for).with(:firefox)
30
+ SauceLabs.selenium_driver
31
+ end
32
+
33
+ it "should create a chrome instance if chrome specified" do
34
+ expect(selenium_driver).to receive(:for).with(:chrome)
35
+ SauceLabs.selenium_driver(:chrome)
36
+ end
37
+
38
+ it "should create a ie instance if ie specified" do
39
+ expect(selenium_driver).to receive(:for).with(:ie)
40
+ SauceLabs.selenium_driver(:ie)
41
+ end
42
+ end
43
+
44
+
45
+ context "Using an environment variable BROWSER" do
46
+ it "uses ENV['BROWSER'] if available" do
47
+ ENV['BROWSER'] = 'chrome'
48
+ expect(watir_browser).to receive(:new).with(:chrome)
49
+ SauceLabs.watir_browser
50
+ ENV.delete 'BROWSER'
51
+ end
52
+
53
+ it "should provide option to use http client for watir" do
54
+ client = double('http_client')
55
+ expect(Selenium::WebDriver::Remote::Http::Persistent).to receive(:new).and_return(client)
56
+ expect(watir_browser).to receive(:new).with(:firefox, http_client: client)
57
+ SauceLabs.watir_browser(:firefox, persistent_http: true)
58
+ end
59
+
60
+ it "should provide option to use http_client via conf" do
61
+ SauceLabs.conf do |conf|
62
+ conf.persistent_http = true
63
+ end
64
+ client = double('http_client')
65
+ expect(Selenium::WebDriver::Remote::Http::Persistent).to receive(:new).and_return(client)
66
+ expect(watir_browser).to receive(:new).with(:firefox, http_client: client)
67
+ SauceLabs.watir_browser(:firefox)
68
+ SauceLabs.conf do |conf|
69
+ conf.persistent_http = nil
70
+ end
71
+ end
72
+
73
+ it "should provide to use sauce labs url using conf" do
74
+ SauceLabs.conf do |conf|
75
+ conf.url = 'http://username:password@ip:port/wd/hub'
76
+ end
77
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
78
+ SauceLabs.watir_browser(:firefox)
79
+ SauceLabs.conf do |conf|
80
+ conf.url = nil
81
+ end
82
+ end
83
+ end
84
+ context "can pass browser options" do
85
+ it "should provide to be able to pass firefox browser options" do
86
+ SauceLabs.conf do |conf|
87
+ conf.options = {options: 'blah'}
88
+ end
89
+ expect(watir_browser).to receive(:new).with(:firefox)
90
+ SauceLabs.watir_browser(:firefox)
91
+ SauceLabs.conf do |conf|
92
+ conf.options = nil
93
+ end
94
+ end
95
+
96
+ it "should provide to be able to pass chrome browser options" do
97
+ SauceLabs.conf do |conf|
98
+ conf.options = {options: 'blah'}
99
+ end
100
+ expect(watir_browser).to receive(:new).with(:chrome)
101
+ SauceLabs.watir_browser(:chrome)
102
+ SauceLabs.conf do |conf|
103
+ conf.options = nil
104
+ end
105
+ end
106
+
107
+ it "should provide to be able to pass ie browser options" do
108
+ SauceLabs.conf do |conf|
109
+ conf.options = {options: 'blah'}
110
+ end
111
+ expect(watir_browser).to receive(:new).with(:ie)
112
+ SauceLabs.watir_browser(:ie)
113
+ SauceLabs.conf do |conf|
114
+ conf.options = nil
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+ end
@@ -0,0 +1,213 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Example browser, platform and device combinations" do
4
+
5
+ let(:watir_browser) { Watir::Browser }
6
+ let(:selenium_driver) { Selenium::WebDriver}
7
+ let(:capabilities) { Selenium::WebDriver::Remote::Capabilities }
8
+ let(:desired_capabilities) { double('capabilities') }
9
+
10
+ context "Firefox" do
11
+
12
+ before(:each) do
13
+ allow(capabilities).to receive(:firefox).and_return(desired_capabilities)
14
+ end
15
+
16
+ it "allows Firefox with no version specified" do
17
+ expect(watir_browser).to receive(:new).with(:firefox)
18
+ SauceLabs.watir_browser :firefox
19
+ end
20
+
21
+ it "allows Firefox 3" do
22
+ expect(desired_capabilities).to receive(:version=).with('3')
23
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
24
+ SauceLabs.watir_browser :firefox3, url: 'http://username:password@ip:port/wd/hub'
25
+ end
26
+
27
+ it "allows Firefox 6" do
28
+ expect(desired_capabilities).to receive(:version=).with('6')
29
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
30
+ SauceLabs.watir_browser :firefox6, url: 'http://username:password@ip:port/wd/hub'
31
+ end
32
+
33
+ it "allows Firefox 10" do
34
+ expect(desired_capabilities).to receive(:version=).with('10')
35
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
36
+ SauceLabs.watir_browser :firefox10, url: 'http://username:password@ip:port/wd/hub'
37
+ end
38
+
39
+ it "allows Firefox 25" do
40
+ expect(desired_capabilities).to receive(:version=).with('25')
41
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
42
+ SauceLabs.watir_browser :firefox25, url: 'http://username:password@ip:port/wd/hub'
43
+ end
44
+
45
+ it "allows Firefox 28" do
46
+ expect(desired_capabilities).to receive(:version=).with('28')
47
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
48
+ SauceLabs.watir_browser :firefox28, url: 'http://username:password@ip:port/wd/hub'
49
+ end
50
+
51
+ it "allows Firefox 29" do
52
+ expect(desired_capabilities).to receive(:version=).with('29')
53
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
54
+ SauceLabs.watir_browser :firefox29, url: 'http://username:password@ip:port/wd/hub'
55
+ end
56
+
57
+ it "allows Firefox 30" do
58
+ expect(desired_capabilities).to receive(:version=).with('30')
59
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
60
+ SauceLabs.watir_browser :firefox30, url: 'http://username:password@ip:port/wd/hub'
61
+ end
62
+
63
+ end
64
+
65
+ context "Chrome" do
66
+
67
+ before(:each) do
68
+ allow(capabilities).to receive(:chrome).and_return(desired_capabilities)
69
+ end
70
+
71
+ it "allows Chrome with no version specified" do
72
+ expect(watir_browser).to receive(:new).with(:chrome)
73
+ SauceLabs.watir_browser :chrome
74
+ end
75
+
76
+ it "allows Chrome 26" do
77
+ expect(desired_capabilities).to receive(:version=).with('26')
78
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
79
+ SauceLabs.watir_browser :chrome26, url: 'http://username:password@ip:port/wd/hub'
80
+ end
81
+
82
+ it "allows Chrome 27" do
83
+ expect(desired_capabilities).to receive(:version=).with('27')
84
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
85
+ SauceLabs.watir_browser :chrome27, url: 'http://username:password@ip:port/wd/hub'
86
+ end
87
+
88
+ it "allows Chrome 28" do
89
+ expect(desired_capabilities).to receive(:version=).with('28')
90
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
91
+ SauceLabs.watir_browser :chrome28, url: 'http://username:password@ip:port/wd/hub'
92
+ end
93
+
94
+ it "allows Chrome 29" do
95
+ expect(desired_capabilities).to receive(:version=).with('29')
96
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
97
+ SauceLabs.watir_browser :chrome29, url: 'http://username:password@ip:port/wd/hub'
98
+ end
99
+
100
+ it "allows Chrome 30" do
101
+ expect(desired_capabilities).to receive(:version=).with('30')
102
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
103
+ SauceLabs.watir_browser :chrome30, url: 'http://username:password@ip:port/wd/hub'
104
+ end
105
+
106
+ it "allows Chrome 32" do
107
+ expect(desired_capabilities).to receive(:version=).with('32')
108
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
109
+ SauceLabs.watir_browser :chrome32, url: 'http://username:password@ip:port/wd/hub'
110
+ end
111
+
112
+ it "allows Chrome 36" do
113
+ expect(desired_capabilities).to receive(:version=).with('36')
114
+ expect(watir_browser).to receive(:new).with(:remote, url: 'http://username:password@ip:port/wd/hub', desired_capabilities: anything())
115
+ SauceLabs.watir_browser :chrome36, url: 'http://username:password@ip:port/wd/hub'
116
+ end
117
+
118
+ end
119
+ context "Platforms Windows" do
120
+ before(:each) do
121
+ allow(capabilities).to receive(:chrome).and_return(desired_capabilities)
122
+ end
123
+
124
+ it "extracts Windows XP" do
125
+ expect(desired_capabilities).to receive(:version=).with('26')
126
+ expect(desired_capabilities).to receive(:platform=).with('Windows XP')
127
+ expect(watir_browser).to receive(:new)
128
+ SauceLabs.watir_browser :'chrome26|windowsxp', url: 'http://username:password@ip:port/wd/hub'
129
+ end
130
+
131
+ it "extracts Windows 8.1" do
132
+ expect(desired_capabilities).to receive(:version=).with('35')
133
+ expect(desired_capabilities).to receive(:platform=).with('Windows 8.1')
134
+ expect(watir_browser).to receive(:new)
135
+ SauceLabs.watir_browser :'chrome35|windows81', url: 'http://username:password@ip:port/wd/hub'
136
+ end
137
+
138
+ it "extracts Windows 7" do
139
+ expect(desired_capabilities).to receive(:version=).with('33')
140
+ expect(desired_capabilities).to receive(:platform=).with('Windows 7')
141
+ expect(watir_browser).to receive(:new)
142
+ SauceLabs.watir_browser :'chrome33|windows7', url: 'http://username:password@ip:port/wd/hub'
143
+ end
144
+
145
+ it "extracts Windows 8" do
146
+ expect(desired_capabilities).to receive(:version=).with('36')
147
+ expect(desired_capabilities).to receive(:platform=).with('Windows 8')
148
+ expect(watir_browser).to receive(:new)
149
+ SauceLabs.watir_browser :'chrome36|windows8', url: 'http://username:password@ip:port/wd/hub'
150
+ end
151
+ end
152
+
153
+
154
+ context "Platforms OS X" do
155
+ before(:each) do
156
+ allow(capabilities).to receive(:safari).and_return(desired_capabilities)
157
+ end
158
+
159
+ it "extracts OS X 10.9" do
160
+ expect(desired_capabilities).to receive(:version=).with('7')
161
+ expect(desired_capabilities).to receive(:platform=).with('OS X 10.9')
162
+ expect(watir_browser).to receive(:new)
163
+ SauceLabs.watir_browser :'safari7|osx109', url: 'http://username:password@ip:port/wd/hub'
164
+ end
165
+
166
+ it "extracts OS X 10.6" do
167
+ expect(desired_capabilities).to receive(:version=).with('6')
168
+ expect(desired_capabilities).to receive(:platform=).with('OS X 10.6')
169
+ expect(watir_browser).to receive(:new)
170
+ SauceLabs.watir_browser :'safari6|osx106', url: 'http://username:password@ip:port/wd/hub'
171
+ end
172
+
173
+ it "extracts OS X 10.8" do
174
+ expect(desired_capabilities).to receive(:version=).with('5')
175
+ expect(desired_capabilities).to receive(:platform=).with('OS X 10.8')
176
+ expect(watir_browser).to receive(:new)
177
+ SauceLabs.watir_browser :'safari5|osx108', url: 'http://username:password@ip:port/wd/hub'
178
+ end
179
+
180
+ end
181
+
182
+ context "Platforms Linux" do
183
+ before(:each) do
184
+ allow(capabilities).to receive(:chrome).and_return(desired_capabilities)
185
+ end
186
+
187
+ it "extracts Linux" do
188
+ expect(desired_capabilities).to receive(:version=).with('36')
189
+ expect(desired_capabilities).to receive(:platform=).with('Linux')
190
+ expect(watir_browser).to receive(:new)
191
+ SauceLabs.watir_browser :'chrome36|linux', url: 'http://username:password@ip:port/wd/hub'
192
+ end
193
+ end
194
+
195
+ context "Extract device" do
196
+ it "extracts iPhone" do
197
+ allow(capabilities).to receive(:chrome).and_return(desired_capabilities)
198
+ expect(desired_capabilities).to receive(:platform=).with('Linux')
199
+ expect(desired_capabilities).to receive(:device=).with('iPhone')
200
+ expect(watir_browser).to receive(:new)
201
+ SauceLabs.watir_browser :'chrome|linux|iphone', url: 'http://username:password@ip:port/wd/hub'
202
+ end
203
+
204
+ it "extracts Android" do
205
+ allow(capabilities).to receive(:chrome).and_return(desired_capabilities)
206
+ expect(desired_capabilities).to receive(:platform=).with('Linux')
207
+ expect(desired_capabilities).to receive(:device=).with('Android')
208
+ expect(selenium_driver).to receive(:for)
209
+ SauceLabs.selenium_driver :'chrome|linux|android', url: 'http://username:password@ip:port/wd/hub'
210
+ end
211
+ end
212
+
213
+ end
@@ -0,0 +1,3 @@
1
+ require 'saucelabs'
2
+ require 'selenium-webdriver'
3
+ require 'watir-webdriver'
@@ -0,0 +1,3 @@
1
+ language: jruby
2
+ rvm:
3
+ - 1.7.10
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: saucelabs
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.5'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pradeep K. Macharla
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-11-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: watir-webdriver
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: 0.6.9
21
+ none: false
22
+ requirement: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.6.9
27
+ none: false
28
+ prerelease: false
29
+ type: :runtime
30
+ - !ruby/object:Gem::Dependency
31
+ name: selenium-webdriver
32
+ version_requirements: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ none: false
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ none: false
44
+ prerelease: false
45
+ type: :runtime
46
+ - !ruby/object:Gem::Dependency
47
+ name: net-http-persistent
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ none: false
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ none: false
60
+ prerelease: false
61
+ type: :runtime
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ none: false
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ none: false
76
+ prerelease: false
77
+ type: :development
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ none: false
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ none: false
92
+ prerelease: false
93
+ type: :development
94
+ - !ruby/object:Gem::Dependency
95
+ name: rspec
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ none: false
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ none: false
108
+ prerelease: false
109
+ type: :development
110
+ description: Access saucelabs by passing browser, version, platform and device information
111
+ email:
112
+ - pradeep@seleniumframework.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .rspec
119
+ - ChangeLog
120
+ - Gemfile
121
+ - Guardfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - cucumber.yml
126
+ - features/Example.feature
127
+ - features/step_definitions/my_steps.rb
128
+ - features/support/android/appium.txt
129
+ - features/support/ios/appium.txt
130
+ - lib/saucelabs.rb
131
+ - lib/saucelabs/parsed_values.rb
132
+ - lib/saucelabs/sauce_api.rb
133
+ - lib/saucelabs/sauce_browser_factory.rb
134
+ - saucelabs.gemspec
135
+ - spec/lib/parsed_values_spec.rb
136
+ - spec/lib/sauce_browser_factory_spec.rb
137
+ - spec/lib/saucelabs_spec.rb
138
+ - spec/spec_helper.rb
139
+ - travis.yml
140
+ homepage: https://github.com/machzqcq/saucelabs
141
+ licenses:
142
+ - MIT
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ none: false
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ none: false
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 1.8.24
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: Access saucelabs, selenium grid or local browser instance using simple ruby.
165
+ test_files:
166
+ - features/Example.feature
167
+ - features/step_definitions/my_steps.rb
168
+ - features/support/android/appium.txt
169
+ - features/support/ios/appium.txt
170
+ - spec/lib/parsed_values_spec.rb
171
+ - spec/lib/sauce_browser_factory_spec.rb
172
+ - spec/lib/saucelabs_spec.rb
173
+ - spec/spec_helper.rb