mini_autobot 0.0.1

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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +26 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +191 -0
  7. data/LICENSE +22 -0
  8. data/README.md +632 -0
  9. data/bin/mini_autobot +5 -0
  10. data/lib/mini_autobot.rb +44 -0
  11. data/lib/mini_autobot/connector.rb +288 -0
  12. data/lib/mini_autobot/console.rb +15 -0
  13. data/lib/mini_autobot/emails.rb +5 -0
  14. data/lib/mini_autobot/emails/mailbox.rb +15 -0
  15. data/lib/mini_autobot/endeca/base.rb +6 -0
  16. data/lib/mini_autobot/init.rb +63 -0
  17. data/lib/mini_autobot/logger.rb +12 -0
  18. data/lib/mini_autobot/page_objects.rb +22 -0
  19. data/lib/mini_autobot/page_objects/base.rb +264 -0
  20. data/lib/mini_autobot/page_objects/overlay/base.rb +76 -0
  21. data/lib/mini_autobot/page_objects/widgets/base.rb +47 -0
  22. data/lib/mini_autobot/parallel.rb +197 -0
  23. data/lib/mini_autobot/runner.rb +91 -0
  24. data/lib/mini_autobot/settings.rb +78 -0
  25. data/lib/mini_autobot/test_case.rb +233 -0
  26. data/lib/mini_autobot/test_cases.rb +7 -0
  27. data/lib/mini_autobot/utils.rb +10 -0
  28. data/lib/mini_autobot/utils/assertion_helper.rb +35 -0
  29. data/lib/mini_autobot/utils/castable.rb +103 -0
  30. data/lib/mini_autobot/utils/data_generator_helper.rb +145 -0
  31. data/lib/mini_autobot/utils/endeca_helper.rb +46 -0
  32. data/lib/mini_autobot/utils/loggable.rb +16 -0
  33. data/lib/mini_autobot/utils/overlay_and_widget_helper.rb +78 -0
  34. data/lib/mini_autobot/utils/page_object_helper.rb +209 -0
  35. data/lib/mini_autobot/version.rb +3 -0
  36. data/lib/minitap/minitest5_rent.rb +22 -0
  37. data/lib/minitest/autobot_settings_plugin.rb +77 -0
  38. data/lib/tapout/custom_reporters/fancy_tap_reporter.rb +94 -0
  39. data/lib/yard/tagged_test_case_handler.rb +61 -0
  40. data/mini_autobot.gemspec +38 -0
  41. metadata +299 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 07bfa98f67061e2dce64bed72de1d674bb30d3b6
4
+ data.tar.gz: 0fdc455f8d5bbf1ba1b25b8e91971bfb8733400e
5
+ SHA512:
6
+ metadata.gz: 4c499b1873bb699eda4907a921084ad05d5cbb08fdf9f847aab0e163111bc0e50b51bd91446f3476d2831140fdef6199c102ff4ab07b80bf22c50f9e026199b3
7
+ data.tar.gz: 92a4539d1dea671d6e5ba03b9f9570078d899a151e7b18381020305d897790cb0c3a07d0359a3f3a0346cafc47582249c1fbeffde92a1fda868c9796e328db60
data/.gitignore ADDED
@@ -0,0 +1,26 @@
1
+ # vi swap files (the extra letters are used when there are duplicates)
2
+ *.sw[ponml]
3
+ .DS_Store
4
+
5
+ README.html
6
+
7
+ # emacs backup files (also used by other programs)
8
+ *~
9
+ \#*
10
+ .\#*
11
+ .nfs*
12
+ .bundle
13
+
14
+ # Ignore (IDE) project files
15
+ .idea
16
+ .project
17
+ .projects
18
+ .settings
19
+ *.sublime-*
20
+
21
+ # YARDoc files
22
+ .yardoc
23
+ doc
24
+
25
+ # temporary files
26
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.3
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,191 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mini_autobot (0.0.0)
5
+ activesupport (~> 4.2)
6
+ faker (~> 1.4)
7
+ google-api-client (~> 0.8)
8
+ google_drive (~> 1.0)
9
+ mail (~> 2.6)
10
+ minitap (~> 0.5.3)
11
+ minitest (~> 5.4.0)
12
+ pry (~> 0.10)
13
+ rest-client (~> 1.8)
14
+ selenium-webdriver (~> 2.46)
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ activesupport (4.2.3)
20
+ i18n (~> 0.7)
21
+ json (~> 1.7, >= 1.7.7)
22
+ minitest (~> 5.1)
23
+ thread_safe (~> 0.3, >= 0.3.4)
24
+ tzinfo (~> 1.1)
25
+ addressable (2.3.8)
26
+ ansi (1.5.0)
27
+ autoparse (0.3.3)
28
+ addressable (>= 2.3.1)
29
+ extlib (>= 0.9.15)
30
+ multi_json (>= 1.0.0)
31
+ childprocess (0.5.6)
32
+ ffi (~> 1.0, >= 1.0.11)
33
+ coderay (1.1.0)
34
+ diff-lcs (1.2.5)
35
+ domain_name (0.5.24)
36
+ unf (>= 0.0.5, < 1.0.0)
37
+ extlib (0.9.16)
38
+ faker (1.4.3)
39
+ i18n (~> 0.5)
40
+ faraday (0.9.1)
41
+ multipart-post (>= 1.2, < 3)
42
+ ffi (1.9.10)
43
+ formatador (0.2.5)
44
+ google-api-client (0.8.6)
45
+ activesupport (>= 3.2)
46
+ addressable (~> 2.3)
47
+ autoparse (~> 0.3)
48
+ extlib (~> 0.9)
49
+ faraday (~> 0.9)
50
+ googleauth (~> 0.3)
51
+ launchy (~> 2.4)
52
+ multi_json (~> 1.10)
53
+ retriable (~> 1.4)
54
+ signet (~> 0.6)
55
+ google_drive (1.0.1)
56
+ google-api-client (>= 0.7.0)
57
+ nokogiri (>= 1.4.4, != 1.5.2, != 1.5.1)
58
+ oauth (>= 0.3.6)
59
+ oauth2 (>= 0.5.0)
60
+ googleauth (0.4.2)
61
+ faraday (~> 0.9)
62
+ jwt (~> 1.4)
63
+ logging (~> 2.0)
64
+ memoist (~> 0.12)
65
+ multi_json (~> 1.11)
66
+ signet (~> 0.6)
67
+ guard (2.13.0)
68
+ formatador (>= 0.2.4)
69
+ listen (>= 2.7, <= 4.0)
70
+ lumberjack (~> 1.0)
71
+ nenv (~> 0.1)
72
+ notiffany (~> 0.0)
73
+ pry (>= 0.9.12)
74
+ shellany (~> 0.0)
75
+ thor (>= 0.18.1)
76
+ guard-compat (1.2.1)
77
+ guard-minitest (2.4.4)
78
+ guard-compat (~> 1.2)
79
+ minitest (>= 3.0)
80
+ http-cookie (1.0.2)
81
+ domain_name (~> 0.5)
82
+ i18n (0.7.0)
83
+ json (1.8.3)
84
+ jwt (1.5.1)
85
+ launchy (2.4.3)
86
+ addressable (~> 2.3)
87
+ listen (3.0.3)
88
+ rb-fsevent (>= 0.9.3)
89
+ rb-inotify (>= 0.9)
90
+ little-plugger (1.1.3)
91
+ logging (2.0.0)
92
+ little-plugger (~> 1.1)
93
+ multi_json (~> 1.10)
94
+ lumberjack (1.0.9)
95
+ mail (2.6.3)
96
+ mime-types (>= 1.16, < 3)
97
+ memoist (0.12.0)
98
+ method_source (0.8.2)
99
+ mime-types (2.6.1)
100
+ mini_portile (0.6.2)
101
+ minitap (0.5.3)
102
+ minitest (~> 5.0)
103
+ minitest-reporter-api (>= 0.0.2)
104
+ tapout (>= 0.3.0)
105
+ minitest (5.4.3)
106
+ minitest-reporter-api (0.0.5)
107
+ minitest (~> 5.0)
108
+ multi_json (1.11.2)
109
+ multi_xml (0.5.5)
110
+ multipart-post (2.0.0)
111
+ nenv (0.2.0)
112
+ netrc (0.10.3)
113
+ nokogiri (1.6.6.2)
114
+ mini_portile (~> 0.6.0)
115
+ notiffany (0.0.7)
116
+ nenv (~> 0.1)
117
+ shellany (~> 0.0)
118
+ oauth (0.4.7)
119
+ oauth2 (1.0.0)
120
+ faraday (>= 0.8, < 0.10)
121
+ jwt (~> 1.0)
122
+ multi_json (~> 1.3)
123
+ multi_xml (~> 0.5)
124
+ rack (~> 1.2)
125
+ pry (0.10.1)
126
+ coderay (~> 1.1.0)
127
+ method_source (~> 0.8.1)
128
+ slop (~> 3.4)
129
+ rack (1.6.4)
130
+ rake (10.4.2)
131
+ rb-fsevent (0.9.5)
132
+ rb-inotify (0.9.5)
133
+ ffi (>= 0.5.0)
134
+ rest-client (1.8.0)
135
+ http-cookie (>= 1.0.2, < 2.0)
136
+ mime-types (>= 1.16, < 3.0)
137
+ netrc (~> 0.7)
138
+ retriable (1.4.1)
139
+ rspec (3.3.0)
140
+ rspec-core (~> 3.3.0)
141
+ rspec-expectations (~> 3.3.0)
142
+ rspec-mocks (~> 3.3.0)
143
+ rspec-core (3.3.1)
144
+ rspec-support (~> 3.3.0)
145
+ rspec-expectations (3.3.0)
146
+ diff-lcs (>= 1.2.0, < 2.0)
147
+ rspec-support (~> 3.3.0)
148
+ rspec-mocks (3.3.1)
149
+ diff-lcs (>= 1.2.0, < 2.0)
150
+ rspec-support (~> 3.3.0)
151
+ rspec-support (3.3.0)
152
+ rubyzip (1.1.7)
153
+ selenium-webdriver (2.47.1)
154
+ childprocess (~> 0.5)
155
+ multi_json (~> 1.0)
156
+ rubyzip (~> 1.0)
157
+ websocket (~> 1.0)
158
+ shellany (0.0.1)
159
+ signet (0.6.1)
160
+ addressable (~> 2.3)
161
+ extlib (~> 0.9)
162
+ faraday (~> 0.9)
163
+ jwt (~> 1.5)
164
+ multi_json (~> 1.10)
165
+ slop (3.6.0)
166
+ tapout (0.4.5)
167
+ ansi
168
+ json
169
+ thor (0.19.1)
170
+ thread_safe (0.3.5)
171
+ tzinfo (1.2.2)
172
+ thread_safe (~> 0.1)
173
+ unf (0.1.4)
174
+ unf_ext
175
+ unf_ext (0.0.7.1)
176
+ websocket (1.2.2)
177
+ yard (0.8.7.6)
178
+
179
+ PLATFORMS
180
+ ruby
181
+
182
+ DEPENDENCIES
183
+ guard
184
+ guard-minitest
185
+ mini_autobot!
186
+ rake
187
+ rspec (~> 3.3.0)
188
+ yard
189
+
190
+ BUNDLED WITH
191
+ 1.10.5
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 RentPath, Inc.
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.
data/README.md ADDED
@@ -0,0 +1,632 @@
1
+
2
+ # MiniAutobot
3
+
4
+ Wrapper of minitest and selenium-webdriver that supports multiple OS/browser
5
+ UI automation testing, for either testing multiple webapps in one automation repo,
6
+ or testing one webapp with tests embedded in the webapp repo directly with
7
+ configuration guide provided below.
8
+
9
+ It's ready to be integrated in development pipeline with jenkins and saucelabs.
10
+
11
+
12
+ ## Prerequisites
13
+
14
+ #### Firefox
15
+
16
+ When running locally (with a browser installed on the same machine), all you
17
+ need is a supported version of the operating system and browser combination.
18
+
19
+ For example, to run against Firefox, all you need to do is run tests with the
20
+ `firefox` connector (which uses the `firefox` bridge). The connector (and the
21
+ bridge behind it) will automatically start the browser in the desired mode.
22
+
23
+ #### PhantomJS
24
+
25
+ On Mac OS X, PhantomJS can be installed on [HomeBrew](http://brew.sh). Once
26
+ you have HomeBrew installed, and `brew doctor` returns an all okay, you can:
27
+
28
+ $ brew install phantomjs
29
+
30
+ and it should be installed in a minute or so. Before any test are run, you'll
31
+ want to start PhantomJS:
32
+
33
+ $ phantomjs --webdriver=127.0.0.1:8910
34
+
35
+ Those parameters are compatible with the `phantomjs` connector supplied in this
36
+ project. It can also be run on a different machine; adjust the hostname and
37
+ port number parameters as necessary.
38
+
39
+
40
+ ## Installation
41
+
42
+ The simplest way to install it is to use Bundler.
43
+
44
+ Add MiniAutobot (and any other dependencies) to a Gemfile in your project’s root:
45
+
46
+ gem 'mini_autobot'
47
+
48
+ then install it by running Bundler:
49
+
50
+ $ bundle
51
+
52
+
53
+ ## Configuration
54
+
55
+ All configuration files should be placed under the `config/mini_autobot/` directory.
56
+ There are configuration files that are required for it to work properly:
57
+
58
+ * Tests directory structure, in `config/mini_autobot/tests.yml`, which define tests directory's
59
+ relative path and multi-host flag;
60
+ * Connector profiles, in `config/mini_autobot/connectors/*.yml`, which define WebDriver
61
+ properties, e.g., Firefox, SauceLabs;
62
+ * Environment profiles, in `config/mini_autobot/environments/*.yml`, which define which
63
+ environment tests are going to run against, e.g., QA, production; and
64
+
65
+ A typical config file structure looks like this:
66
+
67
+ config/
68
+ └── mini_autobot
69
+ ├── connectors
70
+ │   ├── firefox.yml
71
+ │   ├── phantomjs.yml
72
+ │   └── saucelabs.yml
73
+ ├── data
74
+ │   └── sitemap_states.yml
75
+ ├── environments
76
+ │   ├── ag_ci.yml
77
+ │   ├── ag_qa.yml
78
+ │   ├── rent_ci.yml
79
+ │   └── rent_qa.yml
80
+ ├── native_app_google_client.json
81
+ ├── test_suite.yml
82
+ └── tests.yml
83
+
84
+ #### Tests Directory Structure
85
+
86
+ A Tests Directory Structure file is a regular YAML file, which tells mini_autobot
87
+ where to find tests and which tests to load.
88
+
89
+ It must be named and placed like this `config/tests.yml` with contents like:
90
+
91
+ ---
92
+ tests_dir:
93
+ relative_path: 'web_tests'
94
+ multi-host: true
95
+
96
+ It defines two things:
97
+
98
+ 1. Tests dir relative path(no trailing slash) - same directory where directories
99
+ test_cases and page_objects are located, eg. web_tests, xxx/yyyy/tests;
100
+ 2. multi-host flag: false means test_cases dir is directly under tests_dir,
101
+ true means there's one more layer in middle: tests_dir/[hosts]/.
102
+
103
+ #### Connector Profile
104
+
105
+ A connector profile is a regular YAML file in a specific directory, which
106
+ describes how tests are run.
107
+
108
+ It should contain, at minimum, the `driver` key, which corresponds to the
109
+ browser argument to Selenium::WebDriver.for, which in turn is one of the bridge
110
+ types available. As of selenium-webdriver version 2.37.0, the values are:
111
+
112
+ * `firefox` or `ff` for a local version of Firefox;
113
+ * `internet_explorer` or `ie` for a local version of IE (Windows only);
114
+ * `chrome` for a local version of Google Chrome;
115
+ * `opera` for a local version of Opera;
116
+ * `safari` for a local version of Safari;
117
+ * `phantomjs` for a local _or_ remote instance of PhantomJS;
118
+ * `android` for a local version of the Android emulator on port 8080;
119
+ * `iphone` for a local version of the iPhone emulator on port 3001, which has
120
+ been deprecated in favor of a remote hub connection, e.g., to appium.io or
121
+ any such alternative; and
122
+ * `remote`, which is the generic remote bridge.
123
+
124
+ Overall, the bridge types are separated into two: local and remote. Whereas
125
+ a local bridge usually takes care of starting an internal server automatically,
126
+ a remote bridge is a service that is running a daemon (usually WebDriver Hub)
127
+ on a specific address-and-port combination.
128
+
129
+ For local bridges, the `driver` key is the only key necessary in the profile:
130
+
131
+ ---
132
+ driver: 'firefox'
133
+
134
+ some local bridges may support multiple versions of the same browser, but
135
+ you are on your own to set that up.
136
+
137
+ For remote bridges, you'll usually need the correct `driver` and `hub.url`
138
+ keys in the profile, e.g., for a PhantomJS instance running on port 8910
139
+ on a remote host:
140
+
141
+ ---
142
+ driver: 'phantomjs'
143
+ hub:
144
+ url: 'http://some_address.com:8910'
145
+
146
+ Of course, this assumes that the remote bridge doesn't require authentication.
147
+ For anything else, you'll need to specify the optional `hub.user` and
148
+ `hub.pass` keys:
149
+
150
+ ---
151
+ driver: 'phantomjs'
152
+ hub:
153
+ url: 'http://some_address.com:8910'
154
+ user: 'username'
155
+ pass: 'password'
156
+
157
+ A more generic option for remote drivers is the `remote` bridge type. In our
158
+ case with PhantomJS, this also works, although your driver's capabilities
159
+ may not be set up correctly (and you may run into problems if the website
160
+ you are testing attempts to detect touch events, for instance):
161
+
162
+ ---
163
+ driver: 'remote'
164
+ hub:
165
+ url: 'http://some_address.com:8910'
166
+ user: 'username'
167
+ pass: 'password'
168
+
169
+ With any WebDriver Hub, though, this generic remote bridge is exactly what
170
+ is required. A hub is an HTTP interface that multiplexes sessions on various
171
+ different browsers, machines, and across many versions, through one URL.
172
+
173
+ One great example is SauceLabs, which has over 30 different combinations of
174
+ testing platforms. Unfortunately, in order to configure the multiplexing,
175
+ you will need to set up different profiles for each combination. This is where
176
+ overrides come in. Let's take, for example, this profile:
177
+
178
+ ---
179
+ driver: 'remote'
180
+ hub:
181
+ url: 'http://address.com/wd/hub'
182
+ overrides:
183
+ qateam:
184
+ hub:
185
+ user: 'qateam'
186
+ pass: '1234'
187
+ prodteam:
188
+ hub:
189
+ user: 'prodteam'
190
+ pass: '5678'
191
+ linux_ff20:
192
+ archetype: 'firefox'
193
+ capabilities:
194
+ version: '20.0'
195
+ platform: 'linux'
196
+ linux_chrome31:
197
+ archetype: 'chrome'
198
+ capabilities:
199
+ version: '31'
200
+ platform: 'linux'
201
+
202
+ Assuming the above profile is placed into `saucelabs.yml`, then when we run
203
+ tests with the connector profile `saucelabs:qateam:linux_ff20`, MiniAutobot would
204
+ have calculated the following _effective_ profile:
205
+
206
+ ---
207
+ driver: 'remote'
208
+ hub:
209
+ url: 'http://address.com/wd/hub'
210
+ user: 'qateam'
211
+ pass: '1234'
212
+ archetype: 'firefox'
213
+ capabilities:
214
+ version: '20.0'
215
+ platform: 'linux'
216
+
217
+ where the contents of the keys `overrides.qateam` and `overrides.linux_ff20`
218
+ are promoted to the root of the profile, and everything else under `overrides`
219
+ is removed.
220
+
221
+ Now, the effective profile has a couple of new keys:
222
+
223
+ * `archetype` is used to signal to the remote driver what bridge it should use
224
+ in turn to connect to the browser on their end; while
225
+ * `capabilities` is a hash, determined by the remote driver, containing any
226
+ number of capability values that the browser should support.
227
+
228
+ Capabilities are usually determined by the remote webservice, and as such,
229
+ refer to the vendor's documentation on the valid values and examples. See also
230
+ the top of each connector profile file for a brief description, if any.
231
+
232
+ Additionally, some drivers also support timeout values under the `timeouts`
233
+ key, which can in turn contain the following keys, each taking a value, in
234
+ number of seconds:
235
+
236
+ * `driver` defines the length of time that the bridge will wait for a response
237
+ from the driver;
238
+ * `implicit_wait` defines the length of time that the bridge will ask the
239
+ driver to continuously poll the browser for a command, such as finding one or
240
+ more elements on the current page;
241
+ * `page_load` defines the amount of time the driver will wait for a page to
242
+ load before giving up and returning an error; and
243
+ * `script_timeout` defines the amount of time the driver will allow JavaScript
244
+ to be executed on a specific page before halting execution and returning an
245
+ error to the bridge.
246
+
247
+ An example of the `timeouts`:
248
+
249
+ ---
250
+ driver: 'phantomjs'
251
+ hub:
252
+ url: 'http://some_address.com:8910'
253
+ timeouts:
254
+ driver: 90
255
+ implicit_wait: 90
256
+
257
+ It is important to note that not all drivers support all timesouts. The
258
+ `timeouts.driver` and `timeouts.implicit_wait` are the two safest to rely upon.
259
+ In general, `timeouts.driver` should be the longest of the timeouts, if
260
+ specified, because otherwise, the page could timeout after the driver does,
261
+ causing a false negative in the test (and often a cryptic error message).
262
+
263
+
264
+ #### Environment Profile
265
+
266
+ An environment profile is a regular YAML file in a specific directory, which
267
+ describes against what environment tests are run.
268
+
269
+ Only one key is required: `root`, which points to the root URL for the
270
+ environment:
271
+
272
+ ---
273
+ root: 'http://www.env.host_address.com'
274
+
275
+ #### Test Suite
276
+
277
+ A typical test suite configuration file `config/test_suite.yml` looks like this:
278
+
279
+ ----
280
+ regression:
281
+ tag_to_exclude: :non_regression
282
+
283
+ - Regression
284
+
285
+ - Integration
286
+ - Non-integration
287
+
288
+ - Non-regression
289
+
290
+ - Automated test that is not testing (user) features.
291
+ Examples: link checker(mainly for sitemap), events(tracking, logging)
292
+
293
+ When adding a new test, it'll be part of regression suite by default.
294
+ To make it part of integration in addition to regression, add tag :integration;
295
+ To exclude it from regression, add tag :non_regression (by default),
296
+ or find the appropriate tag_to_exclude in config/mini_autobot/test_suite.yml
297
+
298
+
299
+ ## Executing Tests
300
+
301
+ Before you are able to run one or more tests, you'll need to select a connector
302
+ and an environment profile; see the _Configuration_ section below if you want
303
+ to add new profiles.
304
+
305
+ To run test headlessly on default environment(stg), set connector to GhostDriver,
306
+ which is Phantomjs's implementation of webdriver protocal, run:
307
+
308
+ $ bundle exec mini_autobot --connector=phantomjs
309
+
310
+ To override the connector to your local browser, and to override environment,
311
+ use these options:
312
+
313
+ $ bundle exec mini_autobot --connector=firefox --env=qa
314
+
315
+ which will use `config/mini_autobot/connectors/firefox.yml` and `config/mini_autobot/environments/qa.yml`
316
+ as the profiles.
317
+
318
+ Some profiles may contain a section named `overrides`, for example, to support
319
+ multiple browsers in a remote execution environment like SauceLabs. Such
320
+ profiles can be used like this:
321
+
322
+ $ bundle exec mini_autobot --connector=saucelabs:linux_ff20 --env=qa
323
+
324
+ which will use the `linux_ff20` override in the `saucelabs` connector profile,
325
+ and run tests against the `qa` environment. Multiple overrides may be specified
326
+ one after the other, after the profile name, and always separated by colons,
327
+ for example:
328
+
329
+ $ bundle exec mini_autobot -c saucelabs:linux_ff20:qateam:notimeouts -e qa
330
+
331
+ To make a specific connector or environment profile always be the default on
332
+ your machine or shell session, set the `AUTOBOT_CONNECTOR` or `AUTOBOT_ENV`
333
+ environment variables respectively. For example, you can add the following to
334
+ your shell profile (`.bash_profile` for bash or `.zlogin` for zsh):
335
+
336
+ export AUTOBOT_CONNECTOR=firefox
337
+ export AUTOBOT_ENV=qa
338
+
339
+ Refer to the _Configuration_ section below for advanced use cases, and refer
340
+ to `mini_autobot -h` for a complete list of command line options.
341
+
342
+
343
+ #### Running a Subset of Tests
344
+
345
+ Assuming you have a test in `MiniAutobot::TestCases::Search` that is defined as:
346
+
347
+ test :search_zip, tags: [:homepage, :srp, :zip, :critical] do
348
+ # Assertions go here
349
+ end
350
+
351
+ then you have a couple of different options to run it. The most straight-
352
+ forward case is to run all test cases:
353
+
354
+ $ bundle exec mini_autobot
355
+
356
+ As a second option, you can run only that specific test case. For that, you'll
357
+ need to know the name of the test case, and add `test_` in front of it. In the
358
+ example above, the name is `search_zip`, so it can be run like so:
359
+
360
+ $ bundle exec mini_autobot -n test_search_zip
361
+
362
+ As a third option, you can run any test case whose name contains the word
363
+ "search" in it:
364
+
365
+ $ bundle exec mini_autobot -n /search/
366
+
367
+ It should be noted that this form supports regular expressions so that:
368
+
369
+ $ bundle exec mini_autobot -n '/search_\d{5}/'
370
+
371
+ will run all test cases with the word `search_` followed by five digits. Keep
372
+ in mind that _special characters_ such as backslashes and curly braces must
373
+ either be escaped, or quoted.
374
+
375
+ The fourth option is to run test cases that match one or more tags. To run all
376
+ test cases with the tag `:srp`, we can:
377
+
378
+ $ bundle exec mini_autobot -t srp
379
+
380
+ The `-t` option is powerful, because it supports multiple tags. To run all test
381
+ cases tagged with `:homepage` *and* `:srp`, use:
382
+
383
+ $ bundle exec mini_autobot -t homepage,srp
384
+
385
+ To run all test cases tagged with `:homepage` or tagged with `:srp` (or both):
386
+
387
+ $ bundle exec mini_autobot -t homepage -t srp
388
+
389
+ And of course, the combination also works:
390
+
391
+ $ bundle exec mini_autobot -t srp,submarket -t srp,zip
392
+
393
+ But what about tests you want NOT to run, that are slow or test functionality
394
+ you know is broken? If your preferences correspond to a certain tag (say,
395
+ :slow), you can negate that tag by prefixing it with '!', which may need to be
396
+ quoted or escaped in some shells/contexts.
397
+
398
+ $ bundle exec mini_autobot -t 'myrent,!slow' # skip slow myrent tests
399
+ $ bundle exec mini_autobot -t myrent,\!slow # likewise
400
+ $ bundle exec mini_autobot -t \!search # run all non-search tests
401
+
402
+ Note, every test has a tag added automatically during run time, the tag is formatted
403
+ by removing all underscores from name of a class, and prefixing it with "class_".
404
+ For example, to run all tests in sign_in.rb,
405
+
406
+ $ bundle exec mini_autobot -t class_signin
407
+
408
+
409
+ Read Rakefile for how to run test with default settings through rake tasks
410
+
411
+ #### Debug output
412
+
413
+ It's not good style to clutter your code with puts messages. Instead, use the
414
+ handy built-in logger facility defined in MiniAutobot::Utils::Loggable, accessible
415
+ through the 'logger' method in TestCase and PageObject objects, like so:
416
+
417
+ test :my_fancy_test, tags: [:fancy] do
418
+ self.logger.debug "Let's get fancy!"
419
+ end
420
+
421
+ The logger prints messages to logs/mini_autobot.log. You won't see debug messages
422
+ there by default; for that you need to go beyond --verbose and add an extra 'v'
423
+ to your flags:
424
+
425
+ $ bundle exec mini_autobot -t fancy -vv
426
+
427
+ #### TAP
428
+
429
+ For more info on TAP (Test Anything Protocol), see also:
430
+ http://www.testanything.org/
431
+
432
+ The option in autobot is:
433
+
434
+ --tapy Use TapY reporter.
435
+ --tapj Use TapJ reporter.
436
+
437
+ The TapY is YAML, and the TapJ is JSON output.
438
+
439
+ #### TAPOUT
440
+
441
+ TAPOUT gets test result from TapY or TapJ, then output result using a reporter by your choice.
442
+ To see a list of options and reporters from gem TAPOUT,
443
+
444
+ $ tapout --help
445
+
446
+ To use our custom reporter, FancyTapReporter,
447
+
448
+ $ bundle exec mini_autobot --tapy | tapout -r ./lib/tapout/custom_reporters/fancy_tap_reporter.rb fancytap
449
+
450
+ To make it presentable to jenkins or other webpage, supress color/highlight codes,
451
+
452
+ $ bundle exec mini_autobot --tapy | tapout --no-color -r ./lib/tapout/custom_reporters/fancy_tap_reporter.rb fancytap
453
+
454
+
455
+ ## Test Cases
456
+
457
+ Test cases should be added as a class under `MiniAutobot::TestCases` (plural), and
458
+ inherit from the class `MiniAutobot::TestCase` (singular).
459
+
460
+ The setup and teardown methods should be added as class attributes:
461
+
462
+ module MiniAutobot
463
+ module TestCases
464
+ class LeaseReport < TestCase
465
+
466
+ setup do
467
+ # Contents of the setup
468
+ end
469
+
470
+ teardown do
471
+ # Contents of the teardown
472
+ end
473
+
474
+ end
475
+ end
476
+ end
477
+
478
+ This approach is used in order to allow us to compose our objects correctly and
479
+ allow the inheritance chain to always be respected. The alternative to this is
480
+ the normal `setup` and `teardown` methods, but a `super()` must always be called
481
+ at the beginning and at the end of each, respectively. By using class attributes,
482
+ we don't need to do anything else special.
483
+
484
+ Similarly, test cases should be provided as an attribute on the class:
485
+
486
+ class LeaseReport # continuing from the example above, it already inherits
487
+
488
+ test :arbitrary_name, tags: [:foo, :bar] do
489
+ # Contents of test here, with assert_* calls
490
+ end
491
+
492
+ end
493
+
494
+ See {Running a Subset of Tests} for information on the `tags` option.
495
+
496
+
497
+
498
+ ## Page Objects
499
+
500
+ Parts of a page should be added under `MiniAutobot::PageObjects::Components`, and
501
+ overlays should be added under `MiniAutobot::PageObjects::Overlay`.
502
+
503
+ Because of WebDriver's asynchronous nature, the order of operations is never
504
+ guaranteed. When casting a page to another page, the `cast` call _should_
505
+ happen right after the action that causes the page to change. For example, if
506
+ clicking on a link causes the page to move to another page, the cast should
507
+ happen after the click, and before anything else:
508
+
509
+ def some_action!
510
+ @driver.find_element(:id, 'main-link').click
511
+ # There should be nothing in between these two lines; in fact, the
512
+ # cast should be the last line of the method
513
+ cast(:new_page)
514
+ end
515
+
516
+ Page object methods that return a different page must end in `!`, signifying
517
+ that is returns a different page object, thus invalidating the current page
518
+ object. Page object invalidation is handled automatically through the use of
519
+ ruby object freezing.
520
+
521
+ #### Overlay
522
+
523
+ An Overlay represents a portion (an element) of a page that can be repeated
524
+ Multiple times across many pages. But only appear once per page at a time.
525
+ Some examples of overlays include:
526
+ -Password
527
+ -Hotlead
528
+ Overlays will be called via Includes on the page object, when accessing overlays
529
+ its best to return the current page as an object, ie:
530
+ #Check Availability link on srp,
531
+ # Return +HotLead+s representing hotlead overlay on
532
+ # the SRP.
533
+ def check_availability!
534
+ @driver.find_element(*LINK_CHECKAVAILABILITY).click
535
+ cast(:search)
536
+ end
537
+ Overlays are technically not new pages, and should be differentiated from actual pages.
538
+
539
+ ## Best Practice
540
+
541
+ * Always use local variables, unless _absolutely_ necessary, then use instance
542
+ variables. Avoid constants and class variables unless you know what you're
543
+ doing. Never use global variables.
544
+ * To keep track of configuration settings, see the _CONFIGURATION_ section above.
545
+ * If you need to keep track of global state, you're doing it wrong. If you need
546
+ configuration settings, see previous bulletpoint.
547
+ * Comment your code. All methods must be commented, but you shouldn't add a
548
+ comment every line.
549
+ * Always explicitly open your modules and class definitions, e.g., use:
550
+
551
+ module A
552
+ module B
553
+ class C
554
+ # code goes here
555
+ end
556
+ end
557
+ end
558
+
559
+ instead of:
560
+
561
+ class A::B::C
562
+ # code goes here
563
+ end
564
+
565
+ because the latter will not properly resolve class names. See [this blog
566
+ post](http://cirw.in/blog/constant-lookup.html) for an explanation. There
567
+ are other alternatives, such as `ActiveSupport::Dependencies`, which brings
568
+ [other caveats](http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/)
569
+ to the table.
570
+ * Indent all Ruby code using 2 spaces.
571
+ * Page object methods that return a different page _must_ end in a `!`.
572
+
573
+
574
+ ## Troubleshooting
575
+
576
+ **I receive a `Net::ReadTimeout` when running my tests.**
577
+
578
+ The cause for `Net::ReadTimeout` is usually one of two things:
579
+
580
+ * a temporary error caused by one or more external elements on the page that
581
+ blocks the browser from loading the page in its entirety; or
582
+ * a permanent error caused by the driver timeout being too low. See connector
583
+ profiles and the `timeouts.driver` key.
584
+
585
+
586
+ **I receive a `401`, `404` or other HTTP errors before even running my tests.**
587
+
588
+ HTTP status codes can be returned by the browser, or by the driver. If the
589
+ browser is returning those codes, then it is outside the scope of this page.
590
+
591
+ If, however, the driver is returning those codes, then there are several
592
+ possible reasons:
593
+
594
+ * on a 400, the bridge command is most likely sending an incomplete request,
595
+ and could mean that the bridge doesn't support certain features of the
596
+ driver;
597
+ * on a 401, you are most likely not using the correct username and password for
598
+ the hub URL (the `hub.user` and `hub.pass` keys);
599
+ * on a 404, you are most likely using an invalid command, possibly a command
600
+ that is not supported by the remote hub, or by the browser on the remote hub;
601
+ * on a 405, you are using a custom command incorrectly, e.g., using a GET to
602
+ the hub, rather than a POST;
603
+ * on a 501, the bridge (the ruby side) uses too new of a version compared to
604
+ the driver or browser, and a browser upgrade is usually recommended, or if
605
+ necessary, adjust the list of capabilities.
606
+
607
+ In addition to regular HTTP status codes, the bridge also understands the
608
+ standardized Response Status Codes as defined in the [Selenium WebDriver JSON
609
+ Wire Protocol](https://code.google.com/p/selenium/wiki/JsonWireProtocol).
610
+
611
+
612
+ **I receive a `StaleElementReferenceError` (or similar sounding name)**
613
+ **intermittently when running one or more tests.**
614
+
615
+ A stale element reference is a reference to an element that is no longer active
616
+ on the page. This usually happens when you find an element on a page, go a
617
+ different page (either by `get()`ing a new URL or by interacting with an
618
+ element), and then try to perform actions against the aforementioned element on
619
+ the page.
620
+
621
+ ## Contributing
622
+
623
+ 1. Fork it
624
+ 2. Create your feature branch `git checkout -b my-new-feature`
625
+ 3. Commit your changes `git commit -am 'Add some feature'`
626
+ 4. Push to the branch `git push origin my-new-feature`
627
+ 5. Create new Pull Request
628
+
629
+ ## License
630
+
631
+ MiniAutobot is released under the MIT License. See the bundled LICENSE file for
632
+ details.