onlyoffice_webdriver_wrapper 0.1.0 → 0.3.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 (21) hide show
  1. checksums.yaml +4 -4
  2. data/lib/onlyoffice_webdriver_wrapper/helpers/bin/chromedriver +0 -0
  3. data/lib/onlyoffice_webdriver_wrapper/helpers/bin/chromedriver_mac +0 -0
  4. data/lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper.rb +13 -29
  5. data/lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper.rb +14 -9
  6. data/lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper/save_to_disk_files.list +35 -0
  7. data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper.rb +2 -1
  8. data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/headless_screenshot_patch.rb +18 -0
  9. data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/real_display_tools.rb +1 -5
  10. data/lib/onlyoffice_webdriver_wrapper/name.rb +7 -0
  11. data/lib/onlyoffice_webdriver_wrapper/version.rb +1 -1
  12. data/lib/onlyoffice_webdriver_wrapper/webdriver.rb +32 -137
  13. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_attributes_helper.rb +0 -11
  14. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_helper.rb +14 -1
  15. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_js_methods.rb +39 -8
  16. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_screenshot_helper.rb +9 -3
  17. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_style_helper.rb +2 -11
  18. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_tab_helper.rb +0 -9
  19. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_type_helper.rb +36 -4
  20. data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_user_agent_helper.rb +12 -4
  21. metadata +35 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 328cc206dfe7a1b7bdca4e61b4b035fe2ec96c56323302be27ffea9c2dcde56d
4
- data.tar.gz: e8d09c9790c5911e6415eff49fc70d61eda46f60f8c5affa922850ee66107d68
3
+ metadata.gz: b7dd9754453bdfc98d527929ed558a8a8d7246b25e1ddd836b0af4a57ffc4d55
4
+ data.tar.gz: 49ca15eea9259e832423665aa0c7a86cc5d2afc17068c65fc6990c272a88091e
5
5
  SHA512:
6
- metadata.gz: 97c3e656c469845ef2f6d4e643ba4625043d608456d544d5afc62aeeb2679f007349a2e6fbfc9d8c217a4c797f00ddd2577ffd49177a892a20a2d68553321132
7
- data.tar.gz: cd6069601e477776ed59f791efc4e140fbfcd867cb427b786907764c469f2a3368a6b3afc2cf1c7fd79c263713618ee62297a6fe10d2a9fb2a2d56519c250817
6
+ metadata.gz: c7dbe1f1368fb5a3f0b027ede5abc619e97dca747709066fe3fd0d3d7c5c2d89d01a7e45a0eb034652fe238fbb89959fe86deb7dd307ad28b24627381842eba5
7
+ data.tar.gz: aa67c58fe56ac730be39894b7aa316dc6e134938c89d13f0c46000d18008244f3d90d631ad0d50ae88a25e77c2808870dc470d7d61b582581376f65335c49a3b
@@ -24,12 +24,12 @@ module OnlyofficeWebdriverWrapper
24
24
  def start_chrome_driver
25
25
  prefs = {
26
26
  download: {
27
- prompt_for_download: false,
28
- default_directory: download_directory
27
+ 'prompt_for_download' => false,
28
+ 'default_directory' => download_directory
29
29
  },
30
30
  profile: {
31
- default_content_setting_values: {
32
- 'automatic_downloads': 1
31
+ 'default_content_setting_values' => {
32
+ 'automatic_downloads' => 1
33
33
  }
34
34
  },
35
35
  credentials_enable_service: false
@@ -38,31 +38,15 @@ module OnlyofficeWebdriverWrapper
38
38
  caps[:logging_prefs] = { browser: 'ALL' }
39
39
  caps[:proxy] = Selenium::WebDriver::Proxy.new(ssl: "#{@proxy.proxy_address}:#{@proxy.proxy_port}") if @proxy
40
40
  caps['chromeOptions'] = { w3c: false }
41
- if ip_of_remote_server.nil?
42
- switches = add_useragent_to_switches(DEFAULT_CHROME_SWITCHES)
43
- options = Selenium::WebDriver::Chrome::Options.new(args: switches,
44
- prefs: prefs)
45
- webdriver_options = { options: options,
46
- desired_capabilities: caps,
47
- service: chrome_service }
48
- begin
49
- driver = Selenium::WebDriver.for :chrome, webdriver_options
50
- rescue Selenium::WebDriver::Error::WebDriverError,
51
- Net::ReadTimeout,
52
- Errno::ECONNREFUSED => e
53
- OnlyofficeLoggerHelper.log("Starting chrome failed with error: #{e.backtrace}")
54
- sleep 10
55
- driver = Selenium::WebDriver.for :chrome, webdriver_options
56
- end
57
- maximize_chrome(driver)
58
- driver
59
- else
60
- caps['chromeOptions'] = {
61
- profile: data['zip'],
62
- extensions: data['extensions']
63
- }
64
- Selenium::WebDriver.for(:remote, url: 'http://' + remote_server + ':4444/wd/hub', desired_capabilities: caps)
65
- end
41
+ switches = add_useragent_to_switches(DEFAULT_CHROME_SWITCHES)
42
+ options = Selenium::WebDriver::Chrome::Options.new(args: switches,
43
+ prefs: prefs)
44
+ webdriver_options = { options: options,
45
+ desired_capabilities: caps,
46
+ service: chrome_service }
47
+ driver = Selenium::WebDriver.for :chrome, webdriver_options
48
+ maximize_chrome(driver)
49
+ driver
66
50
  end
67
51
 
68
52
  private
@@ -12,21 +12,26 @@ module OnlyofficeWebdriverWrapper
12
12
  def start_firefox_driver
13
13
  profile = Selenium::WebDriver::Firefox::Profile.new
14
14
  profile['browser.download.folderList'] = 2
15
- profile['browser.helperApps.neverAsk.saveToDisk'] = 'application/doct, application/mspowerpoint, application/msword, application/octet-stream, application/oleobject, application/pdf, application/powerpoint, application/pptt, application/rtf, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/vnd.oasis.opendocument.spreadsheet, application/vnd.oasis.opendocument.text, application/vnd.openxmlformats-officedocument.presentationml.presentation, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/x-compressed, application/x-excel, application/xlst, application/x-msexcel, application/x-mspowerpoint, application/x-rtf, application/x-zip-compressed, application/zip, image/jpeg, image/pjpeg, image/pjpeg, image/x-jps, message/rfc822, multipart/x-zip, text/csv, text/html, text/html, text/plain, text/richtext'
15
+ profile['browser.helperApps.neverAsk.saveToDisk'] = read_firefox_files_to_save
16
16
  profile['browser.download.dir'] = @download_directory
17
17
  profile['browser.download.manager.showWhenStarting'] = false
18
18
  profile['dom.disable_window_move_resize'] = false
19
19
  options = Selenium::WebDriver::Firefox::Options.new(profile: profile)
20
20
  caps = Selenium::WebDriver::Remote::Capabilities.firefox
21
21
  caps[:proxy] = Selenium::WebDriver::Proxy.new(ssl: "#{@proxy.proxy_address}:#{@proxy.proxy_port}") if @proxy
22
- if ip_of_remote_server.nil?
23
- driver = Selenium::WebDriver.for :firefox, options: options, service: firefox_service, desired_capabilities: caps
24
- driver.manage.window.size = Selenium::WebDriver::Dimension.new(headless.resolution_x, headless.resolution_y) if headless.running?
25
- driver
26
- else
27
- capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(firefox_profile: profile, desired_capabilities: caps)
28
- Selenium::WebDriver.for :remote, desired_capabilities: capabilities, url: 'http://' + ip_of_remote_server + ':4444/wd/hub'
29
- end
22
+ driver = Selenium::WebDriver.for :firefox, options: options, service: firefox_service, desired_capabilities: caps
23
+ driver.manage.window.size = Selenium::WebDriver::Dimension.new(headless.resolution_x, headless.resolution_y) if headless.running?
24
+ driver
25
+ end
26
+
27
+ private
28
+
29
+ # @return [Array<String>] list of formats to save
30
+ def read_firefox_files_to_save
31
+ path_to_file = "#{Dir.pwd}/lib/onlyoffice_webdriver_wrapper/"\
32
+ 'helpers/firefox_helper/save_to_disk_files.list'
33
+ OnlyofficeFileHelper::FileHelper.read_array_from_file(path_to_file)
34
+ .join(', ')
30
35
  end
31
36
  end
32
37
  end
@@ -0,0 +1,35 @@
1
+ application/doct
2
+ application/mspowerpoint
3
+ application/msword
4
+ application/octet-stream
5
+ application/oleobject
6
+ application/pdf
7
+ application/powerpoint
8
+ application/pptt
9
+ application/rtf
10
+ application/vnd.ms-excel
11
+ application/vnd.ms-powerpoint
12
+ application/vnd.oasis.opendocument.spreadsheet
13
+ application/vnd.oasis.opendocument.text
14
+ application/vnd.openxmlformats-officedocument.presentationml.presentation
15
+ application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
16
+ application/vnd.openxmlformats-officedocument.wordprocessingml.document
17
+ application/x-compressed
18
+ application/x-excel
19
+ application/xlst
20
+ application/x-msexcel
21
+ application/x-mspowerpoint
22
+ application/x-rtf
23
+ application/x-zip-compressed
24
+ application/zip
25
+ image/jpeg
26
+ image/pjpeg
27
+ image/pjpeg
28
+ image/x-jps
29
+ message/rfc822
30
+ multipart/x-zip
31
+ text/csv
32
+ text/html
33
+ text/html
34
+ text/plain
35
+ text/richtext
@@ -3,6 +3,7 @@
3
3
  require_relative 'headless_helper/real_display_tools'
4
4
  require_relative 'headless_helper/ruby_helper'
5
5
  require 'headless'
6
+ require_relative 'headless_helper/headless_screenshot_patch'
6
7
 
7
8
  module OnlyofficeWebdriverWrapper
8
9
  # Class for using headless gem
@@ -42,7 +43,7 @@ module OnlyofficeWebdriverWrapper
42
43
  dimensions: "#{@resolution_x + 1}x#{@resolution_y + 1}x24")
43
44
  rescue Exception => e
44
45
  OnlyofficeLoggerHelper.log("xvfb not started with problem #{e}")
45
- RspecHelper.clean_up(true)
46
+ WebDriver.clean_up(true)
46
47
  @headless_instance = Headless.new(reuse: false,
47
48
  destroy_at_exit: true,
48
49
  dimensions: "#{@resolution_x + 1}x#{@resolution_y + 1}x24")
@@ -0,0 +1,18 @@
1
+ class Headless
2
+ def take_screenshot(file_path, options={})
3
+ using = options.fetch(:using, :imagemagick)
4
+ case using
5
+ when :imagemagick
6
+ CliUtil.ensure_application_exists!('import', "imagemagick is not found on your system. Please install it using sudo apt-get install imagemagick")
7
+ system "#{CliUtil.path_to('import')} -display :#{display} -window root #{file_path}"
8
+ when :xwd
9
+ CliUtil.ensure_application_exists!('xwd', "xwd is not found on your system. Please install it using sudo apt-get install X11-apps")
10
+ system "#{CliUtil.path_to('xwd')} -display localhost:#{display} -silent -root -out #{file_path}"
11
+ when :graphicsmagick, :gm
12
+ CliUtil.ensure_application_exists!('gm', "graphicsmagick is not found on your system. Please install it.")
13
+ system "#{CliUtil.path_to('gm')} import -display localhost:#{display} -window root #{file_path}"
14
+ else
15
+ raise Headless::Exception.new('Unknown :using option value')
16
+ end
17
+ end
18
+ end
@@ -4,11 +4,7 @@ module OnlyofficeWebdriverWrapper
4
4
  # module for getting info about real display
5
5
  module RealDisplayTools
6
6
  def xrandr_result
7
- begin
8
- result = `xrandr 2>&1`
9
- rescue Exception
10
- result = 'xrandr throw an exception'
11
- end
7
+ result = `xrandr 2>&1`
12
8
  OnlyofficeLoggerHelper.log("xrandr answer: #{result}".delete("\n"))
13
9
  result
14
10
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeWebdriverWrapper
4
+ module Name
5
+ STRING = 'onlyoffice_webdriver_wrapper'
6
+ end
7
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module OnlyofficeWebdriverWrapper
4
4
  module Version
5
- STRING = '0.1.0'
5
+ STRING = '0.3.1'
6
6
  end
7
7
  end
@@ -46,17 +46,14 @@ module OnlyofficeWebdriverWrapper
46
46
  attr_reader :browser_running
47
47
  # @return [Symbol] device of which we try to simulate, default - :desktop_linux
48
48
  attr_accessor :device
49
- attr_accessor :ip_of_remote_server
50
49
  attr_accessor :download_directory
51
50
  attr_accessor :server_address
52
51
  attr_accessor :headless
53
52
  # @return [Net::HTTP::Proxy] connection proxy
54
53
  attr_accessor :proxy
55
54
 
56
- singleton_class.class_eval { attr_accessor :web_console_error }
57
-
58
55
  def initialize(browser = :firefox,
59
- remote_server = nil,
56
+ _remote_server = nil,
60
57
  device: :desktop_linux,
61
58
  proxy: nil)
62
59
  raise WebdriverSystemNotSupported, 'Your OS is not 64 bit. It is not supported' unless os_64_bit?
@@ -67,7 +64,6 @@ module OnlyofficeWebdriverWrapper
67
64
 
68
65
  @download_directory = Dir.mktmpdir('webdriver-download')
69
66
  @browser = browser
70
- @ip_of_remote_server = remote_server
71
67
  @proxy = proxy
72
68
  case browser
73
69
  when :firefox
@@ -80,10 +76,6 @@ module OnlyofficeWebdriverWrapper
80
76
  @browser_running = true
81
77
  end
82
78
 
83
- def add_web_console_error(log)
84
- WebDriver.web_console_error = log
85
- end
86
-
87
79
  def open(url)
88
80
  url = 'http://' + url unless url.include?('http') || url.include?('file://')
89
81
  loop do
@@ -112,7 +104,7 @@ module OnlyofficeWebdriverWrapper
112
104
  end
113
105
  alert_confirm
114
106
  @headless.stop
115
- FileUtils.remove_dir(@download_directory) if Dir.exist?(@download_directory)
107
+ cleanup_download_folder
116
108
  @browser_running = false
117
109
  end
118
110
 
@@ -124,11 +116,9 @@ module OnlyofficeWebdriverWrapper
124
116
  nil
125
117
  end
126
118
 
127
- def set_text_to_iframe(element, text)
128
- element.click
129
- @driver.action.send_keys(text).perform
130
- end
131
-
119
+ # Get text from all elements with specified xpath
120
+ # @param array_elements [String] xpath of elements
121
+ # @return [Array<String>] values of elements
132
122
  def get_text_array(array_elements)
133
123
  get_elements(array_elements).map { |current_element| get_text(current_element) }
134
124
  end
@@ -140,24 +130,13 @@ module OnlyofficeWebdriverWrapper
140
130
  def click_and_wait(element_to_click, element_to_wait)
141
131
  element_to_click.click
142
132
  count = 0
143
- while !element_to_wait.visible? && count < 30
133
+ while !element_to_wait.present? && count < 30
144
134
  sleep 1
145
135
  count += 1
146
136
  end
147
137
  webdriver_error("click_and_wait: Wait for element: #{element_to_click} for 30 seconds") if count == 30
148
138
  end
149
139
 
150
- def select_from_list(xpath_value, value)
151
- @driver.find_element(:xpath, xpath_value).find_elements(tag_name: 'li').each do |element|
152
- next unless element.text == value.to_s
153
-
154
- element.click
155
- return true
156
- end
157
-
158
- webdriver_error("select_from_list: Option #{value} in list #{xpath_value} not found")
159
- end
160
-
161
140
  def select_from_list_elements(value, elements_value)
162
141
  index = get_element_index(value, elements_value)
163
142
  elements_value[index].click
@@ -206,11 +185,11 @@ module OnlyofficeWebdriverWrapper
206
185
  end
207
186
 
208
187
  def remove_class_by_jquery(selector, class_name)
209
- execute_javascript("#{jquery_selector_by_xpath(selector)}.removeClass('#{class_name}');")
188
+ execute_javascript("$(#{dom_element_by_xpath(selector)}).removeClass('#{class_name}');")
210
189
  end
211
190
 
212
191
  def add_class_by_jquery(selector, class_name)
213
- execute_javascript("#{jquery_selector_by_xpath(selector)}.addClass('#{class_name}');")
192
+ execute_javascript("$(#{dom_element_by_xpath(selector)}).addClass('#{class_name}');")
214
193
  end
215
194
 
216
195
  # Perform drag'n'drop action in one element (for example on big canvas area)
@@ -307,15 +286,6 @@ module OnlyofficeWebdriverWrapper
307
286
  @driver.action.context_click(@driver.find_element(:xpath, xpath_name)).perform
308
287
  end
309
288
 
310
- def context_click(xpath, x_coord, y_coord)
311
- element = get_element(xpath)
312
- if browser == :firefox
313
- element.send_keys %i[shift f10]
314
- else
315
- @driver.action.move_to(element, x_coord.to_i, y_coord.to_i).context_click.perform
316
- end
317
- end
318
-
319
289
  def click_on_displayed(xpath_name)
320
290
  element = get_element_by_display(xpath_name)
321
291
  begin
@@ -325,10 +295,6 @@ module OnlyofficeWebdriverWrapper
325
295
  end
326
296
  end
327
297
 
328
- def click_on_locator_by_action(xpath)
329
- @driver.action.move_to(get_element(xpath)).click.perform
330
- end
331
-
332
298
  def click_on_locator_coordinates(xpath_name, right_by, down_by)
333
299
  wait_until_element_visible(xpath_name)
334
300
  element = @driver.find_element(:xpath, xpath_name)
@@ -383,36 +349,6 @@ module OnlyofficeWebdriverWrapper
383
349
  false
384
350
  end
385
351
 
386
- def click_on_one_of_several_with_display_by_text(xpath_several_elements, text_to_click)
387
- @driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
388
- if current_element.displayed? && text_to_click == current_element.text
389
- current_element.click
390
- return true
391
- end
392
- end
393
- false
394
- end
395
-
396
- def right_click_on_one_of_several_by_text(xpath_several_elements, text_to_click)
397
- @driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
398
- if text_to_click == current_element.text
399
- @driver.action.context_click(current_element).perform
400
- return true
401
- end
402
- end
403
- false
404
- end
405
-
406
- def click_on_one_of_several_with_display_by_number(xpath_several_elements, number)
407
- @driver.find_elements(:xpath, "#{xpath_several_elements}[#{number}]").each do |current_element|
408
- if current_element.displayed?
409
- current_element.click
410
- return true
411
- end
412
- end
413
- false
414
- end
415
-
416
352
  def click_on_one_of_several_by_parameter(xpath_several_elements, parameter_name, parameter_value)
417
353
  @driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
418
354
  if current_element.attribute(parameter_name).include? parameter_value
@@ -423,16 +359,6 @@ module OnlyofficeWebdriverWrapper
423
359
  false
424
360
  end
425
361
 
426
- def click_on_one_of_several_by_parameter_and_text(xpath_several_elements, parameter_name, parameter_value, text_to_click)
427
- @driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
428
- if current_element.attribute(parameter_name).include?(parameter_value) && text_to_click == current_element.text
429
- current_element.click
430
- return true
431
- end
432
- end
433
- false
434
- end
435
-
436
362
  def click_on_one_of_several_xpath_by_number(xpath, number_of_element)
437
363
  click_on_locator("(#{xpath})[#{number_of_element}]")
438
364
  end
@@ -448,16 +374,6 @@ module OnlyofficeWebdriverWrapper
448
374
  OnlyofficeLoggerHelper.log("Moved mouse to element: #{xpath_name}")
449
375
  end
450
376
 
451
- def move_to_one_of_several_displayed_element(xpath_several_elements)
452
- get_elements(xpath_several_elements).each do |current_element|
453
- if current_element.displayed?
454
- move_to_element(current_element)
455
- return true
456
- end
457
- end
458
- false
459
- end
460
-
461
377
  def mouse_over(xpath_name, x_coordinate = 0, y_coordinate = 0)
462
378
  wait_until_element_present(xpath_name)
463
379
  @driver.action.move_to(@driver.find_element(:xpath, xpath_name), x_coordinate.to_i, y_coordinate.to_i).perform
@@ -465,7 +381,7 @@ module OnlyofficeWebdriverWrapper
465
381
 
466
382
  def element_present?(xpath_name)
467
383
  if xpath_name.is_a?(PageObject::Elements::Element)
468
- xpath_name.visible?
384
+ xpath_name.present?
469
385
  elsif xpath_name.is_a?(Selenium::WebDriver::Element)
470
386
  xpath_name.displayed?
471
387
  else
@@ -494,32 +410,6 @@ module OnlyofficeWebdriverWrapper
494
410
  end
495
411
  end
496
412
 
497
- def get_elements_from_array_before_some(xpath_several_elements, xpath_for_some)
498
- elements = get_elements(xpath_several_elements)
499
- result = []
500
- some_element = get_element(xpath_for_some)
501
- return result if some_element.nil?
502
-
503
- elements.each do |current|
504
- break if current == some_element
505
-
506
- result << current
507
- end
508
- result
509
- end
510
-
511
- def get_elements_from_array_after_some(xpath_several_elements, xpath_for_some)
512
- elements = get_elements(xpath_several_elements)
513
- some_element = get_element(xpath_for_some)
514
- return elements if some_element.nil?
515
-
516
- elements.each do |current|
517
- elements.delete(current)
518
- break if current == some_element
519
- end
520
- elements
521
- end
522
-
523
413
  def get_element_by_display(xpath_name)
524
414
  @driver.find_elements(:xpath, xpath_name).each do |element|
525
415
  return element if element.displayed?
@@ -528,10 +418,14 @@ module OnlyofficeWebdriverWrapper
528
418
  webdriver_error("get_element_by_display(#{xpath_name}): invalid selector: Unable to locate an element with the xpath expression")
529
419
  end
530
420
 
421
+ # Return count of elements (visible and not visible)
422
+ # @param xpath_name [String] xpath to find
423
+ # @param only_visible [True, False] count only visible elements?
424
+ # @return [Integer] element count
531
425
  def get_element_count(xpath_name, only_visible = true)
532
426
  if element_present?(xpath_name)
533
427
  elements = @driver.find_elements(:xpath, xpath_name)
534
- only_visible ? elements.delete_if { |element| @browser == :firefox && !element.displayed? }.length : elements.length
428
+ only_visible ? elements.delete_if { |element| !element.displayed? }.length : elements.length
535
429
  else
536
430
  0
537
431
  end
@@ -579,6 +473,9 @@ module OnlyofficeWebdriverWrapper
579
473
  webdriver_error("Element #{xpath_name} not visible for #{timeout} seconds")
580
474
  end
581
475
 
476
+ # Check if any element of xpath is displayed
477
+ # @param xpath_several_elements [String] xpath to check
478
+ # @return [True, False] result of visibility
582
479
  def one_of_several_elements_displayed?(xpath_several_elements)
583
480
  @driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
584
481
  return true if current_element.displayed?
@@ -598,10 +495,6 @@ module OnlyofficeWebdriverWrapper
598
495
  end
599
496
  end
600
497
 
601
- def remove_element(xpath)
602
- execute_javascript("element = document.evaluate(\"#{xpath}\", document, null, XPathResult.ANY_TYPE, null).iterateNext();if (element !== null) {element.parentNode.removeChild(element);};")
603
- end
604
-
605
498
  # Select frame as current
606
499
  # @param [String] xpath_name name of current xpath
607
500
  def select_frame(xpath_name = '//iframe', count_of_frames = 1)
@@ -655,12 +548,6 @@ module OnlyofficeWebdriverWrapper
655
548
  "singleNodeValue.removeAttribute('#{attribute}');")
656
549
  end
657
550
 
658
- def select_text_from_page(xpath_name)
659
- wait_until_element_visible(xpath_name)
660
- elem = get_element xpath_name
661
- @driver.action.key_down(:control).click(elem).send_keys('a').key_up(:control).perform
662
- end
663
-
664
551
  def select_combo_box(xpath_name, select_value, select_by = :value)
665
552
  wait_until_element_visible(xpath_name)
666
553
  option = Selenium::WebDriver::Support::Select.new(get_element(xpath_name))
@@ -671,13 +558,8 @@ module OnlyofficeWebdriverWrapper
671
558
  end
672
559
  end
673
560
 
674
- def get_element_number_by_text(xpath_list, element_text)
675
- @driver.find_elements(:xpath, xpath_list).each_with_index do |current_element, index|
676
- return index if element_text == current_element.attribute('innerHTML')
677
- end
678
- nil
679
- end
680
-
561
+ # Get page source
562
+ # @return [String] all page source
681
563
  def get_page_source
682
564
  @driver.execute_script('return document.documentElement.innerHTML;')
683
565
  end
@@ -725,5 +607,18 @@ module OnlyofficeWebdriverWrapper
725
607
  source = get_page_source
726
608
  source.include?('Error 503')
727
609
  end
610
+
611
+ # Perform cleanup if something went wrong during tests
612
+ # @param forced [True, False] should cleanup run in all cases
613
+ def self.clean_up(forced = false)
614
+ return unless OnlyofficeFileHelper::LinuxHelper.user_name.include?('nct-at') ||
615
+ OnlyofficeFileHelper::LinuxHelper.user_name.include?('ubuntu') ||
616
+ forced == true
617
+
618
+ OnlyofficeFileHelper::LinuxHelper.kill_all('chromedriver')
619
+ OnlyofficeFileHelper::LinuxHelper.kill_all('geckodriver')
620
+ OnlyofficeFileHelper::LinuxHelper.kill_all('Xvfb')
621
+ OnlyofficeFileHelper::LinuxHelper.kill_all_browsers
622
+ end
728
623
  end
729
624
  end
@@ -26,17 +26,6 @@ module OnlyofficeWebdriverWrapper
26
26
  end
27
27
  end
28
28
 
29
- def get_element_by_parameter(elements, parameter_name, value)
30
- elements.find { |current_element| value == get_attribute(current_element, parameter_name) }
31
- end
32
-
33
- def get_attribute_from_displayed_element(xpath_name, attribute)
34
- @driver.find_elements(:xpath, xpath_name).each do |current_element|
35
- return current_element.attribute(attribute) if current_element.displayed?
36
- end
37
- false
38
- end
39
-
40
29
  def get_attributes_of_several_elements(xpath_several_elements, attribute)
41
30
  elements = @driver.find_elements(:xpath, xpath_several_elements)
42
31
 
@@ -16,9 +16,22 @@ module OnlyofficeWebdriverWrapper
16
16
  def download(file_url)
17
17
  data = Kernel.open(file_url, &:read)
18
18
  file = Tempfile.new('onlyoffice-downloaded-file')
19
- file.write(data)
19
+ file.write(data.force_encoding('UTF-8'))
20
20
  file.close
21
21
  file.path
22
22
  end
23
+
24
+ # Perform safe cleanup of download folder
25
+ # @return [Nothing]
26
+ def cleanup_download_folder
27
+ return unless Dir.exist?(@download_directory)
28
+
29
+ if @download_directory.start_with?(Dir.tmpdir)
30
+ FileUtils.remove_dir(@download_directory)
31
+ else
32
+ OnlyofficeLoggerHelper.log("Download directory #{@download_directory} is not at tmp dir. "\
33
+ 'It will be not deleted')
34
+ end
35
+ end
23
36
  end
24
37
  end
@@ -3,17 +3,24 @@
3
3
  module OnlyofficeWebdriverWrapper
4
4
  # Methods for webdriver for calling Javascript
5
5
  module WebdriverJsMethods
6
- def execute_javascript(script)
6
+ # Execute javascript
7
+ # @param script [String] code to execute
8
+ # @param wait_timeout [Integer] wait after JS is executed.
9
+ # Some code require some time to execute
10
+ def execute_javascript(script, wait_timeout: 0)
7
11
  result = @driver.execute_script(script)
8
12
  OnlyofficeLoggerHelper.log("Executed js: `#{script}` with result: `#{result}`")
13
+ sleep(wait_timeout)
9
14
  result
10
15
  rescue Exception => e
11
16
  webdriver_error("Exception #{e} in execute_javascript: #{script}")
12
17
  end
13
18
 
14
- # @return [String] string to select by xpath
15
- def jquery_selector_by_xpath(xpath)
16
- "$(document.evaluate('#{xpath}', document, null, XPathResult.ANY_TYPE, null).iterateNext())"
19
+ # @param [String] xpath element to select
20
+ # @return [String] string to select dom by xpath
21
+ def dom_element_by_xpath(xpath)
22
+ escaped_xpath = xpath.tr('"', "'")
23
+ "document.evaluate(\"#{escaped_xpath}\", document, null, XPathResult.ANY_TYPE, null).iterateNext()"
17
24
  end
18
25
 
19
26
  def type_to_locator_by_javascript(xpath_name, text)
@@ -29,8 +36,8 @@ module OnlyofficeWebdriverWrapper
29
36
  # @param xpath [Sting] xpath of object
30
37
  # @return [Dimensions] size of element
31
38
  def element_size_by_js(xpath)
32
- width = execute_javascript("return document.evaluate(\"#{xpath.tr('"', "'")}\",document, null, XPathResult.ANY_TYPE, null ).iterateNext().offsetWidth")
33
- height = execute_javascript("return document.evaluate(\"#{xpath.tr('"', "'")}\",document, null, XPathResult.ANY_TYPE, null ).iterateNext().offsetHeight")
39
+ width = execute_javascript("return #{dom_element_by_xpath(xpath)}.offsetWidth")
40
+ height = execute_javascript("return #{dom_element_by_xpath(xpath)}.offsetHeight")
34
41
  Dimensions.new(width, height)
35
42
  end
36
43
 
@@ -38,8 +45,9 @@ module OnlyofficeWebdriverWrapper
38
45
  # @param xpath [Sting] xpath of object
39
46
  # @return [CursorPoint] position of element
40
47
  def object_absolute_position(xpath)
41
- left = execute_javascript("return document.evaluate(\"#{xpath.tr('"', "'")}\",document, null, XPathResult.ANY_TYPE, null ).iterateNext().getBoundingClientRect().left")
42
- top = execute_javascript("return document.evaluate(\"#{xpath.tr('"', "'")}\",document, null, XPathResult.ANY_TYPE, null ).iterateNext().getBoundingClientRect().top")
48
+ bounding = "#{dom_element_by_xpath(xpath)}.getBoundingClientRect()"
49
+ left = execute_javascript("return #{bounding}.left")
50
+ top = execute_javascript("return #{bounding}.top")
43
51
  Dimensions.new(left, top)
44
52
  end
45
53
 
@@ -60,5 +68,28 @@ module OnlyofficeWebdriverWrapper
60
68
  def document_ready?
61
69
  execute_javascript('return document.readyState;') == 'complete'
62
70
  end
71
+
72
+ # Get ComputedStyle property value
73
+ # @param xpath [String] xpath of element
74
+ # @param pseudo_element [String] pseudo element to compute
75
+ # @param property [String] property to get
76
+ # @return [String] value of property
77
+ def computed_style(xpath, pseudo_element = 'null', property = nil)
78
+ element_by_xpath = "document.evaluate(\"#{xpath.tr('"', "'")}\",document, null, XPathResult.ANY_TYPE, null ).iterateNext()"
79
+ style = "window.getComputedStyle(#{element_by_xpath}, '#{pseudo_element}')"
80
+ full_command = "#{style}.getPropertyValue('#{property}')"
81
+ result = execute_javascript("return #{full_command}")
82
+ result.delete('"')
83
+ end
84
+
85
+ # Remove element by its xpath
86
+ # @param [String] xpath of element to remove
87
+ # @return [String] result of javascript execution
88
+ def remove_element(xpath)
89
+ script = "element = #{dom_element_by_xpath(xpath)};"\
90
+ 'if (element !== null) '\
91
+ '{element.parentNode.removeChild(element);};'
92
+ execute_javascript(script)
93
+ end
63
94
  end
64
95
  end
@@ -4,6 +4,12 @@ require 'onlyoffice_s3_wrapper'
4
4
  module OnlyofficeWebdriverWrapper
5
5
  # Working with screenshots
6
6
  module WebdriverScreenshotHelper
7
+ # @return [OnlyofficeS3Wrapper::AmazonS3Wrapper] s3 wrapper
8
+ def amazon_s3_wrapper
9
+ @amazon_s3_wrapper ||= OnlyofficeS3Wrapper::AmazonS3Wrapper.new(bucket_name: 'webdriver-wrapper-screenshots',
10
+ region: 'us-east-1')
11
+ end
12
+
7
13
  # @return [String] location of screenshot to take
8
14
  def screenshot_folder
9
15
  '/tmp/screenshot/WebdriverError'
@@ -12,7 +18,7 @@ module OnlyofficeWebdriverWrapper
12
18
  def get_screenshot_and_upload(path_to_screenshot = "#{screenshot_folder}/#{StringHelper.generate_random_string}.png")
13
19
  begin
14
20
  get_screenshot(path_to_screenshot)
15
- cloud_screenshot = OnlyofficeS3Wrapper::AmazonS3Wrapper.new.upload_file_and_make_public(path_to_screenshot, 'screenshots')
21
+ cloud_screenshot = amazon_s3_wrapper.upload_file_and_make_public(path_to_screenshot)
16
22
  File.delete(path_to_screenshot) if File.exist?(path_to_screenshot)
17
23
  OnlyofficeLoggerHelper.log("upload screenshot: #{cloud_screenshot}")
18
24
  return cloud_screenshot
@@ -43,14 +49,14 @@ module OnlyofficeWebdriverWrapper
43
49
  if @headless.headless_instance.nil?
44
50
  system_screenshot("/tmp/#{screenshot_name}.png")
45
51
  begin
46
- link = OnlyofficeS3Wrapper::AmazonS3Wrapper.new.upload_file_and_make_public("/tmp/#{screenshot_name}.png", 'screenshots')
52
+ link = amazon_s3_wrapper.upload_file_and_make_public("/tmp/#{screenshot_name}.png")
47
53
  rescue Exception => e
48
54
  OnlyofficeLoggerHelper.log("Error in get screenshot: #{e}. System screenshot #{link}")
49
55
  end
50
56
  else
51
57
  @headless.take_screenshot("/tmp/#{screenshot_name}.png")
52
58
  begin
53
- link = OnlyofficeS3Wrapper::AmazonS3Wrapper.new.upload_file_and_make_public("/tmp/#{screenshot_name}.png", 'screenshots')
59
+ link = amazon_s3_wrapper.upload_file_and_make_public("/tmp/#{screenshot_name}.png")
54
60
  rescue Exception => e
55
61
  OnlyofficeLoggerHelper.log("Error in get screenshot: #{e}. Headless screenshot #{link}")
56
62
  end
@@ -7,16 +7,7 @@ module OnlyofficeWebdriverWrapper
7
7
  get_attribute(xpath, 'style').split(';').each do |current_param|
8
8
  return /:\s(.*);?$/.match(current_param)[1] if current_param.include?(parameter_name)
9
9
  end
10
- end
11
-
12
- def get_style_attributes_of_several_elements(xpath_several_elements, style)
13
- @driver.find_elements(:xpath, xpath_several_elements).map do |element|
14
- el_style = element.attribute('style')
15
- unless el_style.empty?
16
- found_style = el_style.split(';').find { |curr_param| curr_param.include?(style) }
17
- found_style&.gsub(/\s?#{style}:/, '')
18
- end
19
- end.compact
10
+ nil
20
11
  end
21
12
 
22
13
  def set_style_parameter(xpath, attribute, attribute_value)
@@ -30,7 +21,7 @@ module OnlyofficeWebdriverWrapper
30
21
  end
31
22
 
32
23
  def set_style_show_by_xpath(xpath, move_to_center = false)
33
- xpath.tr!("'", '"')
24
+ xpath = xpath.tr("'", '"')
34
25
  execute_javascript('document.evaluate( \'' + xpath.to_s +
35
26
  '\' ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue.style.display = "block";')
36
27
  return unless move_to_center
@@ -9,11 +9,6 @@ module OnlyofficeWebdriverWrapper
9
9
  execute_javascript('window.open()')
10
10
  end
11
11
 
12
- def maximize
13
- @driver.manage.window.maximize
14
- OnlyofficeLoggerHelper.log('Maximized current window')
15
- end
16
-
17
12
  def resize_tab(width, height)
18
13
  @driver.manage.window.resize_to(width, height)
19
14
  OnlyofficeLoggerHelper.log("Resize current window to #{width}x#{height}")
@@ -62,10 +57,6 @@ module OnlyofficeWebdriverWrapper
62
57
  switch_to_main_tab
63
58
  end
64
59
 
65
- def close_window
66
- @driver.close
67
- end
68
-
69
60
  def close_popup_and_switch_to_main_tab
70
61
  switch_to_popup
71
62
  close_tab
@@ -20,7 +20,10 @@ module OnlyofficeWebdriverWrapper
20
20
  begin
21
21
  element.clear
22
22
  rescue Exception => e
23
- webdriver_error("Error in element.clear #{e} for type_to_locator(#{xpath_name}, #{text_to_send}, #{clear_content}, #{click_on_it}, #{by_action}, #{by_element_send_key})")
23
+ webdriver_error(e.class, "Error in element.clear #{e} for "\
24
+ "type_to_locator(#{xpath_name}, #{text_to_send}, "\
25
+ "#{clear_content}, #{click_on_it}, "\
26
+ "#{by_action}, #{by_element_send_key})")
24
27
  end
25
28
  end
26
29
 
@@ -37,21 +40,25 @@ module OnlyofficeWebdriverWrapper
37
40
  @driver.action.send_keys(symbol).perform
38
41
  end
39
42
  else
40
- @driver.action.send_keys(text_to_send).perform
43
+ webdriver_bug_8179_workaround(text_to_send)
41
44
  end
42
45
  end
43
46
  end
44
47
 
45
48
  def type_to_input(xpath_name, text_to_send, clear_content = false, click_on_it = true)
46
49
  element = get_element(xpath_name)
47
- webdriver_error(Selenium::WebDriver::Error::NoSuchElementError, "type_to_input(#{xpath_name}, #{text_to_send}, #{clear_content}, #{click_on_it}): element not found") if element.nil?
50
+ if element.nil?
51
+ webdriver_error(Selenium::WebDriver::Error::NoSuchElementError,
52
+ "type_to_input(#{xpath_name}, #{text_to_send}, "\
53
+ "#{clear_content}, #{click_on_it}): element not found")
54
+ end
48
55
  element.clear if clear_content
49
56
  sleep 0.2
50
57
  if click_on_it
51
58
  begin
52
59
  element.click
53
60
  rescue Exception => e
54
- webdriver_error("type_to_input(#{xpath_name}, #{text_to_send}, #{clear_content}, #{click_on_it}) error in 'element.click' error: #{e}")
61
+ webdriver_error(e.class, "type_to_input(#{xpath_name}, #{text_to_send}, #{clear_content}, #{click_on_it}) error in 'element.click' error: #{e}")
55
62
  end
56
63
  sleep 0.2
57
64
  end
@@ -80,10 +87,35 @@ module OnlyofficeWebdriverWrapper
80
87
 
81
88
  def key_down(xpath, key)
82
89
  @driver.action.key_down(get_element(xpath), key).perform
90
+ sleep(1) # for some reason quick key_down select text in control
83
91
  end
84
92
 
85
93
  def key_up(xpath, key)
86
94
  @driver.action.key_up(get_element(xpath), key).perform
87
95
  end
96
+
97
+ private
98
+
99
+ # Workaround for bug with typing with :control
100
+ # See https://github.com/SeleniumHQ/selenium/issues/8179
101
+ # for more details
102
+ def webdriver_bug_8179_workaround(text_to_send)
103
+ text_to_send = [text_to_send].flatten
104
+
105
+ key_modifiers = text_to_send.select { |i| i.is_a?(Symbol) }
106
+ letters = text_to_send - key_modifiers
107
+
108
+ key_modifiers.each do |modifier|
109
+ @driver.action.key_down(modifier).perform
110
+ end
111
+
112
+ letters.each do |letter|
113
+ @driver.action.send_keys(letter.to_s).perform
114
+ end
115
+
116
+ key_modifiers.each do |modifier|
117
+ @driver.action.key_up(modifier).perform
118
+ end
119
+ end
88
120
  end
89
121
  end
@@ -3,10 +3,18 @@
3
3
  module OnlyofficeWebdriverWrapper
4
4
  # Module for wokring with webdriver useragent
5
5
  module WebdriverUserAgentHelper
6
- USERAGENT_ANDROID_PHONE = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MDB08M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36'
7
- USERAGENT_IPHONE = 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1'
8
- USERAGENT_IPAD_AIR_2_SAFARI = 'Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A5346a Safari/602.1'
9
- USERAGENT_NEXUS_10_CHROME = 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Safari/537.36'
6
+ USERAGENT_ANDROID_PHONE = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MDB08M) '\
7
+ 'AppleWebKit/537.36 (KHTML, like Gecko) '\
8
+ 'Chrome/51.0.2704.81 Mobile Safari/537.36'
9
+ USERAGENT_IPHONE = 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) '\
10
+ 'AppleWebKit/601.1.46 (KHTML, like Gecko) '\
11
+ 'Version/9.0 Mobile/13F69 Safari/601.1'
12
+ USERAGENT_IPAD_AIR_2_SAFARI = 'Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) '\
13
+ 'AppleWebKit/602.1.50 (KHTML, like Gecko) '\
14
+ 'Version/10.0 Mobile/14A5346a Safari/602.1'
15
+ USERAGENT_NEXUS_10_CHROME = 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) '\
16
+ 'AppleWebKit/537.36 (KHTML, like Gecko) '\
17
+ 'Chrome/48.0.2564.23 Safari/537.36'
10
18
 
11
19
  # @return [String] user agent string for current device
12
20
  def user_agent_for_device
metadata CHANGED
@@ -1,31 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onlyoffice_webdriver_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
+ - ONLYOFFICE
7
8
  - Pavel Lobashov
8
9
  - Oleg Nazarov
9
10
  - Dmitry Rotaty
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2019-10-18 00:00:00.000000000 Z
14
+ date: 2020-06-03 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: headless
17
18
  requirement: !ruby/object:Gem::Requirement
18
19
  requirements:
19
- - - "~>"
20
+ - - '='
20
21
  - !ruby/object:Gem::Version
21
- version: '2'
22
+ version: 2.3.1
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
26
  requirements:
26
- - - "~>"
27
+ - - '='
27
28
  - !ruby/object:Gem::Version
28
- version: '2'
29
+ version: 2.3.1
29
30
  - !ruby/object:Gem::Dependency
30
31
  name: onlyoffice_file_helper
31
32
  requirement: !ruby/object:Gem::Requirement
@@ -88,14 +89,14 @@ dependencies:
88
89
  requirements:
89
90
  - - '='
90
91
  - !ruby/object:Gem::Version
91
- version: 3.142.6
92
+ version: 3.142.7
92
93
  type: :runtime
93
94
  prerelease: false
94
95
  version_requirements: !ruby/object:Gem::Requirement
95
96
  requirements:
96
97
  - - '='
97
98
  - !ruby/object:Gem::Version
98
- version: 3.142.6
99
+ version: 3.142.7
99
100
  - !ruby/object:Gem::Dependency
100
101
  name: watir
101
102
  requirement: !ruby/object:Gem::Requirement
@@ -110,10 +111,23 @@ dependencies:
110
111
  - - "~>"
111
112
  - !ruby/object:Gem::Version
112
113
  version: '6'
113
- description: onlyoffice_webdriver_wrapper
114
+ - !ruby/object:Gem::Dependency
115
+ name: rake
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '13.0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '13.0'
128
+ description: ONLYOFFICE Webdriver Wrapper Gem. Used in QA
114
129
  email:
115
130
  - shockwavenn@gmail.com
116
- - dafttrick@gmail.com
117
131
  executables: []
118
132
  extensions: []
119
133
  extra_rdoc_files: []
@@ -125,10 +139,13 @@ files:
125
139
  - lib/onlyoffice_webdriver_wrapper/helpers/bin/geckodriver
126
140
  - lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper.rb
127
141
  - lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper.rb
142
+ - lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper/save_to_disk_files.list
128
143
  - lib/onlyoffice_webdriver_wrapper/helpers/headless_helper.rb
144
+ - lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/headless_screenshot_patch.rb
129
145
  - lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/real_display_tools.rb
130
146
  - lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/ruby_helper.rb
131
147
  - lib/onlyoffice_webdriver_wrapper/helpers/os_helper.rb
148
+ - lib/onlyoffice_webdriver_wrapper/name.rb
132
149
  - lib/onlyoffice_webdriver_wrapper/version.rb
133
150
  - lib/onlyoffice_webdriver_wrapper/webdriver.rb
134
151
  - lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_alert_helper.rb
@@ -146,7 +163,12 @@ files:
146
163
  homepage: https://github.com/onlyoffice-testing-robot/onlyoffice_webdriver_wrapper
147
164
  licenses:
148
165
  - AGPL-3.0
149
- metadata: {}
166
+ metadata:
167
+ bug_tracker_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_webdriver_wrapper/issues
168
+ changelog_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_webdriver_wrapper/blob/master/CHANGELOG.md
169
+ documentation_uri: https://www.rubydoc.info/gems/onlyoffice_webdriver_wrapper
170
+ homepage_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_webdriver_wrapper
171
+ source_code_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_webdriver_wrapper
150
172
  post_install_message:
151
173
  rdoc_options: []
152
174
  require_paths:
@@ -155,14 +177,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
177
  requirements:
156
178
  - - ">="
157
179
  - !ruby/object:Gem::Version
158
- version: '2.3'
180
+ version: '0'
159
181
  required_rubygems_version: !ruby/object:Gem::Requirement
160
182
  requirements:
161
183
  - - ">="
162
184
  - !ruby/object:Gem::Version
163
185
  version: '0'
164
186
  requirements: []
165
- rubygems_version: 3.0.6
187
+ rubygems_version: 3.1.2
166
188
  signing_key:
167
189
  specification_version: 4
168
190
  summary: ONLYOFFICE Webdriver Wrapper Gem