onlyoffice_webdriver_wrapper 0.3.2 → 0.5.0
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 +0 -1
- data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper.rb +3 -0
- data/lib/onlyoffice_webdriver_wrapper/version.rb +1 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver.rb +23 -178
- data/lib/onlyoffice_webdriver_wrapper/webdriver/click_methods.rb +125 -0
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_attributes_helper.rb +19 -0
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_js_methods.rb +6 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_style_helper.rb +11 -14
- metadata +113 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2132850b7105fa563d909e4c82575b19f525603fba19e23a241e743ab2ebf3ef
|
4
|
+
data.tar.gz: b9f5a3a4414ac4b4dc56567593f99c6c4f39ecc494cde8820c09c04e06e3fa1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48cb93139b5f22b4b1993240c6ba7297f886936844eced9f587547d4527083876d1d2065a4eafb34e4a05848fae1d1455e6f3cb3af204fb1c35b02e356b0f5b0
|
7
|
+
data.tar.gz: bb5e042cda619d6ce3714094ed6b50d4369cb8fabe229fdaf33132fc21dc0a094e36d5df49c57a52a8a74301e379f3e90940c9a12ac012098afa12be2cec6c57
|
Binary file
|
Binary file
|
@@ -37,7 +37,6 @@ module OnlyofficeWebdriverWrapper
|
|
37
37
|
caps = Selenium::WebDriver::Remote::Capabilities.chrome
|
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
|
-
caps['chromeOptions'] = { w3c: false }
|
41
40
|
switches = add_useragent_to_switches(DEFAULT_CHROME_SWITCHES)
|
42
41
|
options = Selenium::WebDriver::Chrome::Options.new(args: switches,
|
43
42
|
prefs: prefs)
|
@@ -10,8 +10,11 @@ module OnlyofficeWebdriverWrapper
|
|
10
10
|
class HeadlessHelper
|
11
11
|
include RealDisplayTools
|
12
12
|
include RubyHelper
|
13
|
+
# @return [Headless] instance of headless object
|
13
14
|
attr_accessor :headless_instance
|
15
|
+
# @return [Integer] x resolution of virtual screen
|
14
16
|
attr_accessor :resolution_x
|
17
|
+
# @return [Integer] y resolution of virtual screen
|
15
18
|
attr_accessor :resolution_y
|
16
19
|
|
17
20
|
def initialize(resolution_x = 1680, resolution_y = 1050)
|
@@ -7,6 +7,7 @@ require 'selenium-webdriver'
|
|
7
7
|
require 'uri'
|
8
8
|
require_relative 'helpers/chrome_helper'
|
9
9
|
require_relative 'helpers/firefox_helper'
|
10
|
+
require_relative 'webdriver/click_methods'
|
10
11
|
require_relative 'webdriver/wait_until_methods'
|
11
12
|
require_relative 'webdriver/webdriver_alert_helper'
|
12
13
|
require_relative 'webdriver/webdriver_attributes_helper'
|
@@ -25,6 +26,7 @@ module OnlyofficeWebdriverWrapper
|
|
25
26
|
# noinspection RubyTooManyMethodsInspection, RubyInstanceMethodNamingConvention, RubyParameterNamingConvention
|
26
27
|
class WebDriver
|
27
28
|
include ChromeHelper
|
29
|
+
include ClickMethods
|
28
30
|
include FirefoxHelper
|
29
31
|
include RubyHelper
|
30
32
|
include WaitUntilMethods
|
@@ -42,13 +44,15 @@ module OnlyofficeWebdriverWrapper
|
|
42
44
|
TIMEOUT_FILE_DOWNLOAD = 100
|
43
45
|
# @return [Array, String] default switches for chrome
|
44
46
|
attr_accessor :driver
|
47
|
+
# @return [Symbol] browser to use
|
45
48
|
attr_accessor :browser
|
46
49
|
# @return [True, False] is browser currently running
|
47
50
|
attr_reader :browser_running
|
48
51
|
# @return [Symbol] device of which we try to simulate, default - :desktop_linux
|
49
52
|
attr_accessor :device
|
53
|
+
# @return [String] directory to which file is downloaded
|
50
54
|
attr_accessor :download_directory
|
51
|
-
|
55
|
+
# @return [HeadlessHelper] headless wrapper
|
52
56
|
attr_accessor :headless
|
53
57
|
# @return [Net::HTTP::Proxy] connection proxy
|
54
58
|
attr_accessor :proxy
|
@@ -72,21 +76,20 @@ module OnlyofficeWebdriverWrapper
|
|
72
76
|
when :chrome
|
73
77
|
@driver = start_chrome_driver
|
74
78
|
else
|
75
|
-
raise
|
79
|
+
raise("Unknown Browser: #{browser}")
|
76
80
|
end
|
77
81
|
@browser_running = true
|
78
82
|
end
|
79
83
|
|
80
84
|
def open(url)
|
81
|
-
url =
|
85
|
+
url = "http://#{url}" unless url.include?('http') || url.include?('file://')
|
82
86
|
loop do
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
@driver.navigate.refresh
|
88
|
-
end
|
87
|
+
@driver.navigate.to url
|
88
|
+
break
|
89
|
+
rescue Timeout::Error
|
90
|
+
@driver.navigate.refresh
|
89
91
|
end
|
92
|
+
sleep(1) # Correct wait for Page to init focus
|
90
93
|
OnlyofficeLoggerHelper.log("Opened page: #{url}")
|
91
94
|
end
|
92
95
|
|
@@ -124,20 +127,6 @@ module OnlyofficeWebdriverWrapper
|
|
124
127
|
get_elements(array_elements).map { |current_element| get_text(current_element) }
|
125
128
|
end
|
126
129
|
|
127
|
-
def click(element)
|
128
|
-
element.click
|
129
|
-
end
|
130
|
-
|
131
|
-
def click_and_wait(element_to_click, element_to_wait)
|
132
|
-
element_to_click.click
|
133
|
-
count = 0
|
134
|
-
while !element_to_wait.present? && count < 30
|
135
|
-
sleep 1
|
136
|
-
count += 1
|
137
|
-
end
|
138
|
-
webdriver_error("click_and_wait: Wait for element: #{element_to_click} for 30 seconds") if count == 30
|
139
|
-
end
|
140
|
-
|
141
130
|
def select_from_list_elements(value, elements_value)
|
142
131
|
index = get_element_index(value, elements_value)
|
143
132
|
elements_value[index].click
|
@@ -172,27 +161,6 @@ module OnlyofficeWebdriverWrapper
|
|
172
161
|
OnlyofficeLoggerHelper.log('Go back to previous page')
|
173
162
|
end
|
174
163
|
|
175
|
-
def self.host_name_by_full_url(full_url)
|
176
|
-
uri = URI(full_url)
|
177
|
-
uri.port == 80 || uri.port == 443 ? "#{uri.scheme}://#{uri.host}" : "#{uri.scheme}://#{uri.host}:#{uri.port}"
|
178
|
-
end
|
179
|
-
|
180
|
-
def get_host_name
|
181
|
-
WebDriver.host_name_by_full_url(get_url)
|
182
|
-
end
|
183
|
-
|
184
|
-
def remove_event(event_name)
|
185
|
-
execute_javascript("jQuery(document).unbind('#{event_name}');")
|
186
|
-
end
|
187
|
-
|
188
|
-
def remove_class_by_jquery(selector, class_name)
|
189
|
-
execute_javascript("$(#{dom_element_by_xpath(selector)}).removeClass('#{class_name}');")
|
190
|
-
end
|
191
|
-
|
192
|
-
def add_class_by_jquery(selector, class_name)
|
193
|
-
execute_javascript("$(#{dom_element_by_xpath(selector)}).addClass('#{class_name}');")
|
194
|
-
end
|
195
|
-
|
196
164
|
# Perform drag'n'drop action in one element (for example on big canvas area)
|
197
165
|
# for drag'n'drop one whole element use 'drag_and_drop_by'
|
198
166
|
# ==== Attributes
|
@@ -241,129 +209,22 @@ module OnlyofficeWebdriverWrapper
|
|
241
209
|
def open_dropdown_selector(xpath_name, horizontal_shift = 30, vertical_shift = 0)
|
242
210
|
element = get_element(xpath_name)
|
243
211
|
if @browser == :firefox || @browser == :safari
|
244
|
-
set_style_attribute(xpath_name
|
212
|
+
set_style_attribute("#{xpath_name}/button", 'display', 'none')
|
245
213
|
set_style_attribute(xpath_name, 'display', 'inline')
|
246
214
|
element.click
|
247
|
-
set_style_attribute(xpath_name
|
215
|
+
set_style_attribute("#{xpath_name}/button", 'display', 'inline-block')
|
248
216
|
set_style_attribute(xpath_name, 'display', 'block')
|
249
217
|
else
|
250
218
|
@driver.action.move_to(element, horizontal_shift, vertical_shift).click.perform
|
251
219
|
end
|
252
220
|
end
|
253
221
|
|
254
|
-
# Click on locator
|
255
|
-
# @param count [Integer] count of clicks
|
256
|
-
def click_on_locator(xpath_name, by_javascript = false, count: 1)
|
257
|
-
element = get_element(xpath_name)
|
258
|
-
return webdriver_error("Element with xpath: #{xpath_name} not found") if element.nil?
|
259
|
-
|
260
|
-
if by_javascript
|
261
|
-
execute_javascript("document.evaluate(\"#{xpath_name}\", document, null, XPathResult.ANY_TYPE, null).iterateNext().click();")
|
262
|
-
else
|
263
|
-
begin
|
264
|
-
count.times { element.click }
|
265
|
-
rescue Selenium::WebDriver::Error::ElementNotVisibleError
|
266
|
-
webdriver_error("Selenium::WebDriver::Error::ElementNotVisibleError: element not visible for xpath: #{xpath_name}")
|
267
|
-
rescue Exception => e
|
268
|
-
webdriver_error(e.class, "UnknownError #{e.message} #{xpath_name}")
|
269
|
-
end
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
def left_mouse_click(xpath, x_coord, y_coord)
|
274
|
-
@driver.action.move_to(get_element(xpath), x_coord.to_i, y_coord.to_i).click.perform
|
275
|
-
end
|
276
|
-
|
277
|
-
# Context click on locator
|
278
|
-
# @param [String] xpath_name name of xpath to click
|
279
|
-
def context_click_on_locator(xpath_name)
|
280
|
-
wait_until_element_visible(xpath_name)
|
281
|
-
|
282
|
-
element = @driver.find_element(:xpath, xpath_name)
|
283
|
-
@driver.action.context_click(element).perform
|
284
|
-
end
|
285
|
-
|
286
|
-
def right_click(xpath_name)
|
287
|
-
@driver.action.context_click(@driver.find_element(:xpath, xpath_name)).perform
|
288
|
-
end
|
289
|
-
|
290
|
-
def click_on_displayed(xpath_name)
|
291
|
-
element = get_element_by_display(xpath_name)
|
292
|
-
begin
|
293
|
-
element.is_a?(Array) ? element.first.click : element.click
|
294
|
-
rescue Exception => e
|
295
|
-
webdriver_error("Exception #{e} in click_on_displayed(#{xpath_name})")
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
def click_on_locator_coordinates(xpath_name, right_by, down_by)
|
300
|
-
wait_until_element_visible(xpath_name)
|
301
|
-
element = @driver.find_element(:xpath, xpath_name)
|
302
|
-
@driver.action.move_to(element, right_by.to_i, down_by.to_i).perform
|
303
|
-
@driver.action.move_to(element, right_by.to_i, down_by.to_i).click.perform
|
304
|
-
end
|
305
|
-
|
306
|
-
def right_click_on_locator_coordinates(xpath_name, right_by = nil, down_by = nil)
|
307
|
-
wait_until_element_visible(xpath_name)
|
308
|
-
element = @driver.find_element(:xpath, xpath_name)
|
309
|
-
@driver.action.move_to(element, right_by.to_i, down_by.to_i).perform
|
310
|
-
@driver.action.move_to(element, right_by.to_i, down_by.to_i).context_click.perform
|
311
|
-
end
|
312
|
-
|
313
|
-
def double_click(xpath_name)
|
314
|
-
wait_until_element_visible(xpath_name)
|
315
|
-
@driver.action.move_to(@driver.find_element(:xpath, xpath_name)).double_click.perform
|
316
|
-
end
|
317
|
-
|
318
|
-
def double_click_on_locator_coordinates(xpath_name, right_by, down_by)
|
319
|
-
wait_until_element_visible(xpath_name)
|
320
|
-
@driver.action.move_to(@driver.find_element(:xpath, xpath_name), right_by.to_i, down_by.to_i).double_click.perform
|
321
|
-
end
|
322
|
-
|
323
222
|
def action_on_locator_coordinates(xpath_name, right_by, down_by, action = :click, times = 1)
|
324
223
|
wait_until_element_visible(xpath_name)
|
325
224
|
element = @driver.find_element(:xpath, xpath_name)
|
326
225
|
(0...times).inject(@driver.action.move_to(element, right_by.to_i, down_by.to_i)) { |acc, _elem| acc.send(action) }.perform
|
327
226
|
end
|
328
227
|
|
329
|
-
def click_on_one_of_several_by_text(xpath_several_elements, text_to_click)
|
330
|
-
@driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
|
331
|
-
next unless text_to_click.to_s == current_element.attribute('innerHTML')
|
332
|
-
|
333
|
-
begin
|
334
|
-
current_element.click
|
335
|
-
rescue Exception => e
|
336
|
-
webdriver_error("Error in click_on_one_of_several_by_text(#{xpath_several_elements}, #{text_to_click}): #{e.message}")
|
337
|
-
end
|
338
|
-
return true
|
339
|
-
end
|
340
|
-
false
|
341
|
-
end
|
342
|
-
|
343
|
-
def click_on_one_of_several_by_display(xpath_several_elements)
|
344
|
-
@driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
|
345
|
-
if current_element.displayed?
|
346
|
-
current_element.click
|
347
|
-
return true
|
348
|
-
end
|
349
|
-
end
|
350
|
-
false
|
351
|
-
end
|
352
|
-
|
353
|
-
def click_on_one_of_several_by_parameter(xpath_several_elements, parameter_name, parameter_value)
|
354
|
-
@driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
|
355
|
-
if current_element.attribute(parameter_name).include? parameter_value
|
356
|
-
current_element.click
|
357
|
-
return true
|
358
|
-
end
|
359
|
-
end
|
360
|
-
false
|
361
|
-
end
|
362
|
-
|
363
|
-
def click_on_one_of_several_xpath_by_number(xpath, number_of_element)
|
364
|
-
click_on_locator("(#{xpath})[#{number_of_element}]")
|
365
|
-
end
|
366
|
-
|
367
228
|
def move_to_element(element)
|
368
229
|
element = get_element(element) if element.is_a?(String)
|
369
230
|
@driver.action.move_to(element).perform
|
@@ -381,9 +242,10 @@ module OnlyofficeWebdriverWrapper
|
|
381
242
|
end
|
382
243
|
|
383
244
|
def element_present?(xpath_name)
|
384
|
-
|
245
|
+
case xpath_name
|
246
|
+
when PageObject::Elements::Element
|
385
247
|
xpath_name.present?
|
386
|
-
|
248
|
+
when Selenium::WebDriver::Element
|
387
249
|
xpath_name.displayed?
|
388
250
|
else
|
389
251
|
@driver.find_element(:xpath, xpath_name)
|
@@ -470,14 +332,12 @@ module OnlyofficeWebdriverWrapper
|
|
470
332
|
# @param [String] xpath_name name of current xpath
|
471
333
|
def select_frame(xpath_name = '//iframe', count_of_frames = 1)
|
472
334
|
(0...count_of_frames).each do
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
webdriver_error("Raise unkwnown exception: #{e}")
|
480
|
-
end
|
335
|
+
frame = @driver.find_element(:xpath, xpath_name)
|
336
|
+
@driver.switch_to.frame frame
|
337
|
+
rescue Selenium::WebDriver::Error::NoSuchElementError
|
338
|
+
OnlyofficeLoggerHelper.log('Raise NoSuchElementError in the select_frame method')
|
339
|
+
rescue Exception => e
|
340
|
+
webdriver_error("Raise unkwnown exception: #{e}")
|
481
341
|
end
|
482
342
|
end
|
483
343
|
|
@@ -509,16 +369,6 @@ module OnlyofficeWebdriverWrapper
|
|
509
369
|
@driver.find_elements(:xpath, xpath_several_elements).map { |element| element.text unless element.text == '' }.compact
|
510
370
|
end
|
511
371
|
|
512
|
-
def set_parameter(xpath, attribute, attribute_value)
|
513
|
-
execute_javascript("document.evaluate(\"#{xpath.tr('"', "'")}\",document, null, XPathResult.ANY_TYPE, null ).iterateNext()." \
|
514
|
-
"#{attribute}=\"#{attribute_value}\";")
|
515
|
-
end
|
516
|
-
|
517
|
-
def remove_attribute(xpath, attribute)
|
518
|
-
execute_javascript("document.evaluate(\"#{xpath}\",document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)." \
|
519
|
-
"singleNodeValue.removeAttribute('#{attribute}');")
|
520
|
-
end
|
521
|
-
|
522
372
|
def select_combo_box(xpath_name, select_value, select_by = :value)
|
523
373
|
wait_until_element_visible(xpath_name)
|
524
374
|
option = Selenium::WebDriver::Support::Select.new(get_element(xpath_name))
|
@@ -558,11 +408,6 @@ module OnlyofficeWebdriverWrapper
|
|
558
408
|
full_file_name
|
559
409
|
end
|
560
410
|
|
561
|
-
def service_unavailable?
|
562
|
-
source = get_page_source
|
563
|
-
source.include?('Error 503')
|
564
|
-
end
|
565
|
-
|
566
411
|
# Perform cleanup if something went wrong during tests
|
567
412
|
# @param forced [True, False] should cleanup run in all cases
|
568
413
|
def self.clean_up(forced = false)
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeWebdriverWrapper
|
4
|
+
# Method to perform different clicks
|
5
|
+
module ClickMethods
|
6
|
+
# Click on specified element
|
7
|
+
# @param element [Selenium::WebDriver::Element] element to click
|
8
|
+
# @return [nil] nothing
|
9
|
+
def click(element)
|
10
|
+
element.click
|
11
|
+
end
|
12
|
+
|
13
|
+
# Click on locator
|
14
|
+
# @param xpath_name [String] xpath to click
|
15
|
+
# @param by_javascript [True, False] should be clicked by javascript
|
16
|
+
# @param count [Integer] count of clicks
|
17
|
+
def click_on_locator(xpath_name, by_javascript = false, count: 1)
|
18
|
+
element = get_element(xpath_name)
|
19
|
+
return webdriver_error("Element with xpath: #{xpath_name} not found") if element.nil?
|
20
|
+
|
21
|
+
if by_javascript
|
22
|
+
execute_javascript("document.evaluate(\"#{xpath_name}\", document, null, XPathResult.ANY_TYPE, null).iterateNext().click();")
|
23
|
+
else
|
24
|
+
begin
|
25
|
+
count.times { element.click }
|
26
|
+
rescue Selenium::WebDriver::Error::ElementNotVisibleError => e
|
27
|
+
webdriver_error(e.class, "Selenium::WebDriver::Error::ElementNotVisibleError: element not visible for xpath: #{xpath_name}")
|
28
|
+
rescue Exception => e
|
29
|
+
webdriver_error(e.class, "UnknownError #{e.message} #{xpath_name}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Click on one of several which displayed
|
35
|
+
# @param xpath_name [String] xpath to find element
|
36
|
+
# @return [nil]
|
37
|
+
def click_on_displayed(xpath_name)
|
38
|
+
element = get_element_by_display(xpath_name)
|
39
|
+
begin
|
40
|
+
element.is_a?(Array) ? element.first.click : element.click
|
41
|
+
rescue Exception => e
|
42
|
+
webdriver_error(e.class, "Exception #{e} in click_on_displayed(#{xpath_name})")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Click on locator by coordinates
|
47
|
+
# @param xpath_name [String] xpath to click
|
48
|
+
# @param right_by [Integer] shift to right
|
49
|
+
# @param down_by [Integer] shift to bottom
|
50
|
+
# @return [nil]
|
51
|
+
def click_on_locator_coordinates(xpath_name, right_by, down_by)
|
52
|
+
wait_until_element_visible(xpath_name)
|
53
|
+
element = @driver.find_element(:xpath, xpath_name)
|
54
|
+
@driver.action.move_to(element, right_by.to_i, down_by.to_i).perform
|
55
|
+
@driver.action.move_to(element, right_by.to_i, down_by.to_i).click.perform
|
56
|
+
end
|
57
|
+
|
58
|
+
# Click on one of several which displayed
|
59
|
+
# @param xpath_several_elements [String] xpath to find element
|
60
|
+
# @return [True, False] true if click successful, false if not found
|
61
|
+
def click_on_one_of_several_by_display(xpath_several_elements)
|
62
|
+
@driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
|
63
|
+
if current_element.displayed?
|
64
|
+
current_element.click
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
# Click on one of several xpath filtered by parameter and value
|
72
|
+
# @param xpath_several_elements [String] xpath to select
|
73
|
+
# @param parameter_name [String] parameter name
|
74
|
+
# @param parameter_value [String] parameter value
|
75
|
+
# @return [True, False] true if click successful, false if not found
|
76
|
+
def click_on_one_of_several_by_parameter(xpath_several_elements, parameter_name, parameter_value)
|
77
|
+
@driver.find_elements(:xpath, xpath_several_elements).each do |current_element|
|
78
|
+
if current_element.attribute(parameter_name).include? parameter_value
|
79
|
+
current_element.click
|
80
|
+
return true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
false
|
84
|
+
end
|
85
|
+
|
86
|
+
# Perform right click on xpath
|
87
|
+
# @param xpath_name [String] xpath to click
|
88
|
+
# @return [nil]
|
89
|
+
def right_click(xpath_name)
|
90
|
+
wait_until_element_visible(xpath_name)
|
91
|
+
|
92
|
+
@driver.action.context_click(@driver.find_element(:xpath, xpath_name)).perform
|
93
|
+
end
|
94
|
+
|
95
|
+
# Perform right click on locator with specified coordinates
|
96
|
+
# @param xpath_name [String] xpath to click
|
97
|
+
# @param right_by [Integer] shift to right
|
98
|
+
# @param down_by [Integer] shift to bottom
|
99
|
+
# @return [nil]
|
100
|
+
def right_click_on_locator_coordinates(xpath_name, right_by = nil, down_by = nil)
|
101
|
+
wait_until_element_visible(xpath_name)
|
102
|
+
element = @driver.find_element(:xpath, xpath_name)
|
103
|
+
@driver.action.move_to(element, right_by.to_i, down_by.to_i).perform
|
104
|
+
@driver.action.move_to(element, right_by.to_i, down_by.to_i).context_click.perform
|
105
|
+
end
|
106
|
+
|
107
|
+
# Perform double_click on element
|
108
|
+
# @param xpath_name [String] xpath to click
|
109
|
+
# @return [nil]
|
110
|
+
def double_click(xpath_name)
|
111
|
+
wait_until_element_visible(xpath_name)
|
112
|
+
@driver.action.move_to(@driver.find_element(:xpath, xpath_name)).double_click.perform
|
113
|
+
end
|
114
|
+
|
115
|
+
# Perform double_click on specified coordinates
|
116
|
+
# @param xpath_name [String] xpath to click
|
117
|
+
# @param right_by [Integer] shift to right
|
118
|
+
# @param down_by [Integer] shift to bottom
|
119
|
+
# @return [nil]
|
120
|
+
def double_click_on_locator_coordinates(xpath_name, right_by, down_by)
|
121
|
+
wait_until_element_visible(xpath_name)
|
122
|
+
@driver.action.move_to(@driver.find_element(:xpath, xpath_name), right_by.to_i, down_by.to_i).double_click.perform
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -40,5 +40,24 @@ module OnlyofficeWebdriverWrapper
|
|
40
40
|
end
|
41
41
|
0
|
42
42
|
end
|
43
|
+
|
44
|
+
# Set element attribute
|
45
|
+
# @param xpath [String] element to select
|
46
|
+
# @param attribute [String] attribute to set
|
47
|
+
# @param attribute_value [String] value of attribute
|
48
|
+
# @return [String] result of execution
|
49
|
+
def set_attribute(xpath, attribute, attribute_value)
|
50
|
+
execute_javascript("#{dom_element_by_xpath(xpath)}.#{attribute}=\"#{attribute_value}\";")
|
51
|
+
end
|
52
|
+
|
53
|
+
alias set_parameter set_attribute
|
54
|
+
|
55
|
+
# Remove attribute of element
|
56
|
+
# @param xpath [String] xpath of element
|
57
|
+
# @param attribute [String] attribute to remove
|
58
|
+
# @return [String] result of execution
|
59
|
+
def remove_attribute(xpath, attribute)
|
60
|
+
execute_javascript("#{dom_element_by_xpath(xpath)}.removeAttribute('#{attribute}');")
|
61
|
+
end
|
43
62
|
end
|
44
63
|
end
|
@@ -28,8 +28,13 @@ module OnlyofficeWebdriverWrapper
|
|
28
28
|
execute_javascript("document.evaluate('#{xpath_name}', document, null, XPathResult.ANY_TYPE, null).iterateNext().value=\"#{escaped_text}\";")
|
29
29
|
end
|
30
30
|
|
31
|
+
# Get text in object by xpath
|
32
|
+
# @param xpath [String] xpath to get text
|
33
|
+
# @return [String] text in xpath
|
31
34
|
def get_text_by_js(xpath)
|
32
|
-
execute_javascript("return
|
35
|
+
text = execute_javascript("return #{dom_element_by_xpath(xpath)}.textContent")
|
36
|
+
text = execute_javascript("return #{dom_element_by_xpath(xpath)}.value") if text.empty?
|
37
|
+
text
|
33
38
|
end
|
34
39
|
|
35
40
|
# Calculate object size using Javascript
|
@@ -10,26 +10,23 @@ module OnlyofficeWebdriverWrapper
|
|
10
10
|
nil
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
# Set style attribute value of element
|
14
|
+
# @param xpath [String] xpath to set
|
15
|
+
# @param attribute [String] style param to set
|
16
|
+
# @param attribute_value [String] attribute value to set
|
17
|
+
# @return [String] result of execution
|
18
18
|
def set_style_attribute(xpath, attribute, attribute_value)
|
19
|
-
execute_javascript("
|
20
|
-
"singleNodeValue.style.#{attribute}=\"#{attribute_value}\"")
|
19
|
+
execute_javascript("#{dom_element_by_xpath(xpath)}.style.#{attribute}=\"#{attribute_value}\"")
|
21
20
|
end
|
22
21
|
|
22
|
+
alias set_style_parameter set_style_attribute
|
23
|
+
|
23
24
|
def set_style_show_by_xpath(xpath, move_to_center = false)
|
24
|
-
xpath =
|
25
|
-
execute_javascript('document.evaluate( \'' + xpath.to_s +
|
26
|
-
'\' ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue.style.display = "block";')
|
25
|
+
execute_javascript("#{dom_element_by_xpath(xpath)}.style.display = 'block';")
|
27
26
|
return unless move_to_center
|
28
27
|
|
29
|
-
execute_javascript(
|
30
|
-
|
31
|
-
execute_javascript('document.evaluate( \'' + xpath.to_s +
|
32
|
-
'\' ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue.style.top = "260px";')
|
28
|
+
execute_javascript("#{dom_element_by_xpath(xpath)}.style.left = '410px';")
|
29
|
+
execute_javascript("#{dom_element_by_xpath(xpath)}.style.top = '260px';")
|
33
30
|
end
|
34
31
|
end
|
35
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onlyoffice_webdriver_wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ONLYOFFICE
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2020-
|
14
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: headless
|
@@ -31,58 +31,58 @@ dependencies:
|
|
31
31
|
name: onlyoffice_file_helper
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
|
-
- -
|
34
|
+
- - '='
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
36
|
+
version: 0.3.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - '='
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: 0.3.0
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
45
|
name: onlyoffice_logger_helper
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
47
47
|
requirements:
|
48
|
-
- -
|
48
|
+
- - '='
|
49
49
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
50
|
+
version: 1.0.3
|
51
51
|
type: :runtime
|
52
52
|
prerelease: false
|
53
53
|
version_requirements: !ruby/object:Gem::Requirement
|
54
54
|
requirements:
|
55
|
-
- -
|
55
|
+
- - '='
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
57
|
+
version: 1.0.3
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: onlyoffice_s3_wrapper
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
-
- -
|
62
|
+
- - '='
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
64
|
+
version: 0.1.2
|
65
65
|
type: :runtime
|
66
66
|
prerelease: false
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
68
68
|
requirements:
|
69
|
-
- -
|
69
|
+
- - '='
|
70
70
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
71
|
+
version: 0.1.2
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
73
|
name: page-object
|
74
74
|
requirement: !ruby/object:Gem::Requirement
|
75
75
|
requirements:
|
76
|
-
- -
|
76
|
+
- - '='
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
version:
|
78
|
+
version: 2.2.6
|
79
79
|
type: :runtime
|
80
80
|
prerelease: false
|
81
81
|
version_requirements: !ruby/object:Gem::Requirement
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - '='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
85
|
+
version: 2.2.6
|
86
86
|
- !ruby/object:Gem::Dependency
|
87
87
|
name: selenium-webdriver
|
88
88
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,30 +101,114 @@ dependencies:
|
|
101
101
|
name: watir
|
102
102
|
requirement: !ruby/object:Gem::Requirement
|
103
103
|
requirements:
|
104
|
-
- -
|
104
|
+
- - '='
|
105
105
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
106
|
+
version: 6.16.5
|
107
107
|
type: :runtime
|
108
108
|
prerelease: false
|
109
109
|
version_requirements: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
|
-
- -
|
111
|
+
- - '='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 6.16.5
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: codecov
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - '='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 0.2.8
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - '='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: 0.2.8
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: overcommit
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - '='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 0.55.0
|
135
|
+
type: :development
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - '='
|
112
140
|
- !ruby/object:Gem::Version
|
113
|
-
version:
|
141
|
+
version: 0.55.0
|
114
142
|
- !ruby/object:Gem::Dependency
|
115
143
|
name: rake
|
116
144
|
requirement: !ruby/object:Gem::Requirement
|
117
145
|
requirements:
|
118
|
-
- -
|
146
|
+
- - '='
|
119
147
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
148
|
+
version: 13.0.1
|
121
149
|
type: :development
|
122
150
|
prerelease: false
|
123
151
|
version_requirements: !ruby/object:Gem::Requirement
|
124
152
|
requirements:
|
125
|
-
- -
|
153
|
+
- - '='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: 13.0.1
|
156
|
+
- !ruby/object:Gem::Dependency
|
157
|
+
name: rspec
|
158
|
+
requirement: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - '='
|
126
161
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
162
|
+
version: 3.9.0
|
163
|
+
type: :development
|
164
|
+
prerelease: false
|
165
|
+
version_requirements: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - '='
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: 3.9.0
|
170
|
+
- !ruby/object:Gem::Dependency
|
171
|
+
name: rubocop
|
172
|
+
requirement: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - '='
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: 0.89.1
|
177
|
+
type: :development
|
178
|
+
prerelease: false
|
179
|
+
version_requirements: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - '='
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 0.89.1
|
184
|
+
- !ruby/object:Gem::Dependency
|
185
|
+
name: rubocop-performance
|
186
|
+
requirement: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - '='
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 1.7.1
|
191
|
+
type: :development
|
192
|
+
prerelease: false
|
193
|
+
version_requirements: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - '='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: 1.7.1
|
198
|
+
- !ruby/object:Gem::Dependency
|
199
|
+
name: rubocop-rspec
|
200
|
+
requirement: !ruby/object:Gem::Requirement
|
201
|
+
requirements:
|
202
|
+
- - '='
|
203
|
+
- !ruby/object:Gem::Version
|
204
|
+
version: 1.43.2
|
205
|
+
type: :development
|
206
|
+
prerelease: false
|
207
|
+
version_requirements: !ruby/object:Gem::Requirement
|
208
|
+
requirements:
|
209
|
+
- - '='
|
210
|
+
- !ruby/object:Gem::Version
|
211
|
+
version: 1.43.2
|
128
212
|
description: ONLYOFFICE Webdriver Wrapper Gem. Used in QA
|
129
213
|
email:
|
130
214
|
- shockwavenn@gmail.com
|
@@ -148,6 +232,7 @@ files:
|
|
148
232
|
- lib/onlyoffice_webdriver_wrapper/name.rb
|
149
233
|
- lib/onlyoffice_webdriver_wrapper/version.rb
|
150
234
|
- lib/onlyoffice_webdriver_wrapper/webdriver.rb
|
235
|
+
- lib/onlyoffice_webdriver_wrapper/webdriver/click_methods.rb
|
151
236
|
- lib/onlyoffice_webdriver_wrapper/webdriver/wait_until_methods.rb
|
152
237
|
- lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_alert_helper.rb
|
153
238
|
- lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_attributes_helper.rb
|
@@ -178,14 +263,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
178
263
|
requirements:
|
179
264
|
- - ">="
|
180
265
|
- !ruby/object:Gem::Version
|
181
|
-
version: '
|
266
|
+
version: '2.5'
|
182
267
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
268
|
requirements:
|
184
269
|
- - ">="
|
185
270
|
- !ruby/object:Gem::Version
|
186
271
|
version: '0'
|
187
272
|
requirements: []
|
188
|
-
rubygems_version: 3.1.
|
273
|
+
rubygems_version: 3.1.4
|
189
274
|
signing_key:
|
190
275
|
specification_version: 4
|
191
276
|
summary: ONLYOFFICE Webdriver Wrapper Gem
|