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.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +69 -0
- data/abak-selenium-integration.gemspec +19 -0
- data/lib/page.rb +67 -0
- data/lib/page/driver.rb +13 -0
- data/lib/page/gems_overriding.rb +115 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -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
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -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
|
data/lib/page.rb
ADDED
@@ -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
|
data/lib/page/driver.rb
ADDED
@@ -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: []
|