onlyoffice_webdriver_wrapper 1.8.1 → 1.10.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/chrome_helper/chromedriver_bin/{chromedriver_linux_101 → chromedriver_linux_104} +0 -0
- data/lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_mac +0 -0
- data/lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper.rb +4 -1
- data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper/headless_patch.rb +1 -1
- data/lib/onlyoffice_webdriver_wrapper/helpers/headless_helper.rb +1 -1
- data/lib/onlyoffice_webdriver_wrapper/version.rb +1 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver/click_methods.rb +5 -3
- data/lib/onlyoffice_webdriver_wrapper/webdriver/element_getters.rb +46 -0
- data/lib/onlyoffice_webdriver_wrapper/webdriver/get_text_methods.rb +48 -0
- data/lib/onlyoffice_webdriver_wrapper/webdriver/select_list_methods.rb +52 -0
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_attributes_helper.rb +1 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_exceptions.rb +2 -0
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_frame_methods.rb +2 -2
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_js_methods.rb +2 -11
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_navigation_methods.rb +7 -3
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_screenshot_helper.rb +5 -4
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_tab_helper.rb +6 -1
- data/lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_type_helper.rb +12 -4
- data/lib/onlyoffice_webdriver_wrapper/webdriver.rb +15 -126
- metadata +15 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 38bd65e16f39df65c2513cf77d215d9df3e35511260a505f894b524cac93f7fa
|
|
4
|
+
data.tar.gz: 4ae69daf079c905eef591f76376feea072eb13e500ef257b0d07f1b696f0ef8f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fbd8f193fdb5e43da1ef26d14572d3f915d9152098c51673d141fa86236af37f5a547d0fa9a001d5a638a0a96fd72773b9616ac58a86802c3ef148de05d12bbd
|
|
7
|
+
data.tar.gz: ea78ca635fdb7c87397962a2aa727295d9dfc37798bd5deaad338b463967fb95bbd3e83d5b4cd190062823fb52499ecf2795ca42f9891c9b2d393ebc566f8e89
|
|
Binary file
|
data/lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_mac
CHANGED
|
Binary file
|
|
@@ -21,7 +21,10 @@ module OnlyofficeWebdriverWrapper
|
|
|
21
21
|
caps = Selenium::WebDriver::Remote::Capabilities.firefox
|
|
22
22
|
caps[:proxy] = Selenium::WebDriver::Proxy.new(ssl: "#{@proxy.proxy_address}:#{@proxy.proxy_port}") if @proxy
|
|
23
23
|
driver = Selenium::WebDriver.for :firefox, service: firefox_service, capabilities: [caps, options]
|
|
24
|
-
|
|
24
|
+
if headless.running?
|
|
25
|
+
driver.manage.window.size = Selenium::WebDriver::Dimension.new(headless.resolution_x,
|
|
26
|
+
headless.resolution_y)
|
|
27
|
+
end
|
|
25
28
|
driver
|
|
26
29
|
end
|
|
27
30
|
|
|
@@ -29,7 +29,7 @@ class Headless
|
|
|
29
29
|
class VideoRecorder
|
|
30
30
|
# Stop recording and save it
|
|
31
31
|
# @param [String] path to save
|
|
32
|
-
# @
|
|
32
|
+
# @return [nil, String] path to result file or nil if error
|
|
33
33
|
def stop_and_save(path)
|
|
34
34
|
CliUtil.kill_process(@pid_file_path, :wait => true)
|
|
35
35
|
if File.exist? @tmp_file_path
|
|
@@ -54,7 +54,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
54
54
|
destroy_at_exit: true,
|
|
55
55
|
dimensions: "#{@resolution_x + 1}x#{@resolution_y + 1}x24",
|
|
56
56
|
video: { provider: :ffmpeg })
|
|
57
|
-
rescue
|
|
57
|
+
rescue StandardError => e
|
|
58
58
|
OnlyofficeLoggerHelper.log("xvfb not started with problem #{e}")
|
|
59
59
|
WebDriver.clean_up(true)
|
|
60
60
|
@headless_instance = Headless.new(reuse: false,
|
|
@@ -24,8 +24,10 @@ module OnlyofficeWebdriverWrapper
|
|
|
24
24
|
begin
|
|
25
25
|
count.times { element.click }
|
|
26
26
|
rescue Selenium::WebDriver::Error::ElementNotInteractableError => e
|
|
27
|
-
webdriver_error(e.class,
|
|
28
|
-
|
|
27
|
+
webdriver_error(e.class,
|
|
28
|
+
'Selenium::WebDriver::Error::ElementNotInteractableError: ' \
|
|
29
|
+
"element not visible for xpath: #{xpath_name}")
|
|
30
|
+
rescue StandardError => e
|
|
29
31
|
webdriver_error(e.class, "UnknownError #{e.message} #{xpath_name}")
|
|
30
32
|
end
|
|
31
33
|
end
|
|
@@ -38,7 +40,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
38
40
|
element = get_element_by_display(xpath_name)
|
|
39
41
|
begin
|
|
40
42
|
element.is_a?(Array) ? element.first.click : element.click
|
|
41
|
-
rescue
|
|
43
|
+
rescue StandardError => e
|
|
42
44
|
webdriver_error(e.class, "Exception #{e} in click_on_displayed(#{xpath_name})")
|
|
43
45
|
end
|
|
44
46
|
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OnlyofficeWebdriverWrapper
|
|
4
|
+
# Methods to get elements
|
|
5
|
+
module ClickMethods
|
|
6
|
+
# Get element by it's xpath
|
|
7
|
+
# @param [String] object_identification xpath of object to find
|
|
8
|
+
# @return [Object, nil] nil if nothing found
|
|
9
|
+
def get_element(object_identification)
|
|
10
|
+
return object_identification unless object_identification.is_a?(String)
|
|
11
|
+
|
|
12
|
+
@driver.find_element(:xpath, object_identification)
|
|
13
|
+
rescue StandardError
|
|
14
|
+
nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Get first visible element from several
|
|
18
|
+
# @param [String] xpath_name to find several objects
|
|
19
|
+
# @raise [Selenium::WebDriver::Error::InvalidSelectorError] if selector is invalid
|
|
20
|
+
# @return [Object] first visible element
|
|
21
|
+
def get_element_by_display(xpath_name)
|
|
22
|
+
@driver.find_elements(:xpath, xpath_name).each do |element|
|
|
23
|
+
return element if element.displayed?
|
|
24
|
+
end
|
|
25
|
+
rescue Selenium::WebDriver::Error::InvalidSelectorError
|
|
26
|
+
webdriver_error(Selenium::WebDriver::Error::InvalidSelectorError,
|
|
27
|
+
"Invalid Selector: get_element_by_display('#{xpath_name}')")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Get array of webdriver object by xpath
|
|
31
|
+
# @param [String] objects_identification object to find
|
|
32
|
+
# @param [Boolean] only_visible return invisible if true
|
|
33
|
+
# @return [Array, Object] list of objects
|
|
34
|
+
def get_elements(objects_identification, only_visible = true)
|
|
35
|
+
return objects_identification if objects_identification.is_a?(Array)
|
|
36
|
+
|
|
37
|
+
elements = @driver.find_elements(:xpath, objects_identification)
|
|
38
|
+
if only_visible
|
|
39
|
+
elements.each do |current|
|
|
40
|
+
elements.delete(current) unless @browser == :firefox || current.displayed?
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
elements
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OnlyofficeWebdriverWrapper
|
|
4
|
+
# Method to get text
|
|
5
|
+
module GetTextMethods
|
|
6
|
+
# Get text of current element
|
|
7
|
+
# @param [String] xpath_name name of xpath
|
|
8
|
+
# @param [Boolean] wait_until_visible wait until element visible
|
|
9
|
+
# @return [String] result string
|
|
10
|
+
def get_text(xpath_name, wait_until_visible = true)
|
|
11
|
+
wait_until_element_visible(xpath_name) if wait_until_visible
|
|
12
|
+
|
|
13
|
+
element = get_element(xpath_name)
|
|
14
|
+
webdriver_error("get_text(#{xpath_name}, #{wait_until_visible}) not found element by xpath") if element.nil?
|
|
15
|
+
if element.tag_name == 'input' || element.tag_name == 'textarea'
|
|
16
|
+
element.attribute('value')
|
|
17
|
+
else
|
|
18
|
+
element.text
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Get text in object by xpath
|
|
23
|
+
# @param xpath [String] xpath to get text
|
|
24
|
+
# @return [String] text in xpath
|
|
25
|
+
def get_text_by_js(xpath)
|
|
26
|
+
text = execute_javascript("return #{dom_element_by_xpath(xpath)}.textContent")
|
|
27
|
+
text = execute_javascript("return #{dom_element_by_xpath(xpath)}.value") if text.empty?
|
|
28
|
+
text
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Get text from all elements with specified xpath
|
|
32
|
+
# @param array_elements [String] xpath of elements
|
|
33
|
+
# @return [Array<String>] values of elements
|
|
34
|
+
def get_text_array(array_elements)
|
|
35
|
+
get_elements(array_elements).map { |current_element| get_text(current_element) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Get text from several elements
|
|
39
|
+
# This method filter out all elements with empty text
|
|
40
|
+
# @param [String] xpath_several_elements to find objects
|
|
41
|
+
# @return [Array<String>] text of those elements
|
|
42
|
+
def get_text_of_several_elements(xpath_several_elements)
|
|
43
|
+
@driver.find_elements(:xpath, xpath_several_elements).filter_map do |element|
|
|
44
|
+
element.text unless element.text == ''
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OnlyofficeWebdriverWrapper
|
|
4
|
+
# Method to work with select list
|
|
5
|
+
module SelectListMethods
|
|
6
|
+
# Select from list elements
|
|
7
|
+
# @param [String] value value to find object
|
|
8
|
+
# @param [Array<PageObject::Elements::Element>] elements_value `elements` page object to select from
|
|
9
|
+
# @raise [SelectEntryNotFound] if value not found in select list
|
|
10
|
+
# @return [void]
|
|
11
|
+
def select_from_list_elements(value, elements_value)
|
|
12
|
+
index = get_element_index(value, elements_value)
|
|
13
|
+
webdriver_error(SelectEntryNotFound, "Select entry `#{value}` not found in #{elements_value}") if index.nil?
|
|
14
|
+
|
|
15
|
+
elements_value[index].click
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Get index of element by it's text
|
|
19
|
+
# @param [String] text to compare text
|
|
20
|
+
# @param [Array<PageObject::Elements::Element>] list_elements array with
|
|
21
|
+
# PageObject elements to find in
|
|
22
|
+
# @return [Integer, nil] nil if nothing found, index if found
|
|
23
|
+
def get_element_index(text, list_elements)
|
|
24
|
+
list_elements.each_with_index do |current, i|
|
|
25
|
+
return i if get_text(current) == text
|
|
26
|
+
end
|
|
27
|
+
nil
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Get all options for combobox or select
|
|
31
|
+
# @param [String] xpath_name to find element
|
|
32
|
+
# @return [Array<String>] values
|
|
33
|
+
def get_all_combo_box_values(xpath_name)
|
|
34
|
+
@driver.find_element(:xpath, xpath_name).find_elements(tag_name: 'option').map { |el| el.attribute('value') }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Select value of combo box
|
|
38
|
+
# @param [String] xpath_name to find combobox
|
|
39
|
+
# @param [String] select_value to select
|
|
40
|
+
# @param [Symbol] select_by select type, can be `:value` or `:text`
|
|
41
|
+
# @return [void]
|
|
42
|
+
def select_combo_box(xpath_name, select_value, select_by = :value)
|
|
43
|
+
wait_until_element_visible(xpath_name)
|
|
44
|
+
option = Selenium::WebDriver::Support::Select.new(get_element(xpath_name))
|
|
45
|
+
begin
|
|
46
|
+
option.select_by(select_by, select_value)
|
|
47
|
+
rescue StandardError
|
|
48
|
+
option.select_by(:text, select_value)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -13,7 +13,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
13
13
|
@driver.switch_to.frame frame
|
|
14
14
|
rescue Selenium::WebDriver::Error::NoSuchElementError
|
|
15
15
|
OnlyofficeLoggerHelper.log('Raise NoSuchElementError in the select_frame method')
|
|
16
|
-
rescue
|
|
16
|
+
rescue StandardError => e
|
|
17
17
|
webdriver_error("Raise unknown exception: #{e}")
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -24,7 +24,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
24
24
|
@driver.switch_to.default_content
|
|
25
25
|
rescue Timeout::Error
|
|
26
26
|
OnlyofficeLoggerHelper.log('Raise TimeoutError in the select_top_frame method')
|
|
27
|
-
rescue
|
|
27
|
+
rescue StandardError => e
|
|
28
28
|
raise "Browser is crushed or hangup with error: #{e}"
|
|
29
29
|
end
|
|
30
30
|
end
|
|
@@ -18,7 +18,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
18
18
|
# in that case performing `webdriver_error` only cause forever loop
|
|
19
19
|
# since webdriver_error trying to get_url or make screenshots
|
|
20
20
|
raise(e.class, "Timeout Error #{e} happened while executing #{script}")
|
|
21
|
-
rescue
|
|
21
|
+
rescue StandardError => e
|
|
22
22
|
webdriver_error(e, "Exception #{e} in execute_javascript: #{script}")
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -40,15 +40,6 @@ module OnlyofficeWebdriverWrapper
|
|
|
40
40
|
execute_javascript("#{dom_element_by_xpath(xpath)}.value=\"#{escaped_text}\";")
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
# Get text in object by xpath
|
|
44
|
-
# @param xpath [String] xpath to get text
|
|
45
|
-
# @return [String] text in xpath
|
|
46
|
-
def get_text_by_js(xpath)
|
|
47
|
-
text = execute_javascript("return #{dom_element_by_xpath(xpath)}.textContent")
|
|
48
|
-
text = execute_javascript("return #{dom_element_by_xpath(xpath)}.value") if text.empty?
|
|
49
|
-
text
|
|
50
|
-
end
|
|
51
|
-
|
|
52
43
|
# Calculate object size using Javascript
|
|
53
44
|
# @param xpath [Sting] xpath of object
|
|
54
45
|
# @return [Dimensions] size of element
|
|
@@ -93,7 +84,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
93
84
|
# @param property [String] property to get
|
|
94
85
|
# @return [String] value of property
|
|
95
86
|
def computed_style(xpath, pseudo_element = 'null', property = nil)
|
|
96
|
-
element_by_xpath =
|
|
87
|
+
element_by_xpath = dom_element_by_xpath(xpath)
|
|
97
88
|
style = "window.getComputedStyle(#{element_by_xpath}, '#{pseudo_element}')"
|
|
98
89
|
full_command = "#{style}.getPropertyValue('#{property}')"
|
|
99
90
|
result = execute_javascript("return #{full_command}")
|
|
@@ -20,12 +20,16 @@ module OnlyofficeWebdriverWrapper
|
|
|
20
20
|
|
|
21
21
|
# @return [String] url of current frame, or browser url if
|
|
22
22
|
# it is a root frame
|
|
23
|
-
def
|
|
23
|
+
def current_url
|
|
24
24
|
execute_javascript('return window.location.href')
|
|
25
25
|
rescue Selenium::WebDriver::Error::NoSuchFrameError, Timeout::Error => e
|
|
26
26
|
raise(e.class, "Browser is crushed or hangup with #{e}")
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
+
alias get_url current_url
|
|
30
|
+
extend Gem::Deprecate
|
|
31
|
+
deprecate :get_url, 'current_url', 2069, 1
|
|
32
|
+
|
|
29
33
|
# Refresh current page
|
|
30
34
|
# @return [nil]
|
|
31
35
|
def refresh
|
|
@@ -48,11 +52,11 @@ module OnlyofficeWebdriverWrapper
|
|
|
48
52
|
begin
|
|
49
53
|
@driver.execute_script('window.onbeforeunload = null') # off popup window
|
|
50
54
|
rescue StandardError
|
|
51
|
-
|
|
55
|
+
StandardError
|
|
52
56
|
end
|
|
53
57
|
begin
|
|
54
58
|
@driver.quit
|
|
55
|
-
rescue
|
|
59
|
+
rescue StandardError => e
|
|
56
60
|
OnlyofficeLoggerHelper.log("Some error happened on webdriver.quit #{e.backtrace}")
|
|
57
61
|
end
|
|
58
62
|
alert_confirm
|
|
@@ -22,7 +22,8 @@ module OnlyofficeWebdriverWrapper
|
|
|
22
22
|
# Get screenshot of current windows and upload it to cloud storage
|
|
23
23
|
# @param [String] path_to_screenshot place to store local screenshot
|
|
24
24
|
# @return [String] url of public screenshot
|
|
25
|
-
def get_screenshot_and_upload(path_to_screenshot =
|
|
25
|
+
def get_screenshot_and_upload(path_to_screenshot = nil)
|
|
26
|
+
path_to_screenshot ||= "#{screenshot_folder}/#{StringHelper.generate_random_string}.png"
|
|
26
27
|
begin
|
|
27
28
|
get_screenshot(path_to_screenshot)
|
|
28
29
|
cloud_screenshot = publish_screenshot(path_to_screenshot)
|
|
@@ -57,20 +58,20 @@ module OnlyofficeWebdriverWrapper
|
|
|
57
58
|
def webdriver_screenshot(screenshot_name = SecureRandom.uuid)
|
|
58
59
|
begin
|
|
59
60
|
link = get_screenshot_and_upload("#{screenshot_folder}/#{screenshot_name}.png")
|
|
60
|
-
rescue
|
|
61
|
+
rescue StandardError => e
|
|
61
62
|
OnlyofficeLoggerHelper.log("Error in get screenshot: #{e}. Trying to get headless screenshot")
|
|
62
63
|
if @headless.headless_instance.nil?
|
|
63
64
|
system_screenshot("/tmp/#{screenshot_name}.png")
|
|
64
65
|
begin
|
|
65
66
|
link = publish_screenshot("/tmp/#{screenshot_name}.png")
|
|
66
|
-
rescue
|
|
67
|
+
rescue StandardError => e
|
|
67
68
|
OnlyofficeLoggerHelper.log("Error in get screenshot: #{e}. System screenshot #{link}")
|
|
68
69
|
end
|
|
69
70
|
else
|
|
70
71
|
@headless.take_screenshot("/tmp/#{screenshot_name}.png")
|
|
71
72
|
begin
|
|
72
73
|
link = publish_screenshot("/tmp/#{screenshot_name}.png")
|
|
73
|
-
rescue
|
|
74
|
+
rescue StandardError => e
|
|
74
75
|
OnlyofficeLoggerHelper.log("Error in get screenshot: #{e}. Headless screenshot #{link}")
|
|
75
76
|
end
|
|
76
77
|
end
|
|
@@ -85,8 +85,13 @@ module OnlyofficeWebdriverWrapper
|
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
# @return [String] title of current tab
|
|
88
|
-
def
|
|
88
|
+
def title_of_current_tab
|
|
89
89
|
@driver.title
|
|
90
90
|
end
|
|
91
|
+
|
|
92
|
+
alias get_title_of_current_tab title_of_current_tab
|
|
93
|
+
|
|
94
|
+
extend Gem::Deprecate
|
|
95
|
+
deprecate :get_title_of_current_tab, 'title_of_current_tab', 2069, 1
|
|
91
96
|
end
|
|
92
97
|
end
|
|
@@ -32,12 +32,17 @@ module OnlyofficeWebdriverWrapper
|
|
|
32
32
|
# @param [Boolean] by_action type by `@driver.action` if true
|
|
33
33
|
# @param [Boolean] by_element_send_key use `element.send_keys` if true
|
|
34
34
|
# @return [void]
|
|
35
|
-
def type_to_locator(xpath_name,
|
|
35
|
+
def type_to_locator(xpath_name,
|
|
36
|
+
text_to_send,
|
|
37
|
+
clear_content = true,
|
|
38
|
+
click_on_it = false,
|
|
39
|
+
by_action = false,
|
|
40
|
+
by_element_send_key = false)
|
|
36
41
|
element = get_element(xpath_name)
|
|
37
42
|
if clear_content
|
|
38
43
|
begin
|
|
39
44
|
element.clear
|
|
40
|
-
rescue
|
|
45
|
+
rescue StandardError => e
|
|
41
46
|
webdriver_error(e.class, "Error in element.clear #{e} for " \
|
|
42
47
|
"type_to_locator(#{xpath_name}, #{text_to_send}, " \
|
|
43
48
|
"#{clear_content}, #{click_on_it}, " \
|
|
@@ -81,8 +86,11 @@ module OnlyofficeWebdriverWrapper
|
|
|
81
86
|
if click_on_it
|
|
82
87
|
begin
|
|
83
88
|
element.click
|
|
84
|
-
rescue
|
|
85
|
-
webdriver_error(e.class,
|
|
89
|
+
rescue StandardError => e
|
|
90
|
+
webdriver_error(e.class,
|
|
91
|
+
"type_to_input(#{xpath_name}, #{text_to_send}, " \
|
|
92
|
+
"#{clear_content}, #{click_on_it}) " \
|
|
93
|
+
"error in 'element.click' error: #{e}")
|
|
86
94
|
end
|
|
87
95
|
sleep 0.2
|
|
88
96
|
end
|
|
@@ -8,6 +8,9 @@ require 'uri'
|
|
|
8
8
|
require_relative 'helpers/chrome_helper'
|
|
9
9
|
require_relative 'helpers/firefox_helper'
|
|
10
10
|
require_relative 'webdriver/click_methods'
|
|
11
|
+
require_relative 'webdriver/element_getters'
|
|
12
|
+
require_relative 'webdriver/get_text_methods'
|
|
13
|
+
require_relative 'webdriver/select_list_methods'
|
|
11
14
|
require_relative 'webdriver/wait_until_methods'
|
|
12
15
|
require_relative 'webdriver/webdriver_alert_helper'
|
|
13
16
|
require_relative 'webdriver/webdriver_attributes_helper'
|
|
@@ -31,6 +34,8 @@ module OnlyofficeWebdriverWrapper
|
|
|
31
34
|
class WebDriver
|
|
32
35
|
include ChromeHelper
|
|
33
36
|
include ClickMethods
|
|
37
|
+
include GetTextMethods
|
|
38
|
+
include SelectListMethods
|
|
34
39
|
include FirefoxHelper
|
|
35
40
|
include RubyHelper
|
|
36
41
|
include WaitUntilMethods
|
|
@@ -91,68 +96,12 @@ module OnlyofficeWebdriverWrapper
|
|
|
91
96
|
@browser_running = true
|
|
92
97
|
end
|
|
93
98
|
|
|
94
|
-
# Get element by it's xpath
|
|
95
|
-
# @param [String] object_identification xpath of object to find
|
|
96
|
-
# @return [Object, nil] nil if nothing found
|
|
97
|
-
def get_element(object_identification)
|
|
98
|
-
return object_identification unless object_identification.is_a?(String)
|
|
99
|
-
|
|
100
|
-
@driver.find_element(:xpath, object_identification)
|
|
101
|
-
rescue StandardError
|
|
102
|
-
nil
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Get text from all elements with specified xpath
|
|
106
|
-
# @param array_elements [String] xpath of elements
|
|
107
|
-
# @return [Array<String>] values of elements
|
|
108
|
-
def get_text_array(array_elements)
|
|
109
|
-
get_elements(array_elements).map { |current_element| get_text(current_element) }
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
# Select from list elements
|
|
113
|
-
# @param [String] value value to find object
|
|
114
|
-
# @param [Array<Object>] elements_value elements to check
|
|
115
|
-
# @return [void]
|
|
116
|
-
def select_from_list_elements(value, elements_value)
|
|
117
|
-
index = get_element_index(value, elements_value)
|
|
118
|
-
elements_value[index].click
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Get index of element by it's text
|
|
122
|
-
# @param [String] text to compare text
|
|
123
|
-
# @param [Array<PageObject::Elements::Element>] list_elements array with
|
|
124
|
-
# PageObject elements to find in
|
|
125
|
-
# @return [Integer, nil] nil if nothing found, index if found
|
|
126
|
-
def get_element_index(text, list_elements)
|
|
127
|
-
list_elements.each_with_index do |current, i|
|
|
128
|
-
return i if get_text(current) == text
|
|
129
|
-
end
|
|
130
|
-
nil
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Get all options for combo box
|
|
134
|
-
# @param [String] xpath_name to find combobox
|
|
135
|
-
# @return [Array<String>] values
|
|
136
|
-
def get_all_combo_box_values(xpath_name)
|
|
137
|
-
@driver.find_element(:xpath, xpath_name).find_elements(tag_name: 'option').map { |el| el.attribute('value') }
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# Scroll list to specific element
|
|
141
|
-
# @param [String] list_xpath how to find this list
|
|
142
|
-
# @param [String] element_xpath to which we should scrolled
|
|
143
|
-
# @return [void]
|
|
144
|
-
def scroll_list_to_element(list_xpath, element_xpath)
|
|
145
|
-
execute_javascript("$(document.evaluate(\"#{list_xpath}\", document, null, XPathResult.ANY_TYPE, null).
|
|
146
|
-
iterateNext()).jScrollPane().data('jsp').scrollToElement(document.evaluate(\"#{element_xpath}\",
|
|
147
|
-
document, null, XPathResult.ANY_TYPE, null).iterateNext());")
|
|
148
|
-
end
|
|
149
|
-
|
|
150
99
|
# Scroll list by pixel count
|
|
151
100
|
# @param [String] list_xpath how to detect this list
|
|
152
101
|
# @param [Integer] pixels how much to scroll
|
|
153
102
|
# @return [void]
|
|
154
103
|
def scroll_list_by_pixels(list_xpath, pixels)
|
|
155
|
-
execute_javascript("$(
|
|
104
|
+
execute_javascript("$(#{dom_element_by_xpath(list_xpath)}).scrollTop(#{pixels})")
|
|
156
105
|
end
|
|
157
106
|
|
|
158
107
|
# Open dropdown selector, like 'Color Selector', which has no element id
|
|
@@ -199,21 +148,10 @@ module OnlyofficeWebdriverWrapper
|
|
|
199
148
|
@driver.find_element(:xpath, xpath_name)
|
|
200
149
|
true
|
|
201
150
|
end
|
|
202
|
-
rescue
|
|
151
|
+
rescue StandardError
|
|
203
152
|
false
|
|
204
153
|
end
|
|
205
154
|
|
|
206
|
-
# Get first visible element from several
|
|
207
|
-
# @param [String] xpath_name to find several objects
|
|
208
|
-
# @return [Object] first visible element
|
|
209
|
-
def get_element_by_display(xpath_name)
|
|
210
|
-
@driver.find_elements(:xpath, xpath_name).each do |element|
|
|
211
|
-
return element if element.displayed?
|
|
212
|
-
end
|
|
213
|
-
rescue Selenium::WebDriver::Error::InvalidSelectorError
|
|
214
|
-
webdriver_error("get_element_by_display(#{xpath_name}): invalid selector: Unable to locate an element with the xpath expression")
|
|
215
|
-
end
|
|
216
|
-
|
|
217
155
|
# Return count of elements (visible and not visible)
|
|
218
156
|
# @param xpath_name [String] xpath to find
|
|
219
157
|
# @param only_visible [True, False] count only visible elements?
|
|
@@ -227,22 +165,6 @@ module OnlyofficeWebdriverWrapper
|
|
|
227
165
|
end
|
|
228
166
|
end
|
|
229
167
|
|
|
230
|
-
# Get array of webdriver object by xpath
|
|
231
|
-
# @param [String] objects_identification object to find
|
|
232
|
-
# @param [Boolean] only_visible return invisible if true
|
|
233
|
-
# @return [Array, Object] list of objects
|
|
234
|
-
def get_elements(objects_identification, only_visible = true)
|
|
235
|
-
return objects_identification if objects_identification.is_a?(Array)
|
|
236
|
-
|
|
237
|
-
elements = @driver.find_elements(:xpath, objects_identification)
|
|
238
|
-
if only_visible
|
|
239
|
-
elements.each do |current|
|
|
240
|
-
elements.delete(current) unless @browser == :firefox || current.displayed?
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
elements
|
|
244
|
-
end
|
|
245
|
-
|
|
246
168
|
# Check if element visible on page
|
|
247
169
|
# It should be part of DOM and should be visible on current visible part of page
|
|
248
170
|
# @param [String] xpath_name element to find
|
|
@@ -256,7 +178,7 @@ module OnlyofficeWebdriverWrapper
|
|
|
256
178
|
|
|
257
179
|
begin
|
|
258
180
|
visible = element.displayed?
|
|
259
|
-
rescue
|
|
181
|
+
rescue StandardError => e
|
|
260
182
|
OnlyofficeLoggerHelper.log("Element #{xpath_name} is not visible because of: #{e.message}")
|
|
261
183
|
visible = false
|
|
262
184
|
end
|
|
@@ -274,54 +196,21 @@ module OnlyofficeWebdriverWrapper
|
|
|
274
196
|
return true if current_element.displayed?
|
|
275
197
|
end
|
|
276
198
|
false
|
|
277
|
-
rescue
|
|
199
|
+
rescue StandardError => e
|
|
278
200
|
webdriver_error("Raise unknown exception: #{e}")
|
|
279
201
|
end
|
|
280
202
|
|
|
281
|
-
# Get text of current element
|
|
282
|
-
# @param [String] xpath_name name of xpath
|
|
283
|
-
# @param [Boolean] wait_until_visible wait until element visible
|
|
284
|
-
# @return [String] result string
|
|
285
|
-
def get_text(xpath_name, wait_until_visible = true)
|
|
286
|
-
wait_until_element_visible(xpath_name) if wait_until_visible
|
|
287
|
-
|
|
288
|
-
element = get_element(xpath_name)
|
|
289
|
-
webdriver_error("get_text(#{xpath_name}, #{wait_until_visible}) not found element by xpath") if element.nil?
|
|
290
|
-
if element.tag_name == 'input' || element.tag_name == 'textarea'
|
|
291
|
-
element.attribute('value')
|
|
292
|
-
else
|
|
293
|
-
element.text
|
|
294
|
-
end
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
# Get text from several elements
|
|
298
|
-
# @param [String] xpath_several_elements to find objects
|
|
299
|
-
# @return [Array<String>] text of those elements
|
|
300
|
-
def get_text_of_several_elements(xpath_several_elements)
|
|
301
|
-
@driver.find_elements(:xpath, xpath_several_elements).filter_map { |element| element.text unless element.text == '' }
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
# Select value of combo box
|
|
305
|
-
# @param [String] xpath_name to find combobox
|
|
306
|
-
# @param [String] select_value to select
|
|
307
|
-
# @param [Symbol] select_by select type
|
|
308
|
-
# @return [void]
|
|
309
|
-
def select_combo_box(xpath_name, select_value, select_by = :value)
|
|
310
|
-
wait_until_element_visible(xpath_name)
|
|
311
|
-
option = Selenium::WebDriver::Support::Select.new(get_element(xpath_name))
|
|
312
|
-
begin
|
|
313
|
-
option.select_by(select_by, select_value)
|
|
314
|
-
rescue StandardError
|
|
315
|
-
option.select_by(:text, select_value)
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
|
|
319
203
|
# Get page source
|
|
320
204
|
# @return [String] all page source
|
|
321
|
-
def
|
|
205
|
+
def page_source
|
|
322
206
|
@driver.execute_script('return document.documentElement.innerHTML;')
|
|
323
207
|
end
|
|
324
208
|
|
|
209
|
+
alias get_page_source page_source
|
|
210
|
+
|
|
211
|
+
extend Gem::Deprecate
|
|
212
|
+
deprecate :get_page_source, 'page_source', 2069, 1
|
|
213
|
+
|
|
325
214
|
# Raise an error, making a screenshot before it
|
|
326
215
|
# @param [String, Object] exception class to raise
|
|
327
216
|
# @param [String] error_message to raise
|
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: 1.
|
|
4
|
+
version: 1.10.1
|
|
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: 2022-
|
|
14
|
+
date: 2022-08-10 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: headless
|
|
@@ -31,16 +31,16 @@ 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: '2'
|
|
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: '2'
|
|
44
44
|
- !ruby/object:Gem::Dependency
|
|
45
45
|
name: onlyoffice_logger_helper
|
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -59,9 +59,9 @@ dependencies:
|
|
|
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: '2'
|
|
65
65
|
- - ">="
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
67
|
version: 0.5.0
|
|
@@ -69,9 +69,9 @@ dependencies:
|
|
|
69
69
|
prerelease: false
|
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
|
-
- - "
|
|
72
|
+
- - "<"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '
|
|
74
|
+
version: '2'
|
|
75
75
|
- - ">="
|
|
76
76
|
- !ruby/object:Gem::Version
|
|
77
77
|
version: 0.5.0
|
|
@@ -275,9 +275,9 @@ files:
|
|
|
275
275
|
- lib/onlyoffice_webdriver_wrapper/helpers/bin/geckodriver
|
|
276
276
|
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper.rb
|
|
277
277
|
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chrome_version_helper.rb
|
|
278
|
-
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_linux_101
|
|
279
278
|
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_linux_102
|
|
280
279
|
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_linux_103
|
|
280
|
+
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_linux_104
|
|
281
281
|
- lib/onlyoffice_webdriver_wrapper/helpers/chrome_helper/chromedriver_bin/chromedriver_mac
|
|
282
282
|
- lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper.rb
|
|
283
283
|
- lib/onlyoffice_webdriver_wrapper/helpers/firefox_helper/save_to_disk_files.list
|
|
@@ -291,6 +291,9 @@ files:
|
|
|
291
291
|
- lib/onlyoffice_webdriver_wrapper/version.rb
|
|
292
292
|
- lib/onlyoffice_webdriver_wrapper/webdriver.rb
|
|
293
293
|
- lib/onlyoffice_webdriver_wrapper/webdriver/click_methods.rb
|
|
294
|
+
- lib/onlyoffice_webdriver_wrapper/webdriver/element_getters.rb
|
|
295
|
+
- lib/onlyoffice_webdriver_wrapper/webdriver/get_text_methods.rb
|
|
296
|
+
- lib/onlyoffice_webdriver_wrapper/webdriver/select_list_methods.rb
|
|
294
297
|
- lib/onlyoffice_webdriver_wrapper/webdriver/wait_until_methods.rb
|
|
295
298
|
- lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_alert_helper.rb
|
|
296
299
|
- lib/onlyoffice_webdriver_wrapper/webdriver/webdriver_attributes_helper.rb
|
|
@@ -332,7 +335,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
332
335
|
- !ruby/object:Gem::Version
|
|
333
336
|
version: '0'
|
|
334
337
|
requirements: []
|
|
335
|
-
rubygems_version: 3.3.
|
|
338
|
+
rubygems_version: 3.3.20
|
|
336
339
|
signing_key:
|
|
337
340
|
specification_version: 4
|
|
338
341
|
summary: ONLYOFFICE Webdriver Wrapper Gem
|