webaccount 0.2.3
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/lib/Thoran/Selenium/WebDriver/Driver/Attempt/attempt.rb +53 -0
- data/lib/Thoran/Selenium/WebDriver/Remote/W3C/Bridge/ConvertLocators/convert_locators.rb +51 -0
- data/lib/Thoran/Selenium/WebDriver/SearchContext/ElementPresentQ/element_presentQ.rb +39 -0
- data/lib/Thoran/Selenium/WebDriver/SearchContext/ElementsPresentQ/elements_presentQ.rb +39 -0
- data/lib/Thoran/Selenium/WebDriver/Setup/setup.rb +68 -0
- data/lib/Thoran/Selenium.rb +11 -0
- data/lib/WebAccount/VERSION.rb +5 -0
- data/lib/WebAccount.rb +118 -0
- data/lib/web_account.rb +6 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7be023b85deb2330712bc3202c2215d20c8024ff074ddcf677f08f7720b8994b
|
4
|
+
data.tar.gz: 543880a40c28d83efdd8839927be8c556e752cd5a4a268466af8b184a8f58a48
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cc5e55208933dd0aadf508cc198047d0d174313faf8b49d87e7119bec56d2a6f8bbea7c543a53ffa5a487b2825cec7be955fe92e64b826ca1e4157be767c93fc
|
7
|
+
data.tar.gz: 7e8eb9a63de804731d720729b6d4cb3a5a2b87b9a59e92b02103358f042d4ae3419265a5f069f07fe6a1810ff1f44cc05d21689c86dffe0cdd3be16cbe1b03c9
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Thoran/Selenium/WebDriver/Attempt/attempt.rb
|
2
|
+
# Thoran::Selenium::WebDriver::Attempt.attempt
|
3
|
+
|
4
|
+
# 20200418
|
5
|
+
# 0.0.0
|
6
|
+
|
7
|
+
# Examples:
|
8
|
+
# 1. driver.attempt do |driver|
|
9
|
+
# driver.get('https://example.com/users/sign_in')
|
10
|
+
# enter_username
|
11
|
+
# enter_password
|
12
|
+
# sign_in
|
13
|
+
# end
|
14
|
+
|
15
|
+
# Changes:
|
16
|
+
# 1. + Thoran namespace.
|
17
|
+
|
18
|
+
module Thoran
|
19
|
+
module Selenium
|
20
|
+
module WebDriver
|
21
|
+
module Driver
|
22
|
+
module Attempt
|
23
|
+
|
24
|
+
def attempt(max_attempts = 3, &block)
|
25
|
+
attempts = 0
|
26
|
+
loop do
|
27
|
+
begin
|
28
|
+
yield
|
29
|
+
break
|
30
|
+
rescue Timeout::Error, Selenium::WebDriver::Error::UnknownError, Selenium::WebDriver::Error::NoSuchElementError => e
|
31
|
+
attempts += 1
|
32
|
+
if attempts >= max_attempts
|
33
|
+
@driver.quit
|
34
|
+
puts "Giving up after #{max_attempts} attempts to #{__method__} because #{e}."
|
35
|
+
exit
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Selenium
|
48
|
+
module WebDriver
|
49
|
+
class Driver
|
50
|
+
include Thoran::Selenium::WebDriver::Driver::Attempt
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Thoran/Selenium/WebDriver/Remote/W3C/BridgeMonkeyPatch/ConvertLocators.convert_locators.rb
|
2
|
+
# Thoran::Selenium::WebDriver::Remote::W3C::BridgeMonkeyPatch::ConvertLocators.convert_locators
|
3
|
+
|
4
|
+
# 20200418
|
5
|
+
# 0.0.0
|
6
|
+
|
7
|
+
# Changes:
|
8
|
+
# 1. + Thoran namespace.
|
9
|
+
|
10
|
+
module Thoran
|
11
|
+
module Selenium
|
12
|
+
module WebDriver
|
13
|
+
module Remote
|
14
|
+
module W3C
|
15
|
+
module Bridge
|
16
|
+
module ConvertLocators
|
17
|
+
|
18
|
+
def convert_locators(how, what)
|
19
|
+
case how.to_s
|
20
|
+
when 'class name'
|
21
|
+
how = 'css selector'
|
22
|
+
what = ".#{escape_css(what)}"
|
23
|
+
when 'id'
|
24
|
+
how = 'css selector'
|
25
|
+
what = "##{escape_css(what)}"
|
26
|
+
when 'name'
|
27
|
+
how = 'css selector'
|
28
|
+
what = "*[name='#{escape_css(what)}']"
|
29
|
+
when 'tag name'
|
30
|
+
how = 'css selector'
|
31
|
+
end
|
32
|
+
[how, what]
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Selenium
|
44
|
+
module WebDriver
|
45
|
+
module Remote
|
46
|
+
module W3C
|
47
|
+
Bridge.prepend(Thoran::Selenium::WebDriver::Remote::W3C::Bridge::ConvertLocators)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Thoran/Selenium/WebDriver/SearchContext/ElementPresentQ/element_presentQ.rb
|
2
|
+
# Thoran::Selenium::WebDriver::SearchContext::ElementPresentQ.element_present?
|
3
|
+
|
4
|
+
# 20200418
|
5
|
+
# 0.0.0
|
6
|
+
|
7
|
+
# Examples:
|
8
|
+
# 1. driver.element_present?(:xpath, '//a[@id="submit"]')
|
9
|
+
# 2. driver.element_present?(:id, @logout_button_id)
|
10
|
+
|
11
|
+
# Changes:
|
12
|
+
# 1. + Thoran namespace.
|
13
|
+
|
14
|
+
module Thoran
|
15
|
+
module Selenium
|
16
|
+
module WebDriver
|
17
|
+
module SearchContext
|
18
|
+
module ElementPresentQ
|
19
|
+
|
20
|
+
def element_present?(selector_type, selector)
|
21
|
+
bridge.find_element_by(selector_type, selector)
|
22
|
+
true
|
23
|
+
rescue ::Selenium::WebDriver::Error::NoSuchElementError
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module Selenium
|
34
|
+
module WebDriver
|
35
|
+
class Driver
|
36
|
+
include Thoran::Selenium::WebDriver::SearchContext::ElementPresentQ
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Thoran/Selenium/WebDriver/SearchContext/ElementsPresentQ/elements_presentQ.rb
|
2
|
+
# Thoran::Selenium::WebDriver::SearchContext::ElementsPresentQ.elements_present?
|
3
|
+
|
4
|
+
# 20200418
|
5
|
+
# 0.0.0
|
6
|
+
|
7
|
+
# Examples:
|
8
|
+
# 1. driver.elements_present?(:xpath, '//li[@class="item"]')
|
9
|
+
# 2. driver.elements_present?(:css, 'li.item')
|
10
|
+
|
11
|
+
# Changes:
|
12
|
+
# 1. + Thoran namespace.
|
13
|
+
|
14
|
+
module Thoran
|
15
|
+
module Selenium
|
16
|
+
module WebDriver
|
17
|
+
module SearchContext
|
18
|
+
module ElementsPresentQ
|
19
|
+
|
20
|
+
def elements_present?(selector_type, selector)
|
21
|
+
bridge.find_elements_by(selector_type, selector)
|
22
|
+
true
|
23
|
+
rescue ::Selenium::WebDriver::Error::NoSuchElementError
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module Selenium
|
34
|
+
module WebDriver
|
35
|
+
class Driver
|
36
|
+
include Thoran::Selenium::WebDriver::SearchContext::ElementsPresentQ
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Thoran/Selenium/WebDriver/Setup/setup.rb
|
2
|
+
# Thoran::Selenium::WebDriver.setup
|
3
|
+
|
4
|
+
# 20200418
|
5
|
+
# 0.0.0
|
6
|
+
|
7
|
+
# Usage:
|
8
|
+
# 1. Binary is in the path:
|
9
|
+
# Selenium::WebDriver.setup('chrome') # String - lowercase
|
10
|
+
# Selenium::WebDriver.setup('Chrome') # String - capitalised
|
11
|
+
# Selenium::WebDriver.setup(:chrome) # Symbol - lowercase
|
12
|
+
# Selenium::WebDriver.setup(:Chrome) # Symbol - capitalised
|
13
|
+
# 2. Binary is not in the path:
|
14
|
+
# Selenium::WebDriver.setup('~/Applications/Firefox.app/Contents/MacOS/firefox-bin')
|
15
|
+
|
16
|
+
# Changes:
|
17
|
+
# 1. + Thoran namespace.
|
18
|
+
|
19
|
+
require 'selenium-webdriver'
|
20
|
+
require 'Thoran/String/ToConst/to_const'
|
21
|
+
|
22
|
+
module Thoran
|
23
|
+
module Selenium
|
24
|
+
module WebDriver
|
25
|
+
module Setup
|
26
|
+
|
27
|
+
module_function
|
28
|
+
|
29
|
+
def setup(path_or_browser)
|
30
|
+
if File.exist?(File.expand_path(path_or_browser.to_s))
|
31
|
+
path = path_or_browser
|
32
|
+
Selenium::WebDriver.at(path)
|
33
|
+
Selenium::WebDriver.for(selenium_browser(path))
|
34
|
+
else
|
35
|
+
browser = path_or_browser.to_sym.downcase
|
36
|
+
Selenium::WebDriver.for(browser)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def at(path)
|
43
|
+
selenium_binary_constant(path).path = File.expand_path(path)
|
44
|
+
end
|
45
|
+
|
46
|
+
def selenium_browser(path)
|
47
|
+
case path
|
48
|
+
when /chrome/i; :chrome
|
49
|
+
when /firefox/i; :firefox
|
50
|
+
when /safari/i; :safari
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# This method seem to be necessary only to Firefox, since there are no equivalent constants for Safari or Chrome.
|
55
|
+
def selenium_binary_constant(path)
|
56
|
+
"Selenium::WebDriver::#{selenium_browser(path).to_s.capitalize}::Binary".to_const
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module Selenium
|
65
|
+
module WebDriver
|
66
|
+
include Thoran::Selenium::WebDriver::Setup
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Thoran/Selenium.rb
|
2
|
+
# Thoran::Selenium
|
3
|
+
|
4
|
+
# 20200418
|
5
|
+
# 0.0.0
|
6
|
+
|
7
|
+
require_relative './Selenium/WebDriver/Driver/Attempt/attempt'
|
8
|
+
require_relative './Selenium/WebDriver/Remote/W3C/Bridge/ConvertLocators/convert_locators'
|
9
|
+
require_relative './Selenium/WebDriver/SearchContext/ElementPresentQ/element_presentQ'
|
10
|
+
require_relative './Selenium/WebDriver/SearchContext/ElementsPresentQ/elements_presentQ'
|
11
|
+
require_relative './Selenium/WebDriver/Setup/setup'
|
data/lib/WebAccount.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# WebAccount.rb
|
2
|
+
# WebAccount
|
3
|
+
|
4
|
+
require 'selenium-webdriver'
|
5
|
+
require 'Thoran/Selenium'
|
6
|
+
|
7
|
+
class WebAccount
|
8
|
+
|
9
|
+
attr_accessor :username
|
10
|
+
attr_accessor :password
|
11
|
+
attr_writer :user_agent_alias
|
12
|
+
|
13
|
+
def initialize(
|
14
|
+
username: nil, password: nil,
|
15
|
+
login_page_url: nil,
|
16
|
+
login_page_username_field_id: nil, login_page_password_field_id: nil,
|
17
|
+
login_page_submit_button_id: nil,
|
18
|
+
logout_button_id: nil,
|
19
|
+
logged_out_xpath: nil
|
20
|
+
)
|
21
|
+
@username, @password = username, password
|
22
|
+
@login_page_url = login_page_url
|
23
|
+
@login_page_username_field_id, @login_page_password_field_id = login_page_username_field_id, login_page_password_field_id
|
24
|
+
@login_page_submit_button_id = login_page_submit_button_id
|
25
|
+
@logout_button_id = logout_button_id
|
26
|
+
@logged_out_xpath = logged_out_xpath
|
27
|
+
end
|
28
|
+
|
29
|
+
def login(username: nil, password: nil)
|
30
|
+
@logged_in = false
|
31
|
+
username ||= self.username
|
32
|
+
password ||= self.password
|
33
|
+
attempts = 0
|
34
|
+
driver.attempt do
|
35
|
+
get_login_page
|
36
|
+
enter_username(username)
|
37
|
+
enter_password(password)
|
38
|
+
login_page_submit_button.click
|
39
|
+
end
|
40
|
+
@logged_in = driver_wait.until do
|
41
|
+
driver.element_present?(:id, @logout_button_id)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
alias_method :logon, :login
|
45
|
+
|
46
|
+
def logout
|
47
|
+
driver.find_element(:id, @logout_button_id).click
|
48
|
+
if logged_out?
|
49
|
+
@logged_in = false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
alias_method :logoff, :logout
|
53
|
+
|
54
|
+
def shutdown
|
55
|
+
logout if logged_in?
|
56
|
+
driver.quit
|
57
|
+
end
|
58
|
+
|
59
|
+
# predicate methods
|
60
|
+
|
61
|
+
def logged_in?
|
62
|
+
@logged_in
|
63
|
+
end
|
64
|
+
|
65
|
+
def logged_out?
|
66
|
+
driver_wait.until do
|
67
|
+
driver.element_present?(:xpath, @logged_out_xpath)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def user_agent_alias
|
74
|
+
@user_agent_alias ||= @user_agent_alias || :chrome
|
75
|
+
end
|
76
|
+
|
77
|
+
def driver
|
78
|
+
@driver ||= (
|
79
|
+
driver = Selenium::WebDriver.setup(user_agent_alias)
|
80
|
+
driver.manage.timeouts.implicit_wait = 5
|
81
|
+
driver
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
def driver_wait
|
86
|
+
@driver_wait ||= Selenium::WebDriver::Wait.new(timeout: 180)
|
87
|
+
end
|
88
|
+
|
89
|
+
# logging in
|
90
|
+
|
91
|
+
def login_page
|
92
|
+
driver.get(@login_page_url)
|
93
|
+
end
|
94
|
+
alias_method :get_login_page, :login_page
|
95
|
+
|
96
|
+
def enter_username(username = nil)
|
97
|
+
username ||= self.username
|
98
|
+
username_field.send_keys(username)
|
99
|
+
end
|
100
|
+
|
101
|
+
def username_field
|
102
|
+
driver.find_element(:id, @login_page_username_field_id)
|
103
|
+
end
|
104
|
+
|
105
|
+
def enter_password(password = nil)
|
106
|
+
password ||= self.password
|
107
|
+
password_field.send_keys(password)
|
108
|
+
end
|
109
|
+
|
110
|
+
def password_field
|
111
|
+
driver.find_element(:id, @login_page_password_field_id)
|
112
|
+
end
|
113
|
+
|
114
|
+
def login_page_submit_button
|
115
|
+
driver.find_element(:id, @login_page_submit_button_id)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
data/lib/web_account.rb
ADDED
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: webaccount
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- thoran
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-04-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: selenium-webdriver
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Easily log into web accounts but just supplying a username and password,
|
28
|
+
the URL of the login page, and a few page ids to a subclass of WebAccount.
|
29
|
+
email: code@thoran.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/Thoran/Selenium.rb
|
35
|
+
- lib/Thoran/Selenium/WebDriver/Driver/Attempt/attempt.rb
|
36
|
+
- lib/Thoran/Selenium/WebDriver/Remote/W3C/Bridge/ConvertLocators/convert_locators.rb
|
37
|
+
- lib/Thoran/Selenium/WebDriver/SearchContext/ElementPresentQ/element_presentQ.rb
|
38
|
+
- lib/Thoran/Selenium/WebDriver/SearchContext/ElementsPresentQ/elements_presentQ.rb
|
39
|
+
- lib/Thoran/Selenium/WebDriver/Setup/setup.rb
|
40
|
+
- lib/WebAccount.rb
|
41
|
+
- lib/WebAccount/VERSION.rb
|
42
|
+
- lib/web_account.rb
|
43
|
+
homepage: http://github.com/thoran/WebAccount
|
44
|
+
licenses:
|
45
|
+
- Ruby
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '2.5'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubygems_version: 3.1.2
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: "# Description: An abstract superclass for navigating a web-based user account
|
66
|
+
via Selenium WebDriver."
|
67
|
+
test_files: []
|