rudra 1.0.12 → 1.0.17

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rudra.rb +80 -133
  3. metadata +13 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11f829929ce5e13efb620e44b35f6882942dd2f8dca206db78fa19bfc4ba64d4
4
- data.tar.gz: 65dc1df4a7fe8b87c1a20cc79e9895e8c839f6e4f5c671ac9197f03fadf53ec1
3
+ metadata.gz: a6b9b8353fbb965300bb0e6c9a96ef162717fc1b7e3afaa46192d414a0828584
4
+ data.tar.gz: 5ca513a1614e4c9fbae46dc5caf4636d5b579fd8e1fc74c6f745cc61d7d9ddcf
5
5
  SHA512:
6
- metadata.gz: e1f367f85982ad45befc3214260f1236f8b5e808cc6db493b1066671c2571419a25d0aea661eda256d45c486d71bf8ed31e0d29c6ecbac58b4c3257df69e4322
7
- data.tar.gz: d31e14987b7abed8796112fe38f1301ede0214dabe9b8af31211644ba15cf4fb5b8953f66332ab726eb666999a867a225a1f563dab64099cb9848ee451145496
6
+ metadata.gz: e775d57a29612f265578c1ecfd665e093f837460b32012763ab88983d47a1b7ae674903e1e5169b30609e65cce59d621800ab20500013d506b4dd8120fa76f55
7
+ data.tar.gz: 98b306bd3f397ae54f53224fa88d57aacb5d6b6699a92706440626ddbe8dee4d75e3d7ff751fd71e2d64d0bd88a3e95852d1680720b7731fed6eccb22a7213bc
@@ -1,9 +1,5 @@
1
1
  require 'selenium-webdriver'
2
- require 'webdrivers/chromedriver'
3
- require 'webdrivers/geckodriver'
4
-
5
- # Selenium::WebDriver::Chrome::Service.driver_path = './webdrivers/chromedriver'
6
- # Selenium::WebDriver::Firefox::Service.driver_path = './webdrivers/geckodriver'
2
+ require 'webdrivers'
7
3
 
8
4
  # Selenium IDE-like WebDriver based upon Ruby binding
9
5
  # @author Aaron Chen
@@ -12,11 +8,15 @@ require 'webdrivers/geckodriver'
12
8
  # of the chosen browser
13
9
  # @attr_reader [String] install_dir The install directory of WebDrivers
14
10
  # @attr_reader [String] locale The browser locale
11
+ # @attr_reader [Boolean] headless Headless mode for Google Chrome
12
+ # @attr_reader [String] window_size Chrome window size when headless
13
+ # @attr_reader [String] screen_dir The screenshot directory of save_screenshot
14
+ # @attr_reader [String] log_prefix Prefix for logging executed methods
15
15
  # @attr_reader [Integer] timeout The driver timeout
16
16
  # @attr_reader [Boolean] verbose Verbose mode
17
17
  class Rudra
18
18
  # Supported Browsers
19
- BROWSERS = %i[chrome firefox safari].freeze
19
+ BROWSERS = %i[chrome firefox ie safari].freeze
20
20
 
21
21
  # Element Finder Methods
22
22
  HOWS = %i[
@@ -24,8 +24,16 @@ class Rudra
24
24
  name partial_link_text tag_name xpath
25
25
  ].freeze
26
26
 
27
+ # Attributes
28
+ ATTRIBUTES = %i[
29
+ browser driver install_dir locale
30
+ headless window_size screen_dir
31
+ log_prefix timeout verbose
32
+ ].freeze
33
+
27
34
  attr_reader :browser, :driver, :install_dir, :locale,
28
- :headless, :log_prefix, :timeout, :verbose
35
+ :headless, :window_size, :screen_dir,
36
+ :log_prefix, :timeout, :verbose
29
37
 
30
38
  # Initialize an instance of Rudra
31
39
  # @param [Hash] options the options to initialize Rudra
@@ -35,7 +43,9 @@ class Rudra
35
43
  # directory of WebDrivers
36
44
  # @option options [Symbol] :locale (:en) the browser locale
37
45
  # @option options [Boolean] :headless (false) headless mode
38
- # @option options [String] :log_prefix (' - ') log prefix
46
+ # @option options [String] :window_size ('1280,720') window size when headless
47
+ # @option options [String] :screen_dir ('./screens/') the location of screenshots
48
+ # @option options [String] :log_prefix (' - ') prefix for logging executed methods
39
49
  # @option options [Integer] :timeout (30) implicit_wait timeout
40
50
  # @option options [Boolean] :verbose (true) verbose mode
41
51
  def initialize(options = {})
@@ -43,21 +53,15 @@ class Rudra
43
53
  self.install_dir = options.fetch(:install_dir, './webdrivers/')
44
54
  self.locale = options.fetch(:locale, :en)
45
55
  self.headless = options.fetch(:headless, false)
56
+ self.window_size = options.fetch(:window_size, '1280,720')
57
+ self.screen_dir = options.fetch(:screen_dir, './screens/')
46
58
  self.log_prefix = options.fetch(:log_prefix, ' - ')
47
59
  self.verbose = options.fetch(:verbose, true)
60
+ self.main_label = caller_locations(2, 1).first.label
48
61
 
49
62
  initialize_driver
50
63
 
51
64
  self.timeout = options.fetch(:timeout, 30)
52
-
53
- @main_label = caller_locations(2, 1).first.label
54
- @verbose && (
55
- puts %(
56
- ============ Rudra ============
57
- Browser: #{@browser}, Locale: #{@locale}
58
- ============ Log ============
59
- ).lines.map(&:strip).reject(&:empty?).join("\n")
60
- )
61
65
  end
62
66
 
63
67
  #
@@ -67,14 +71,12 @@ class Rudra
67
71
  # Initialize ActionBuilder
68
72
  # @return [Selenium::WebDriver::ActionBuilder] ActionBuilder
69
73
  def action
70
- log
71
74
  driver.action
72
75
  end
73
76
 
74
77
  # Get the active element
75
78
  # @return [Selenium::WebDriver::Element] the active element
76
79
  def active_element
77
- log
78
80
  driver.switch_to.active_element
79
81
  end
80
82
 
@@ -86,43 +88,37 @@ class Rudra
86
88
  # @option opts [Boolean] :secure (false) a boolean
87
89
  # @option opts [Time, DateTime, Numeric, nil] :expires (nil) expiry date
88
90
  def add_cookie(opts = {})
89
- log(opts)
90
91
  driver.manage.add_cookie(opts)
91
92
  end
92
93
 
93
94
  # Accept an alert
94
95
  def alert_accept
95
- log
96
96
  switch_to_alert.accept
97
97
  end
98
98
 
99
99
  # Dismiss an alert
100
100
  def alert_dismiss
101
- log
102
101
  switch_to_alert.dismiss
103
102
  end
104
103
 
105
104
  # Send keys to an alert
105
+ # @param [String] keys keystrokes to send
106
106
  def alert_send_keys(keys)
107
- log(keys)
108
107
  switch_to_alert.send_keys(keys)
109
108
  end
110
109
 
111
110
  # Move back a single entry in the browser's history
112
111
  def back
113
- log
114
112
  driver.navigate.back
115
113
  end
116
114
 
117
115
  # Open a blank page
118
116
  def blank
119
- log
120
117
  open('about:blank')
121
118
  end
122
119
 
123
120
  # Close the current window, or the browser if no windows are left
124
121
  def close
125
- log
126
122
  driver.close
127
123
  end
128
124
 
@@ -130,27 +126,23 @@ class Rudra
130
126
  # @param [String] name the name of the cookie
131
127
  # @return [Hash, nil] the cookie, or nil if it wasn't found
132
128
  def cookie_named(name)
133
- log(name)
134
129
  driver.manage.cookie_named(name)
135
130
  end
136
131
 
137
132
  # Get the URL of the current page
138
133
  # @return (String) the URL of the current page
139
134
  def current_url
140
- log
141
135
  driver.current_url
142
136
  end
143
137
 
144
138
  # Delete all cookies
145
139
  def delete_all_cookies
146
- log
147
140
  driver.manage.delete_all_cookies
148
141
  end
149
142
 
150
143
  # Delete the cookie with the given name
151
144
  # @param [String] name the name of the cookie
152
145
  def delete_cookie(name)
153
- log(name)
154
146
  driver.manage.delete_cookie(name)
155
147
  end
156
148
 
@@ -162,7 +154,6 @@ class Rudra
162
154
  # @return [Selenium::WebDriver::Element, Integer, Float, Boolean, NilClass,
163
155
  # String, Array] the value returned from the script
164
156
  def execute_script(script, *args)
165
- log
166
157
  driver.execute_script(script, *args)
167
158
  end
168
159
 
@@ -171,8 +162,6 @@ class Rudra
171
162
  # identify the element or Selenium::WebDriver::Element
172
163
  # @return [Selenium::WebDriver::Element] the element found
173
164
  def find_element(locator)
174
- log(locator)
175
-
176
165
  return locator if locator.is_a?(Selenium::WebDriver::Element)
177
166
 
178
167
  element = nil
@@ -196,8 +185,6 @@ class Rudra
196
185
  # @param [String] locator the locator to identify the elements
197
186
  # @return [Array<Selenium::WebDriver::Element>] the elements found
198
187
  def find_elements(locator)
199
- log(locator)
200
-
201
188
  how, what = parse_locator(locator)
202
189
  driver.find_elements(how, what) ||
203
190
  abort("Failed to find elements: #{locator}")
@@ -205,32 +192,26 @@ class Rudra
205
192
 
206
193
  # Move forward a single entry in the browser's history
207
194
  def forward
208
- log
209
195
  driver.navigate.forward
210
196
  end
211
197
 
212
198
  # Make the current window full screen
213
199
  def full_screen
214
- log
215
200
  driver.manage.window.full_screen
216
201
  end
217
202
 
218
203
  # Quit the browser
219
204
  def quit
220
- log
221
205
  driver.quit
222
206
  end
223
207
 
224
208
  # Maximize the current window
225
209
  def maximize
226
- log
227
- driver.manage.window.maximize
210
+ driver.manage.window.maximize unless headless
228
211
  end
229
212
 
230
213
  # Maximize the current window to the size of the screen
231
214
  def maximize_to_screen
232
- log
233
-
234
215
  size = execute_script(%(
235
216
  return { width: window.screen.width, height: window.screen.height };
236
217
  ))
@@ -241,7 +222,6 @@ class Rudra
241
222
 
242
223
  # Minimize the current window
243
224
  def minimize
244
- log
245
225
  driver.manage.window.minimize
246
226
  end
247
227
 
@@ -249,14 +229,12 @@ class Rudra
249
229
  # @param [Integer] point_x the x coordinate
250
230
  # @param [Integer] point_y the y coordinate
251
231
  def move_window_to(point_x, point_y)
252
- log(point_x, point_y)
253
232
  driver.manage.window.move_to(point_x, point_y)
254
233
  end
255
234
 
256
235
  # Open a new tab
257
236
  # @return [String] the id of the new tab obtained from #window_handles
258
237
  def new_tab
259
- log
260
238
  execute_script('window.open();')
261
239
  window_handles.last
262
240
  end
@@ -264,7 +242,6 @@ class Rudra
264
242
  # Open a new window
265
243
  # @param [String] name the name of the window
266
244
  def new_window(name)
267
- log(name)
268
245
  execute_script(%(
269
246
  var w = Math.max(
270
247
  document.documentElement.clientWidth, window.innerWidth || 0
@@ -279,20 +256,17 @@ class Rudra
279
256
  # Open the specified URL in the browser
280
257
  # @param [String] url the URL of the page to open
281
258
  def open(url)
282
- log(url)
283
259
  driver.get(url)
284
260
  end
285
261
 
286
262
  # Get the source of the current page
287
263
  # @return (String) the source of the current page
288
264
  def page_source
289
- log
290
265
  driver.page_source
291
266
  end
292
267
 
293
268
  # Refresh the current pagef
294
269
  def refresh
295
- log
296
270
  driver.navigate.refresh
297
271
  end
298
272
 
@@ -300,55 +274,51 @@ class Rudra
300
274
  # @param [Integer] width the width of the window
301
275
  # @param [Integer] height the height of the window
302
276
  def resize_window_to(width, height)
303
- log(width, height)
304
277
  driver.manage.window.resize_to(width, height)
305
278
  end
306
279
 
307
- # Save a PNG screenshot to the given path
308
- # @param [String] png_path the path of PNG screenshot
309
- def save_screenshot(png_path)
310
- log(png_path)
280
+ # Save a PNG screenshot to file
281
+ # @param [String] filename the filename of PNG screenshot
282
+ def save_screenshot(filename)
283
+ mkdir(@screen_dir) unless Dir.exist?(@screen_dir)
311
284
  driver.save_screenshot(
312
- png_path.end_with?('.png') ? png_path : "#{png_path}.png"
285
+ File.join(
286
+ @screen_dir,
287
+ filename.end_with?('.png') ? filename : "#{filename}.png"
288
+ )
313
289
  )
314
290
  end
315
291
 
316
292
  # Switch to the currently active modal dialog
317
293
  def switch_to_alert
318
- log
319
294
  driver.switch_to.alert
320
295
  end
321
296
 
322
297
  # Select either the first frame on the page,
323
298
  # or the main document when a page contains iframes
324
299
  def switch_to_default_content
325
- log
326
300
  driver.switch_to.default_content
327
301
  end
328
302
 
329
303
  # Switch to the frame with the given id
330
304
  def switch_to_frame(id)
331
- log(id)
332
305
  driver.switch_to.frame(id)
333
306
  end
334
307
 
335
308
  # Switch to the parent frame
336
309
  def switch_to_parent_frame
337
- log
338
310
  driver.switch_to.parent_frame
339
311
  end
340
312
 
341
313
  # Switch to the given window handle
342
314
  # @param [String] id the window handle obtained through #window_handles
343
315
  def switch_to_window(id)
344
- log(id)
345
316
  driver.switch_to.window(id)
346
317
  end
347
318
 
348
319
  # Get the title of the current page
349
320
  # @return [String] the title of the current page
350
321
  def title
351
- log
352
322
  driver.title
353
323
  end
354
324
 
@@ -356,7 +326,6 @@ class Rudra
356
326
  # @param [Integer] seconds seconds before timed out
357
327
  # @return [Object] the result of the block
358
328
  def wait_for(seconds = timeout)
359
- log(seconds)
360
329
  Selenium::WebDriver::Wait.new(timeout: seconds).until { yield }
361
330
  end
362
331
 
@@ -364,21 +333,18 @@ class Rudra
364
333
  # @param [String, Selenium::WebDriver::Element] locator the locator to
365
334
  # identify the element or Selenium::WebDriver::Element
366
335
  def wait_for_enabled(locator)
367
- log(locator)
368
336
  wait_for { find_element(locator).enabled? }
369
337
  end
370
338
 
371
339
  # Wait until the title of the page including the given string
372
340
  # @param [String] string the string to compare
373
341
  def wait_for_title(string)
374
- log(string)
375
342
  wait_for { title.downcase.include?(string.downcase) }
376
343
  end
377
344
 
378
345
  # Wait until the URL of the page including the given url
379
346
  # @param [String] url the URL to compare
380
347
  def wait_for_url(url)
381
- log(url)
382
348
  wait_for { current_url.include?(url) }
383
349
  end
384
350
 
@@ -386,28 +352,24 @@ class Rudra
386
352
  # @param [String, Selenium::WebDriver::Element] locator the locator to
387
353
  # identify the element or Selenium::WebDriver::Element
388
354
  def wait_for_visible(locator)
389
- log(locator)
390
355
  wait_for { find_element(locator).displayed? }
391
356
  end
392
357
 
393
358
  # Get the current window handle
394
359
  # @return [String] the id of the current window handle
395
360
  def window_handle
396
- log
397
361
  driver.window_handle
398
362
  end
399
363
 
400
364
  # Get the window handles of open browser windows
401
365
  # @return [Array<String>] the ids of window handles
402
366
  def window_handles
403
- log
404
367
  driver.window_handles
405
368
  end
406
369
 
407
370
  # Zoom the current page
408
371
  # @param [Float] scale the scale of zoom
409
372
  def zoom(scale)
410
- log(scale)
411
373
  execute_script(%(document.body.style.zoom = arguments[0];), scale)
412
374
  end
413
375
 
@@ -422,7 +384,6 @@ class Rudra
422
384
  # @param [String] attribute the name of the attribute
423
385
  # @return [String, nil] attribute value
424
386
  def attribute(locator, attribute)
425
- log(locator, attribute)
426
387
  find_element(locator).property(attribute)
427
388
  end
428
389
 
@@ -432,7 +393,6 @@ class Rudra
432
393
  # @param [String] attribute the name of the attribute
433
394
  # @return [Boolean] the result of the existence of the given attribute
434
395
  def attribute?(locator, attribute)
435
- log(locator, attribute)
436
396
  execute_script(%(
437
397
  return arguments[0].hasAttribute(arguments[1]);
438
398
  ), find_element(locator), attribute)
@@ -442,7 +402,6 @@ class Rudra
442
402
  # @param [String, Selenium::WebDriver::Element] locator the locator to
443
403
  # identify the element or Selenium::WebDriver::Element
444
404
  def blur(locator)
445
- log(locator)
446
405
  execute_script(
447
406
  'var element = arguments[0]; element.blur();',
448
407
  find_element(locator)
@@ -453,7 +412,6 @@ class Rudra
453
412
  # @param [String, Selenium::WebDriver::Element] locator the locator to
454
413
  # identify the element or Selenium::WebDriver::Element
455
414
  def clear(locator)
456
- log(locator)
457
415
  find_element(locator).clear
458
416
  end
459
417
 
@@ -461,7 +419,6 @@ class Rudra
461
419
  # @param [String, Selenium::WebDriver::Element] locator the locator to
462
420
  # identify the element or Selenium::WebDriver::Element
463
421
  def click(locator)
464
- log(locator)
465
422
  find_element(locator).click
466
423
  end
467
424
 
@@ -472,8 +429,6 @@ class Rudra
472
429
  # @option offset [Integer] :x (0) offset on x coordinate
473
430
  # @option offset [Integer] :y (0) offset on y coordinate
474
431
  def click_at(locator, offset = {})
475
- log(locator, offset)
476
-
477
432
  x = offset.fetch(:x, 0)
478
433
  y = offset.fetch(:y, 0)
479
434
 
@@ -490,7 +445,6 @@ class Rudra
490
445
  # identify the element or Selenium::WebDriver::Element
491
446
  # @param [String] property the longhand name of the property
492
447
  def css_value(locator, property)
493
- log(locator, property)
494
448
  find_element(locator).css_value(property)
495
449
  end
496
450
 
@@ -499,7 +453,6 @@ class Rudra
499
453
  # identify the element or Selenium::WebDriver::Element
500
454
  # @return [Boolean]
501
455
  def displayed?(locator)
502
- log(locator)
503
456
  find_element(locator).displayed?
504
457
  end
505
458
 
@@ -510,8 +463,6 @@ class Rudra
510
463
  # @option offset [Integer] :x (0) offset on x coordinate
511
464
  # @option offset [Integer] :y (0) offset on y coordinate
512
465
  def double_click(locator, offset = {})
513
- log(locator, offset)
514
-
515
466
  x = offset.fetch(:x, 0)
516
467
  y = offset.fetch(:y, 0)
517
468
 
@@ -528,7 +479,6 @@ class Rudra
528
479
  # @param [String] to_locator the locator to to move to and release
529
480
  # the mouse at
530
481
  def drag_and_drop(from_locator, to_locator)
531
- log(from_locator, to_locator)
532
482
  el1 = find_element(from_locator)
533
483
  el2 = find_element(to_locator)
534
484
 
@@ -541,7 +491,6 @@ class Rudra
541
491
  # @option offset [Integer] :x (0) offset on x coordinate
542
492
  # @option offset [Integer] :y (0) offset on y coordinate
543
493
  def drag_and_drop_by(source, offset = {})
544
- log(source, offset)
545
494
  element = find_element(source)
546
495
  x = offset.fetch(:x, 0)
547
496
  y = offset.fetch(:y, 0)
@@ -554,7 +503,6 @@ class Rudra
554
503
  # identify the element or Selenium::WebDriver::Element
555
504
  # @return [Boolean]
556
505
  def enabled?(locator)
557
- log(locator)
558
506
  find_element(locator).enabled?
559
507
  end
560
508
 
@@ -562,8 +510,6 @@ class Rudra
562
510
  # @param [String, Selenium::WebDriver::Element] locator the locator to
563
511
  # identify the element or Selenium::WebDriver::Element
564
512
  def focus(locator)
565
- log(locator)
566
-
567
513
  execute_script(
568
514
  'var element = arguments[0]; element.focus();',
569
515
  find_element(locator)
@@ -574,8 +520,6 @@ class Rudra
574
520
  # @param [String, Selenium::WebDriver::Element] locator the locator to
575
521
  # identify the element or Selenium::WebDriver::Element
576
522
  def hide(locator)
577
- log(locator)
578
-
579
523
  execute_script(%(
580
524
  arguments[0].style.display = 'none';
581
525
  ), find_element(locator))
@@ -585,8 +529,6 @@ class Rudra
585
529
  # @param [String, Selenium::WebDriver::Element] locator the locator to
586
530
  # identify the element or Selenium::WebDriver::Element
587
531
  def highlight(locator)
588
- log(locator)
589
-
590
532
  execute_script(%(
591
533
  arguments[0].style.backgroundColor = '#ff3';
592
534
  ), find_element(locator))
@@ -595,7 +537,6 @@ class Rudra
595
537
  # Set implicit_wait timeout
596
538
  # @param [Integer] seconds timeout for implicit_wait
597
539
  def implicit_wait(seconds)
598
- log(seconds)
599
540
  driver.manage.timeouts.implicit_wait = seconds
600
541
  end
601
542
 
@@ -603,7 +544,6 @@ class Rudra
603
544
  # @param [String, Selenium::WebDriver::Element] locator the locator to
604
545
  # identify the element or Selenium::WebDriver::Element
605
546
  def js_click(locator)
606
- log(locator)
607
547
  execute_script('arguments[0].click();', find_element(locator))
608
548
  end
609
549
 
@@ -612,7 +552,6 @@ class Rudra
612
552
  # identify the element or Selenium::WebDriver::Element
613
553
  # @return [Selenium::WebDriver::Point] the point of the given element
614
554
  def location(locator)
615
- log(locator)
616
555
  find_element(locator).location
617
556
  end
618
557
 
@@ -620,7 +559,6 @@ class Rudra
620
559
  # @param [Integer] right_by horizontal offset
621
560
  # @param [Integer] down_by vertical offset
622
561
  def move_by(right_by = 0, down_by = 0)
623
- log(right_by, down_by)
624
562
  action.move_by(right_by, down_by).perform
625
563
  end
626
564
 
@@ -631,8 +569,6 @@ class Rudra
631
569
  # @option offset [Integer] :x (0) offset on x coordinate
632
570
  # @option offset [Integer] :y (0) offset on y coordinate
633
571
  def move_to(locator, offset = {})
634
- log(locator, offset)
635
-
636
572
  x = offset.fetch(:x, 0)
637
573
  y = offset.fetch(:y, 0)
638
574
 
@@ -646,7 +582,6 @@ class Rudra
646
582
  # Set page_load timeout
647
583
  # @param [Integer] seconds timeout for page_load
648
584
  def page_load(seconds)
649
- log(seconds)
650
585
  driver.manage.timeouts.page_load = seconds
651
586
  end
652
587
 
@@ -656,7 +591,6 @@ class Rudra
656
591
  # identify the element or Selenium::WebDriver::Element
657
592
  # @return [Selenium::WebDriver::Rectangle] the retangle of the given element
658
593
  def rect(locator)
659
- log(locator)
660
594
  find_element(locator).rect
661
595
  end
662
596
 
@@ -666,7 +600,6 @@ class Rudra
666
600
  # identify the element or Selenium::WebDriver::Element
667
601
  # @param [String] attribute the name of the attribute
668
602
  def remove_attribute(locator, attribute)
669
- log(locator, attribute)
670
603
  execute_script(%(
671
604
  var element = arguments[0];
672
605
  var attributeName = arguments[1];
@@ -683,8 +616,6 @@ class Rudra
683
616
  # @option offset [Integer] :x (0) offset on x coordinate
684
617
  # @option offset [Integer] :y (0) offset on y coordinate
685
618
  def right_click(locator, offset = {})
686
- log(locator, offset)
687
-
688
619
  x = offset.fetch(:x, 0)
689
620
  y = offset.fetch(:y, 0)
690
621
 
@@ -695,7 +626,6 @@ class Rudra
695
626
  # Set script_timeout timeout
696
627
  # @param [Integer] seconds timeout for script_timeout
697
628
  def script_timeout(seconds)
698
- log(seconds)
699
629
  driver.manage.timeouts.script_timeout = seconds
700
630
  end
701
631
 
@@ -705,8 +635,6 @@ class Rudra
705
635
  # @param [Boolean] align_to true if aligned on top or
706
636
  # false if aligned at the bottom
707
637
  def scroll_into_view(locator, align_to = true)
708
- log(locator, align_to)
709
-
710
638
  execute_script(
711
639
  'arguments[0].scrollIntoView(arguments[1]);',
712
640
  find_element(locator),
@@ -718,7 +646,6 @@ class Rudra
718
646
  # @param [String, Selenium::WebDriver::Element] option_locator the locator to
719
647
  # identify the element or Selenium::WebDriver::Element
720
648
  def select(option_locator)
721
- log(option_locator)
722
649
  find_element(option_locator).click
723
650
  end
724
651
 
@@ -727,7 +654,6 @@ class Rudra
727
654
  # identify the element or Selenium::WebDriver::Element
728
655
  # @return [Boolean]
729
656
  def selected?(locator)
730
- log(locator)
731
657
  find_element(locator).selected?
732
658
  end
733
659
 
@@ -736,7 +662,6 @@ class Rudra
736
662
  # identify the element or Selenium::WebDriver::Element
737
663
  # @param [String, Symbol, Array] args keystrokes to send
738
664
  def send_keys(locator, *args)
739
- log(locator, *args)
740
665
  find_element(locator).send_keys(*args)
741
666
  end
742
667
 
@@ -746,7 +671,6 @@ class Rudra
746
671
  # @param [String] attribute the name of the attribute
747
672
  # @param [String] value the value of the attribute
748
673
  def set_attribute(locator, attribute, value)
749
- log(locator, attribute, value)
750
674
  execute_script(%(
751
675
  var element = arguments[0];
752
676
  var attribute = arguments[1];
@@ -759,7 +683,6 @@ class Rudra
759
683
  # @param [String, Selenium::WebDriver::Element] locator the locator to
760
684
  # identify the element or Selenium::WebDriver::Element
761
685
  def show(locator)
762
- log(locator)
763
686
  execute_script(%(
764
687
  arguments[0].style.display = '';
765
688
  ), find_element(locator))
@@ -770,7 +693,6 @@ class Rudra
770
693
  # identify the element or Selenium::WebDriver::Element
771
694
  # @return [Selenium::WebDriver::Dimension]
772
695
  def size(locator)
773
- log(locator)
774
696
  find_element(locator).size
775
697
  end
776
698
 
@@ -778,7 +700,6 @@ class Rudra
778
700
  # @param [String, Selenium::WebDriver::Element] locator the locator to
779
701
  # identify the element or Selenium::WebDriver::Element
780
702
  def submit(locator)
781
- log("- submit(#{locator})")
782
703
  find_element(locator).submit
783
704
  end
784
705
 
@@ -787,7 +708,6 @@ class Rudra
787
708
  # identify the element or Selenium::WebDriver::Element
788
709
  # @return [String] the tag name of the given element
789
710
  def tag_name(locator)
790
- log(locator)
791
711
  find_element(locator).tag_name
792
712
  end
793
713
 
@@ -796,7 +716,6 @@ class Rudra
796
716
  # identify the element or Selenium::WebDriver::Element
797
717
  # @return [String] the text content of the given element
798
718
  def text(locator)
799
- log(locator)
800
719
  find_element(locator).text
801
720
  end
802
721
 
@@ -805,7 +724,6 @@ class Rudra
805
724
  # identify the element or Selenium::WebDriver::Element
806
725
  # @param [String] event the event name
807
726
  def trigger(locator, event)
808
- log(locator, event)
809
727
  execute_script(%(
810
728
  var element = arguments[0];
811
729
  var eventName = arguments[1];
@@ -820,7 +738,6 @@ class Rudra
820
738
 
821
739
  # Clear all drawing
822
740
  def clear_drawings
823
- log
824
741
  execute_script(%(
825
742
  var elements = window.document.body.querySelectorAll('[id*="rudra_"]');
826
743
  for (var i = 0; i < elements.length; i++) {
@@ -838,8 +755,6 @@ class Rudra
838
755
  # or Selenium::WebDriver::Element where the arrow ends
839
756
  # @return [Selenium::WebDriver::Element] the arrow element
840
757
  def draw_arrow(from_locator, to_locator)
841
- log(from_locator, to_locator)
842
-
843
758
  id = random_id
844
759
 
845
760
  execute_script(%(
@@ -907,8 +822,6 @@ class Rudra
907
822
  # @param [String] color CSS style of backgroundColor
908
823
  # @return [Selenium::WebDriver::Element] the color fill element
909
824
  def draw_color_fill(locator, color = 'rgba(255,0,0,0.8)')
910
- log(locator, color)
911
-
912
825
  rectangle = rect(locator)
913
826
  id = random_id
914
827
 
@@ -946,8 +859,6 @@ class Rudra
946
859
  # @option options [Boolean] :draw_symbol (false) if to draw symbol
947
860
  # @return [Selenium::WebDriver::Element] the tooltip element
948
861
  def draw_flyover(locator, options = {})
949
- log(locator, options)
950
-
951
862
  attribute_name = options.fetch(:attribute, 'title')
952
863
  offset_x = options.fetch(:offset_x, 5)
953
864
  offset_y = options.fetch(:offset_y, 15)
@@ -1025,8 +936,6 @@ class Rudra
1025
936
  # @option padding [Integer] :left (5) left padding
1026
937
  # @return [Selenium::WebDriver::Element] the redmark element
1027
938
  def draw_redmark(locator, padding = {})
1028
- log(locator, padding)
1029
-
1030
939
  top = padding.fetch(:top, 5)
1031
940
  right = padding.fetch(:right, 5)
1032
941
  bottom = padding.fetch(:bottom, 5)
@@ -1063,8 +972,6 @@ class Rudra
1063
972
  # @option options [Integer] :offset_y (0) offset on y coordinate
1064
973
  # @return [Selenium::WebDriver::Element] the dropdown menu element
1065
974
  def draw_select(locator, options = {})
1066
- log(locator, options)
1067
-
1068
975
  offset_x = options.fetch(:offset_x, 0)
1069
976
  offset_y = options.fetch(:offset_y, 0)
1070
977
 
@@ -1125,8 +1032,6 @@ class Rudra
1125
1032
  # @option options [Integer] :right (20) CSS style of right
1126
1033
  # @return [Selenium::WebDriver::Element] the text element
1127
1034
  def draw_text(locator, text, options = {})
1128
- log(locator, text, options)
1129
-
1130
1035
  color = options.fetch(:color, '#f00')
1131
1036
  font_size = options.fetch(:font_size, 13)
1132
1037
  top = options.fetch(:top, 2)
@@ -1160,12 +1065,25 @@ class Rudra
1160
1065
  # Create directories, recursively, for the given dir
1161
1066
  # @param [String] dir the directories to create
1162
1067
  def mkdir(dir)
1163
- log(dir)
1164
1068
  FileUtils.mkdir_p(dir)
1165
1069
  end
1166
1070
 
1071
+ (instance_methods - superclass.instance_methods).map do |method_name|
1072
+ next if private_method_defined?(method_name) || ATTRIBUTES.include?(method_name)
1073
+
1074
+ original_method = instance_method(method_name)
1075
+
1076
+ define_method(method_name) do |*args, &block|
1077
+ log(method_name, *args)
1078
+ original_method.bind(self).call(*args, &block)
1079
+ end
1080
+ end
1081
+
1167
1082
  private
1168
1083
 
1084
+ attr_accessor :main_label
1085
+ attr_writer :window_size
1086
+
1169
1087
  def browser=(brw)
1170
1088
  unless BROWSERS.include?(brw)
1171
1089
  browsers = BROWSERS.map { |b| ":#{b}" }.join(', ')
@@ -1191,6 +1109,10 @@ class Rudra
1191
1109
  @headless = true?(mode)
1192
1110
  end
1193
1111
 
1112
+ def screen_dir=(path)
1113
+ @screen_dir = File.join(path, @locale.to_s)
1114
+ end
1115
+
1194
1116
  def log_prefix=(prefix)
1195
1117
  @log_prefix = prefix.chomp
1196
1118
  end
@@ -1213,8 +1135,12 @@ class Rudra
1213
1135
  def initialize_driver
1214
1136
  @driver = if browser == :chrome
1215
1137
  Selenium::WebDriver.for(:chrome, options: chrome_options)
1138
+ # elsif browser == :edge
1139
+ # Selenium::WebDriver.for(:edge, options: edge_options)
1216
1140
  elsif browser == :firefox
1217
1141
  Selenium::WebDriver.for(:firefox, options: firefox_options)
1142
+ elsif browser == :ie
1143
+ Selenium::WebDriver.for(:ie, options: ie_options)
1218
1144
  else
1219
1145
  Selenium::WebDriver.for(:safari)
1220
1146
  end
@@ -1223,11 +1149,22 @@ class Rudra
1223
1149
  def chrome_options
1224
1150
  options = Selenium::WebDriver::Chrome::Options.new
1225
1151
  options.add_argument('--disable-notifications')
1226
- options.add_argument('--headless') if headless
1152
+ if headless
1153
+ options.add_argument('--headless')
1154
+ options.add_argument("--window-size=#{window_size}")
1155
+ end
1156
+ options.add_option(
1157
+ 'excludeSwitches',
1158
+ %w[enable-automation enable-logging]
1159
+ )
1227
1160
  options.add_preference('intl.accept_languages', locale)
1228
1161
  options
1229
1162
  end
1230
1163
 
1164
+ # def edge_options
1165
+ # Selenium::WebDriver::Edge::Options.new
1166
+ # end
1167
+
1231
1168
  def firefox_options
1232
1169
  options = Selenium::WebDriver::Firefox::Options.new
1233
1170
  options.add_preference('intl.accept_languages', locale)
@@ -1235,6 +1172,16 @@ class Rudra
1235
1172
  options
1236
1173
  end
1237
1174
 
1175
+ def ie_options
1176
+ options = Selenium::WebDriver::IE::Options.new
1177
+ options.ensure_clean_session = true
1178
+ options.full_page_screenshot = true
1179
+ options.ignore_protected_mode_settings = true
1180
+ options.ignore_zoom_level = true
1181
+ options.native_events = false
1182
+ options
1183
+ end
1184
+
1238
1185
  def parse_locator(locator)
1239
1186
  unmatched, how, what = locator.split(/^([A-Za-z]+)=(.+)/)
1240
1187
 
@@ -1255,13 +1202,13 @@ class Rudra
1255
1202
  [how, what]
1256
1203
  end
1257
1204
 
1258
- def log(*args)
1259
- return unless @verbose && caller_locations(2, 1).first.label == @main_label
1205
+ def log(method_name, *args)
1206
+ return unless verbose && caller_locations(2, 1).first.label == main_label
1260
1207
 
1261
- function = caller_locations(1, 1).first.label
1262
1208
  arguments = args.map(&:to_s).join(', ')
1263
- puts @log_prefix + (
1264
- arguments.empty? ? function : "#{function}(#{arguments})"
1209
+
1210
+ puts log_prefix + (
1211
+ arguments.empty? ? method_name.to_s : "#{method_name}(#{arguments})"
1265
1212
  )
1266
1213
  end
1267
1214
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rudra
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.12
4
+ version: 1.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Chen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-27 00:00:00.000000000 Z
11
+ date: 2020-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yard
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.24
19
+ version: 0.9.25
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.24
26
+ version: 0.9.25
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: selenium-webdriver
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -48,24 +48,24 @@ dependencies:
48
48
  name: webdrivers
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: 4.2.0
54
51
  - - "~>"
55
52
  - !ruby/object:Gem::Version
56
- version: '4.2'
53
+ version: '4.4'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 4.4.1
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: 4.2.0
64
61
  - - "~>"
65
62
  - !ruby/object:Gem::Version
66
- version: '4.2'
63
+ version: '4.4'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 4.4.1
67
67
  description: Selenium IDE alternative using selenium-webdriver
68
- email: aaron@oobo.be
68
+ email: aaron@611b.com
69
69
  executables: []
70
70
  extensions: []
71
71
  extra_rdoc_files: []