abak-selenium-integration 1.0.5

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bb96bbafc6c6219b38837b3002a6f3d15c2587ff
4
+ data.tar.gz: 080e3797b14994bf5e45075ae6ab6ffd90917f81
5
+ SHA512:
6
+ metadata.gz: 49219d095995cc5f4caa9e0f58441c5072863eb968c2f460418eb0f241839218de1d7ecfc1809bfe271fd8ddede2d835b68928e370b7d67946b88c76bc93c299
7
+ data.tar.gz: b9bf604af409944b356890b28d6a13f080811af3e76350ace32d01e1d04d2891f409a7c249a79fe27a1efe330bd1e1a714c000a1b2e3bfecdfbc8ab396f1a598
@@ -0,0 +1,5 @@
1
+ .idea
2
+ *.log
3
+ *.gem
4
+ *test.rb
5
+ .gitignore.txt
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gem 'page-object'
3
+ gem 'selenium-webdriver'
4
+ gem 'rspec', require: 'spec'
5
+ gem 'ruby-debug-ide'
6
+ gem 'activesupport'
@@ -0,0 +1,69 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ activesupport (5.0.0.1)
5
+ concurrent-ruby (~> 1.0, >= 1.0.2)
6
+ i18n (~> 0.7)
7
+ minitest (~> 5.1)
8
+ tzinfo (~> 1.1)
9
+ childprocess (0.5.9)
10
+ ffi (~> 1.0, >= 1.0.11)
11
+ concurrent-ruby (1.0.2)
12
+ data_magic (0.22)
13
+ faker (>= 1.1.2)
14
+ yml_reader (>= 0.6)
15
+ diff-lcs (1.2.5)
16
+ faker (1.6.6)
17
+ i18n (~> 0.5)
18
+ ffi (1.9.14-x64-mingw32)
19
+ i18n (0.7.0)
20
+ minitest (5.9.1)
21
+ net-http-persistent (2.9.4)
22
+ page-object (1.2.2)
23
+ net-http-persistent (~> 2.9.4)
24
+ page_navigation (>= 0.9)
25
+ selenium-webdriver (>= 2.53.0)
26
+ watir-webdriver (>= 0.6.11, < 0.9.9)
27
+ page_navigation (0.10)
28
+ data_magic (>= 0.22)
29
+ rake (11.3.0)
30
+ rspec (3.5.0)
31
+ rspec-core (~> 3.5.0)
32
+ rspec-expectations (~> 3.5.0)
33
+ rspec-mocks (~> 3.5.0)
34
+ rspec-core (3.5.4)
35
+ rspec-support (~> 3.5.0)
36
+ rspec-expectations (3.5.0)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.5.0)
39
+ rspec-mocks (3.5.0)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.5.0)
42
+ rspec-support (3.5.0)
43
+ ruby-debug-ide (0.6.0)
44
+ rake (>= 0.8.1)
45
+ rubyzip (1.2.0)
46
+ selenium-webdriver (3.0.1)
47
+ childprocess (~> 0.5)
48
+ rubyzip (~> 1.0)
49
+ websocket (~> 1.0)
50
+ thread_safe (0.3.5)
51
+ tzinfo (1.2.2)
52
+ thread_safe (~> 0.1)
53
+ watir-webdriver (0.9.3)
54
+ selenium-webdriver (>= 2.46.2)
55
+ websocket (1.2.3)
56
+ yml_reader (0.7)
57
+
58
+ PLATFORMS
59
+ x64-mingw32
60
+
61
+ DEPENDENCIES
62
+ activesupport
63
+ page-object
64
+ rspec
65
+ ruby-debug-ide
66
+ selenium-webdriver
67
+
68
+ BUNDLED WITH
69
+ 1.13.6
@@ -0,0 +1,19 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ Gem::Specification.new do |spec|
5
+ spec.name = 'abak-selenium-integration'
6
+ spec.version = '1.0.5'
7
+ spec.authors = ["Sergey Avdonin"]
8
+ spec.email = ["sunlf@yandex.ru"]
9
+ spec.summary = %q{Selenium integration gem}
10
+ spec.files = `git ls-files -z`.split("\x0")
11
+ spec.require_paths = ["lib"]
12
+ spec.add_runtime_dependency('page-object')
13
+ spec.add_runtime_dependency('activesupport')
14
+ spec.add_runtime_dependency('rspec')
15
+ spec.add_runtime_dependency('selenium-webdriver')
16
+ spec.description = %q{Integration gem for test automatisation based on page-object}
17
+ spec.homepage = 'http://rubygems.org/gems/abak-selenium-integration'
18
+ spec.license = "MIT"
19
+ end
@@ -0,0 +1,67 @@
1
+ require 'selenium-webdriver'
2
+ require 'yaml'
3
+ require 'page-object/platforms/selenium_webdriver/element'
4
+ require 'page-object'
5
+ require 'active_support'
6
+ require 'page/driver'
7
+ require 'page/gems_overriding'
8
+
9
+ class Page
10
+ include PageObject
11
+ include GemsOverriding
12
+ common_config = YAML.load_file('lib/configs/main_config.yml')
13
+ STAND = common_config['stand'].freeze
14
+ CONFIG = common_config.merge!(YAML.load_file("lib/configs/#{STAND}.yml")).freeze
15
+
16
+ def self.driver
17
+ Driver.instance.browser
18
+ end
19
+
20
+ def initialize(visit = false)
21
+ super(Page.driver, visit)
22
+ end
23
+
24
+ # direct upload files via window upload dialog
25
+ def upload_file(element, file_path)
26
+ element.send_keys(file_path.tr('/', '\\'))
27
+ end
28
+
29
+ # deal with code mirror text areas
30
+ def type_code_mirror(id, text)
31
+ execute_script("$('##{id}').val('#{text}');")
32
+ execute_script("$('##{id}').keyup();")
33
+ end
34
+
35
+ def code_mirror(id)
36
+ execute_script("return $('##{id}').val();")
37
+ end
38
+
39
+ # deal with ck editor text areas
40
+ def type_ck_editor(id, text)
41
+ execute_script("CKEDITOR.instances['#{id}'].insertText('#{text}');")
42
+ end
43
+
44
+ # close all windows except current
45
+ def close_other_windows
46
+ cur_window = browser.window_handle
47
+ browser.window_handles.each do |window|
48
+ next if window.eql?(cur_window)
49
+
50
+ browser.switch_to.window(window)
51
+ browser.close
52
+ end
53
+ browser.switch_to.window(cur_window)
54
+ end
55
+
56
+ # switch to next window and close current
57
+ def switch_next_window
58
+ cur_window = browser.window_handle
59
+ browser.close
60
+ browser.window_handles.each do |window|
61
+ next if window.eql?(cur_window)
62
+
63
+ browser.switch_to.window(window)
64
+ break
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,13 @@
1
+ require 'singleton'
2
+ require 'page'
3
+
4
+ class Driver
5
+ include Singleton
6
+
7
+ def initialize
8
+ @browser = Selenium::WebDriver.for Page::CONFIG['browser'].to_sym
9
+ @browser.manage.window.maximize
10
+ end
11
+
12
+ attr_reader :browser
13
+ end
@@ -0,0 +1,115 @@
1
+
2
+ module GemsOverriding
3
+ # Override selenium gem to make find element more exact. Selenium will try to find
4
+ # element for some time. Override click to ignore wrappers around element.
5
+
6
+ Selenium::WebDriver::Element.class_eval do
7
+ attr_reader :bridge, :id
8
+
9
+ alias_method :old_click, :click
10
+ def click
11
+ bridge.execute_script('arguments[0].click();', self)
12
+ end
13
+
14
+ def send_keys(*args)
15
+ bridge.send_keys_to_element id, Selenium::WebDriver::Keys.encode(args)
16
+ # rescue if cant focus
17
+ rescue Selenium::WebDriver::Error::UnknownError
18
+ bridge.execute_script('arguments[0].value = arguments[1];', self, Selenium::WebDriver::Keys.encode(args))
19
+ end
20
+ end
21
+
22
+ PageObject::Platforms::SeleniumWebDriver::PageObject.class_eval do
23
+ def select_list_value_set(identifier, value)
24
+ process_selenium_call(identifier, Elements::SelectList, 'select') do |how, what|
25
+ select_list = @browser.find_element(how, what)
26
+ select_list.find_elements(tag_name: 'option').find do |option|
27
+ option.text == value
28
+ end.old_click
29
+ end
30
+ end
31
+ end
32
+
33
+ Selenium::WebDriver::SearchContext.module_eval do
34
+ # need for find_element reconstruction
35
+ def extract_args(args)
36
+ case args.size
37
+ when 3
38
+ args
39
+ when 2
40
+ # base timeout for find_element
41
+ args.push(10)
42
+ args
43
+ when 1
44
+ arg = args.first
45
+ unless arg.respond_to?(:shift)
46
+ raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift"
47
+ end
48
+
49
+ # this will be a single-entry hash, so use #shift over #first or #[]
50
+ arr = arg.dup.shift
51
+ unless arr.size == 2
52
+ raise ArgumentError, "expected #{arr.inspect} to have 2 elements"
53
+ end
54
+ arr.push(10)
55
+ arr
56
+ else
57
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 2)"
58
+ end
59
+ end
60
+
61
+ # element search with 10 seconds default
62
+ def find_element(*args)
63
+ sleep 0.4
64
+ how, what, timeout = extract_args(args)
65
+ by = Selenium::WebDriver::SearchContext::FINDERS[how.to_sym]
66
+ wait = Object::Selenium::WebDriver::Wait.new(timeout: timeout, message: 'element not found')
67
+
68
+ wait.until do
69
+ begin
70
+ bridge.find_element_by(by, what.to_s, ref)
71
+ rescue
72
+ false
73
+ end
74
+ end
75
+ rescue Selenium::WebDriver::Error::TimeOutError
76
+ puts "element not found #{how} #{what}" if timeout > 3
77
+ nil
78
+ end
79
+
80
+ def find_elements(*args)
81
+ sleep 0.4
82
+ how, what, timeout = extract_args(args)
83
+ by = Selenium::WebDriver::SearchContext::FINDERS[how.to_sym]
84
+ wait = Object::Selenium::WebDriver::Wait.new(timeout: timeout, message: 'element not found')
85
+
86
+ wait.until do
87
+ begin
88
+ bridge.find_elements_by(by, what.to_s, ref)
89
+ rescue
90
+ false
91
+ end
92
+ end
93
+ rescue Selenium::WebDriver::Error::TimeOutError
94
+ puts "elements not found #{how} #{what}"
95
+ nil
96
+ end
97
+ end
98
+
99
+ # 2 second {name}? waiting
100
+ PageObject::Accessors.module_eval do
101
+ def standard_methods(name, identifier, method, &block)
102
+ define_method("#{name}_element") do
103
+ return call_block(&block) if block_given?
104
+ platform.send(method, identifier.clone)
105
+ end
106
+
107
+ define_method("#{name}?") do
108
+ return call_block(&block).exists? if block_given?
109
+ how, what = PageObject::Elements::Element.selenium_identifier_for(identifier.clone)
110
+ element = browser.find_element(how, what, 3)
111
+ element.try(:displayed?) ? true : false
112
+ end
113
+ end
114
+ end
115
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: abak-selenium-integration
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Sergey Avdonin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: page-object
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: selenium-webdriver
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Integration gem for test automatisation based on page-object
70
+ email:
71
+ - sunlf@yandex.ru
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - abak-selenium-integration.gemspec
80
+ - lib/page.rb
81
+ - lib/page/driver.rb
82
+ - lib/page/gems_overriding.rb
83
+ homepage: http://rubygems.org/gems/abak-selenium-integration
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.6.8
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Selenium integration gem
107
+ test_files: []