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.
- checksums.yaml +4 -4
- data/lib/onlyoffice_webdriver_wrapper/helpers/bin/chromedriver +0 -0
- data/lib/onlyoffice_webdriver_wrapper/helpers/bin/chromedriver_mac +0 -0
- data/lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper.rb +13 -29
- data/lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper.rb +14 -9
- data/lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper/save_to_disk_files.list +35 -0
- data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper.rb +2 -1
- data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/headless_screenshot_patch.rb +18 -0
- data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/real_display_tools.rb +1 -5
- data/lib/onlyoffice_webdriver_wrapper/name.rb +7 -0
- data/lib/onlyoffice_webdriver_wrapper/version.rb +1 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver.rb +32 -137
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_attributes_helper.rb +0 -11
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_helper.rb +14 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_js_methods.rb +39 -8
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_screenshot_helper.rb +9 -3
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_style_helper.rb +2 -11
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_tab_helper.rb +0 -9
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_type_helper.rb +36 -4
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_user_agent_helper.rb +12 -4
- metadata +35 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7dd9754453bdfc98d527929ed558a8a8d7246b25e1ddd836b0af4a57ffc4d55
|
4
|
+
data.tar.gz: 49ca15eea9259e832423665aa0c7a86cc5d2afc17068c65fc6990c272a88091e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7dbe1f1368fb5a3f0b027ede5abc619e97dca747709066fe3fd0d3d7c5c2d89d01a7e45a0eb034652fe238fbb89959fe86deb7dd307ad28b24627381842eba5
|
7
|
+
data.tar.gz: aa67c58fe56ac730be39894b7aa316dc6e134938c89d13f0c46000d18008244f3d90d631ad0d50ae88a25e77c2808870dc470d7d61b582581376f65335c49a3b
|
Binary file
|
Binary file
|
@@ -24,12 +24,12 @@ module OnlyofficeWebdriverWrapper
|
|
24
24
|
def start_chrome_driver
|
25
25
|
prefs = {
|
26
26
|
download: {
|
27
|
-
prompt_for_download
|
28
|
-
default_directory
|
27
|
+
'prompt_for_download' => false,
|
28
|
+
'default_directory' => download_directory
|
29
29
|
},
|
30
30
|
profile: {
|
31
|
-
default_content_setting_values
|
32
|
-
'automatic_downloads'
|
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
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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'] =
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
128
|
-
|
129
|
-
|
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.
|
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("#{
|
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("#{
|
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.
|
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|
|
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
|
-
|
675
|
-
|
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
|
-
|
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
|
-
# @
|
15
|
-
|
16
|
-
|
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
|
33
|
-
height = execute_javascript("return
|
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
|
-
|
42
|
-
|
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 =
|
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 =
|
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 =
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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)
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
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:
|
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:
|
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:
|
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.
|
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.
|
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
|
-
|
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: '
|
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.
|
187
|
+
rubygems_version: 3.1.2
|
166
188
|
signing_key:
|
167
189
|
specification_version: 4
|
168
190
|
summary: ONLYOFFICE Webdriver Wrapper Gem
|