onlyoffice_webdriver_wrapper 0.1.2 → 0.2.0

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