webdriver 0.4.0 → 0.6.4

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: 616f8d5d0956947bdd8d2b2b7cfe8850dd90d9e2ce80a7b4349b7bfa81519a47
4
- data.tar.gz: 4ebd8841d40a95b9d1ab31f6d1459e55d1914d7acf0c61b8e231547418ea3702
3
+ metadata.gz: b9d1de554c15665df74da24e943ca9e50d9db27622723ab7e8229464ca19ef5c
4
+ data.tar.gz: c753336a3fe63b440f34a8a7d259bb0a28da054050c084647a27e28daf691a0e
5
5
  SHA512:
6
- metadata.gz: 9c0ae6b350ef5dded123079161e6d46b0ac361e02bdbd4fa84b06e2a27d49c2cd7d476e832f00448807242757f950b47a2fff6b25ad2c28b9b2d2cfcc2e476e5
7
- data.tar.gz: 6f165b9dc44e03067a76952d9651c0290ac795e4c4f82da81d9365037d315d96d96f9e4b2ffffb5a1725d6fdd4c5e3d8e4822c3d12d65d4b5862de7111c2606f
6
+ metadata.gz: b261d00f5c46ca37743120b5ed1689aaaebb786c67a0568442af7fca4094b455ddd4721542948e36a328b85ce13bc9c1bf807f2953c277169115c42901f5084c
7
+ data.tar.gz: 456140e014ff199b04d6bbd7f55a8932f47c1f6a2bc60376a4f3e140b450b9e871eed3234aefacbba5364e73828f53639025e59ec815315de3b581ff5eb47c74
@@ -1 +1 @@
1
- 2.6.3
1
+ 2.6.5
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- webdriver (0.4.0)
4
+ webdriver (0.6.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/e2e/all.rb CHANGED
@@ -7,4 +7,5 @@ require_relative "sessions"
7
7
  require_relative "session"
8
8
  require_relative "windows"
9
9
  require_relative "window"
10
+ require_relative "element"
10
11
  puts "OK"
@@ -0,0 +1,9 @@
1
+ session = $client.session!
2
+
3
+ e = session.element "css selector", "html"
4
+ raise "text" unless e.text == ""
5
+ raise "property" unless e.property("innerHTML") == "<head></head><body></body>"
6
+ raise "attribute" unless e.attribute("innerHTML") == "<head></head><body></body>"
7
+ raise "tag" unless e.tag == "html"
8
+
9
+ raise "child" unless e.element("css selector", "body").tag == "body"
@@ -1,5 +1,5 @@
1
1
  require_relative "../lib/webdriver"
2
- require "pry"
2
+
3
3
  capabilities = {
4
4
  chromeOptions: {
5
5
  args: [
@@ -13,5 +13,4 @@ wd = Webdriver::Client.new "http://localhost:9515/wd/hub", capabilities
13
13
  s = wd.session!
14
14
  w = s.windows.first
15
15
 
16
- binding.pry
17
16
  s.delete!
@@ -0,0 +1,13 @@
1
+ require_relative "../lib/webdriver"
2
+
3
+ s = (Webdriver::Client.new "http://localhost:9515/").session!
4
+
5
+ s.url! "https://example.com"
6
+
7
+ 3.times do |i|
8
+ all_a_els = s.elements "css selector", "a"
9
+ all_a_els&.first.click!
10
+ sleep 1
11
+ end
12
+
13
+ s.delete!
@@ -0,0 +1,12 @@
1
+ require_relative "../lib/webdriver"
2
+
3
+ s = (Webdriver::Client.new "http://localhost:9515/").session!
4
+
5
+ s.url! "https://example.com"
6
+ html_el = s.element "css selector", "html"
7
+
8
+ puts html_el.text
9
+ puts "-- 8< -----------------------"
10
+ puts html_el.property "innerHTML"
11
+
12
+ s.delete!
@@ -16,4 +16,6 @@ require_relative "webdriver/prefix_connection"
16
16
 
17
17
  require_relative "webdriver/window"
18
18
  require_relative "webdriver/session"
19
+ require_relative "webdriver/element"
19
20
  require_relative "webdriver/client"
21
+ require_relative "webdriver/cookie"
@@ -1,21 +1,23 @@
1
1
  module Webdriver
2
2
  class Connection
3
- def initialize(endpoint)
3
+ def initialize endpoint
4
4
  uri = URI(endpoint)
5
5
  @http = Net::HTTP.new uri.hostname, uri.port
6
6
  end
7
7
 
8
- def get(path, headers={})
8
+ def get path, headers={}
9
9
  call :get, path, headers
10
10
  end
11
- def post(path, headers={}, body=nil)
11
+
12
+ def post path, headers={}, body=nil
12
13
  call :post, path, headers, body
13
14
  end
14
- def post(path, headers={}, body=nil)
15
+
16
+ def post path, headers={}, body=nil
15
17
  call :post, path, headers, body
16
18
  end
17
19
 
18
- def call(method, path, headers={}, body={})
20
+ def call method, path, headers={}, body={}
19
21
  path = "/#{path}"
20
22
  body_json = body.to_json if body
21
23
  Webdriver.debug [method, path, headers, body_json]
@@ -45,12 +47,16 @@ module Webdriver
45
47
  else # everything else works like this
46
48
  value
47
49
  end
50
+ when 1..nil
51
+ # 10: stale element reference: element is not attached to the page document
52
+ # 11: element not interactable
53
+ error_message = value.dig("message")
54
+ raise "#{status}: #{error_message}"
48
55
  else
49
56
  if method == :get && path == "/status"
50
57
  value
51
58
  else
52
- pp [status, response_body]
53
- raise "err"
59
+ raise [:unknown, response_body]
54
60
  end
55
61
  end
56
62
  end
@@ -0,0 +1,50 @@
1
+ module Webdriver
2
+ class Cookie
3
+ attr_reader :name
4
+
5
+ def initialize(name, connection)
6
+ @name = name
7
+ @session_connection = connection
8
+ @connection = Webdriver::PrefixConnection.new "cookie/#{@name}", connection
9
+ end
10
+
11
+ def delete!
12
+ @connection.delete
13
+ self
14
+ end
15
+
16
+ def domain
17
+ __refresh["domain"]
18
+ end
19
+
20
+ def expiry
21
+ __refresh["expiry"]
22
+ end
23
+
24
+ def http_only
25
+ __refresh["httpOnly"]
26
+ end
27
+
28
+ def path
29
+ __refresh["path"]
30
+ end
31
+
32
+ def same_site
33
+ __refresh["sameSite"]
34
+ end
35
+
36
+ def secure
37
+ __refresh["secure"]
38
+ end
39
+
40
+ def value
41
+ __refresh["value"]
42
+ end
43
+
44
+ private
45
+
46
+ def __refresh
47
+ @connection.get
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,87 @@
1
+ module Webdriver
2
+ class Element
3
+ attr_reader :id
4
+
5
+ def initialize(id, connection)
6
+ @id = id
7
+
8
+ @session_connection = connection
9
+ @connection = Webdriver::PrefixConnection.new "element/#{@id}", connection
10
+ end
11
+
12
+ def screenshot
13
+ @connection.get "screenshot"
14
+ end
15
+
16
+ # checkbox
17
+ def selected?
18
+ @connection.get "selected"
19
+ end
20
+
21
+ # form control enabled
22
+ def enabled?
23
+ @connection.get "enabled"
24
+ end
25
+
26
+ def clear!
27
+ @connection.post "clear"
28
+ click!
29
+ self
30
+ end
31
+
32
+ def value! value
33
+ value_string = value.to_s
34
+ if value_string == ""
35
+ clear!
36
+ else
37
+ @connection.post "value", {}, {
38
+ value: [value_string]
39
+ }
40
+ end
41
+ end
42
+
43
+ def text
44
+ @connection.get "text"
45
+ end
46
+
47
+ def rect
48
+ @connection.get "rect"
49
+ end
50
+
51
+ def tag
52
+ @connection.get "name"
53
+ end
54
+
55
+ def css name
56
+ @connection.get File.join("css", name)
57
+ end
58
+
59
+ def property name
60
+ @connection.get File.join("property", name)
61
+ end
62
+
63
+ def attribute name
64
+ @connection.get File.join("attribute", name)
65
+ end
66
+
67
+ def click!
68
+ @connection.post "click"
69
+ end
70
+
71
+ def element using, value
72
+ el = @connection.post "element", {}, {
73
+ using: using,
74
+ value: value
75
+ }
76
+ Webdriver::Element.new el["ELEMENT"], @session_connection
77
+ end
78
+
79
+ def elements using, value
80
+ resp = @connection.post "elements", {}, {
81
+ using: using,
82
+ value: value
83
+ }
84
+ resp.map { |el| Webdriver::Element.new el["ELEMENT"], @session_connection }
85
+ end
86
+ end
87
+ end
@@ -5,17 +5,19 @@ module Webdriver
5
5
  @connection = connection
6
6
  end
7
7
 
8
- def get(path, headers={})
8
+ def get path=nil, headers={}
9
9
  call :get, path, headers
10
10
  end
11
- def post(path=nil, headers={}, body=nil)
11
+
12
+ def post path=nil, headers={}, body=nil
12
13
  call :post, path, headers, body
13
14
  end
14
- def delete(path=nil, headers={}, body=nil)
15
+
16
+ def delete path=nil, headers={}, body=nil
15
17
  call :delete, path, headers, body
16
18
  end
17
19
 
18
- def call(method, path=nil, headers={}, body=nil)
20
+ def call method, path=nil, headers={}, body=nil
19
21
  prefixed_path = if path
20
22
  "#{@prefix}/#{path}"
21
23
  else
@@ -9,6 +9,7 @@ module Webdriver
9
9
 
10
10
  def delete!
11
11
  @connection.delete
12
+ self
12
13
  end
13
14
 
14
15
  def windows
@@ -16,10 +17,50 @@ module Webdriver
16
17
  value.map { |id| Webdriver::Window.new id, @connection }
17
18
  end
18
19
 
20
+ # not implemented in chromedriver
21
+ # def source
22
+ # @connection.post "source"
23
+ # end
24
+
25
+ def dismiss_alert!
26
+ @connection.post "alert/dismiss"
27
+ self
28
+ end
29
+
30
+ def accept_alert!
31
+ @connection.post "alert/accept"
32
+ self
33
+ end
34
+
35
+ def alert_text
36
+ @connection.get "alert/text"
37
+ end
38
+
39
+ # TODO: Does not work with prompt
40
+ # def alert_text! text
41
+ # @connection.post "alert/text", {}, {
42
+ # text: text
43
+ # }
44
+ # end
45
+
46
+ # iframe id
47
+ def frame! name
48
+ @connection.post "frame", {}, {
49
+ id: name
50
+ }
51
+ self
52
+ end
53
+
54
+ def parent_frame!
55
+ @connection.post "frame/parent", {}, {}
56
+ self
57
+ end
58
+
19
59
  def url! url
20
60
  @connection.post "url", {}, {
21
61
  url: url
22
62
  }
63
+ self
23
64
  end
24
65
 
25
66
  def url
@@ -28,29 +69,115 @@ module Webdriver
28
69
 
29
70
  def back!
30
71
  @connection.post "back"
72
+ self
31
73
  end
32
74
 
33
75
  def forward!
34
76
  @connection.post "forward"
77
+ self
35
78
  end
36
79
 
37
80
  def refresh!
38
81
  @connection.post "refresh"
82
+ self
39
83
  end
40
84
 
41
85
  def title
42
86
  @connection.get "title"
43
87
  end
44
88
 
89
+ def cookies
90
+ resp = @connection.get "cookie"
91
+
92
+ resp.map { |el| Webdriver::Cookie.new el["name"], @connection }
93
+ end
94
+
95
+ def cookies_delete!
96
+ @connection.delete "cookie"
97
+ self
98
+ end
99
+
100
+ def cookie name
101
+ resp = @connection.get File.join("cookie",name)
102
+ Webdriver::Element.new resp["name"], @connection
103
+ end
104
+
105
+ #TODO: ??
106
+ # def cookie_add(name, value)
107
+ # @connection.post "cookie", {}, {
108
+ # name: name,
109
+ # args: {
110
+ # cookie: value,
111
+ # },
112
+ # }
113
+ # end
114
+
115
+ # TODO: hangs
116
+ # def execute_async! script, args=[]
117
+ # @connection.post "execute/async", {}, {
118
+ # script: script,
119
+ # args: args
120
+ # }
121
+ # end
122
+
45
123
  def execute_sync! script, args=[]
46
- @connection.post "execute/sync", {}, {
124
+ resp = @connection.post "execute/sync", {}, {
47
125
  script: script,
48
126
  args: args
49
127
  }
128
+
129
+ value = if resp.is_a?(Hash) && resp["ELEMENT"]
130
+ begin
131
+ el = Webdriver::Element.new resp["ELEMENT"], @connection
132
+ el.tag
133
+ el
134
+ rescue
135
+ resp
136
+ end
137
+ elsif resp.is_a?(Array)
138
+ begin
139
+ resp.map do |r|
140
+ el = Webdriver::Element.new r["ELEMENT"], @connection
141
+ el.tag
142
+ el
143
+ end
144
+ rescue
145
+ resp
146
+ end
147
+ else
148
+ resp
149
+ end
50
150
  end
51
151
 
152
+ # not implemented in chromedriver
153
+ # def print!
154
+ # @connection.post "print"
155
+ # end
156
+
52
157
  def screenshot
53
158
  @connection.get "screenshot"
54
159
  end
160
+
161
+ # when moving with tab, or clicked
162
+ def active_element
163
+ el = @connection.get "element/active"
164
+ Webdriver::Element.new el["ELEMENT"], @connection
165
+ end
166
+
167
+ def element using, value
168
+ el = @connection.post "element", {}, {
169
+ using: using,
170
+ value: value
171
+ }
172
+ Webdriver::Element.new el["ELEMENT"], @connection
173
+ end
174
+
175
+ def elements using, value
176
+ resp = @connection.post "elements", {}, {
177
+ using: using,
178
+ value: value
179
+ }
180
+ resp.map { |el| Webdriver::Element.new el["ELEMENT"], @connection }
181
+ end
55
182
  end
56
183
  end
@@ -1,3 +1,3 @@
1
1
  module Webdriver
2
- VERSION = "0.4.0"
2
+ VERSION = "0.6.4"
3
3
  end
@@ -23,7 +23,7 @@ module Webdriver
23
23
  x: x,
24
24
  y: y
25
25
  })
26
- rect
26
+ self
27
27
  end
28
28
 
29
29
  def rect
@@ -32,10 +32,12 @@ module Webdriver
32
32
 
33
33
  def fullscreen!
34
34
  @connection.post "fullscreen"
35
+ self
35
36
  end
36
37
 
37
38
  def close!
38
39
  @connection.delete
40
+ self
39
41
  end
40
42
  end
41
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matti Paksula
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-28 00:00:00.000000000 Z
11
+ date: 2020-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -143,15 +143,20 @@ files:
143
143
  - bin/console
144
144
  - bin/setup
145
145
  - e2e/all.rb
146
+ - e2e/element.rb
146
147
  - e2e/session.rb
147
148
  - e2e/sessions.rb
148
149
  - e2e/status.rb
149
150
  - e2e/window.rb
150
151
  - e2e/windows.rb
151
152
  - examples/args.rb
153
+ - examples/find_and_click.rb
154
+ - examples/text_and_html.rb
152
155
  - lib/webdriver.rb
153
156
  - lib/webdriver/client.rb
154
157
  - lib/webdriver/connection.rb
158
+ - lib/webdriver/cookie.rb
159
+ - lib/webdriver/element.rb
155
160
  - lib/webdriver/prefix_connection.rb
156
161
  - lib/webdriver/session.rb
157
162
  - lib/webdriver/version.rb
@@ -176,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
181
  - !ruby/object:Gem::Version
177
182
  version: '0'
178
183
  requirements: []
179
- rubygems_version: 3.0.4
184
+ rubygems_version: 3.0.6
180
185
  signing_key:
181
186
  specification_version: 4
182
187
  summary: webdriver