async-webdriver 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/async/webdriver/bridge/pool.rb +19 -1
- data/lib/async/webdriver/element.rb +7 -7
- data/lib/async/webdriver/scope/document.rb +4 -20
- data/lib/async/webdriver/session.rb +29 -0
- data/lib/async/webdriver/version.rb +1 -1
- data/readme.md +1 -1
- data.tar.gz.sig +0 -0
- metadata +1 -1
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a6324ffc2dfcde7982396b2dbda22df843948de94ba4e61811a777b64156a05
|
4
|
+
data.tar.gz: 25cc350a2093f0bc1651500139bb654c5ed0af2f8ac553ecbc5d3544691e9999
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a39e3446f54eeb665252c3cb7f76bcdf5b6dc8ba0fcc8e67f0570d5e93f783e77e833cb499211562e26f922fbe14f507a6e7645cbe45c5f7c9af921e3c4f9b7
|
7
|
+
data.tar.gz: 0205a411504dac570476a891f849542d337f9cf1d44b4462811e3bfdc006b24f3eddd338c27822f7119a9467676cad6f17efdb30c57ddd14ceaf4e15537066d6
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -91,7 +91,25 @@ module Async
|
|
91
91
|
|
92
92
|
reply = @sessions.pop
|
93
93
|
|
94
|
-
Session.open(@bridge.endpoint, reply["sessionId"], reply["capabilities"]
|
94
|
+
session = Session.open(@bridge.endpoint, reply["sessionId"], reply["capabilities"])
|
95
|
+
|
96
|
+
return session unless block_given?
|
97
|
+
|
98
|
+
begin
|
99
|
+
yield session
|
100
|
+
|
101
|
+
# Try to reuse the session for extreme performance:
|
102
|
+
reuse(session)
|
103
|
+
session = nil
|
104
|
+
ensure
|
105
|
+
session&.close
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def reuse(session)
|
110
|
+
session.reset!
|
111
|
+
|
112
|
+
@sessions << {"sessionId" => session.id, "capabilities" => session.capabilities}
|
95
113
|
end
|
96
114
|
end
|
97
115
|
end
|
@@ -114,13 +114,6 @@ module Async
|
|
114
114
|
self
|
115
115
|
end
|
116
116
|
|
117
|
-
include Scope::Alerts
|
118
|
-
include Scope::Cookies
|
119
|
-
include Scope::Elements
|
120
|
-
include Scope::Fields
|
121
|
-
include Scope::Printing
|
122
|
-
include Scope::ScreenCapture
|
123
|
-
|
124
117
|
# Execute a script in the context of the element. `this` will be the element.
|
125
118
|
# @parameter script [String] The script to execute.
|
126
119
|
# @parameter arguments [Array] The arguments to pass to the script.
|
@@ -135,6 +128,13 @@ module Async
|
|
135
128
|
@session.execute_async("return (function(){#{script}}).call(...arguments)", self, *arguments)
|
136
129
|
end
|
137
130
|
|
131
|
+
include Scope::Alerts
|
132
|
+
include Scope::Cookies
|
133
|
+
include Scope::Elements
|
134
|
+
include Scope::Fields
|
135
|
+
include Scope::Printing
|
136
|
+
include Scope::ScreenCapture
|
137
|
+
|
138
138
|
# Get the value of an attribute.
|
139
139
|
#
|
140
140
|
# Given an attribute name, e.g. `href`, this method will return the value of the attribute, as if you had executed the following JavaScript:
|
@@ -10,30 +10,14 @@ module Async
|
|
10
10
|
module Document
|
11
11
|
# Get the current document title.
|
12
12
|
# @returns [String] The document title.
|
13
|
-
def
|
14
|
-
get("title")
|
13
|
+
def document_title
|
14
|
+
session.get("title")
|
15
15
|
end
|
16
16
|
|
17
17
|
# Get the current document source.
|
18
18
|
# @returns [String] The document source.
|
19
|
-
def
|
20
|
-
get("source")
|
21
|
-
end
|
22
|
-
|
23
|
-
# Execute a script in the current document.
|
24
|
-
# @parameter script [String] The script to execute.
|
25
|
-
# @parameter arguments [Array] The arguments to pass to the script.
|
26
|
-
# @returns [Object] The result of the script.
|
27
|
-
def execute(script, *arguments)
|
28
|
-
post("execute/sync", {script: script, args: arguments})
|
29
|
-
end
|
30
|
-
|
31
|
-
# Execute a script in the current document asynchronously.
|
32
|
-
# @parameter script [String] The script to execute.
|
33
|
-
# @parameter arguments [Array] The arguments to pass to the script.
|
34
|
-
# @returns [Object] The result of the script.
|
35
|
-
def execute_async(script, *arguments)
|
36
|
-
post("execute/async", {script: script, args: arguments})
|
19
|
+
def document_source
|
20
|
+
session.get("source")
|
37
21
|
end
|
38
22
|
end
|
39
23
|
end
|
@@ -97,6 +97,22 @@ module Async
|
|
97
97
|
self
|
98
98
|
end
|
99
99
|
|
100
|
+
# Execute a script in the current document.
|
101
|
+
# @parameter script [String] The script to execute.
|
102
|
+
# @parameter arguments [Array] The arguments to pass to the script.
|
103
|
+
# @returns [Object] The result of the script.
|
104
|
+
def execute(script, *arguments)
|
105
|
+
post("execute/sync", {script: script, args: arguments})
|
106
|
+
end
|
107
|
+
|
108
|
+
# Execute a script in the current document asynchronously.
|
109
|
+
# @parameter script [String] The script to execute.
|
110
|
+
# @parameter arguments [Array] The arguments to pass to the script.
|
111
|
+
# @returns [Object] The result of the script.
|
112
|
+
def execute_async(script, *arguments)
|
113
|
+
post("execute/async", {script: script, args: arguments})
|
114
|
+
end
|
115
|
+
|
100
116
|
include Scope::Alerts
|
101
117
|
include Scope::Cookies
|
102
118
|
include Scope::Document
|
@@ -107,6 +123,19 @@ module Async
|
|
107
123
|
include Scope::Printing
|
108
124
|
include Scope::ScreenCapture
|
109
125
|
include Scope::Timeouts
|
126
|
+
|
127
|
+
# Reset the session to a clean state.
|
128
|
+
def reset!
|
129
|
+
# Go to a blank page (in theory this should also invalidate any Element instances):
|
130
|
+
self.navigate_to("about:blank")
|
131
|
+
|
132
|
+
# Clear cookies and local storage:
|
133
|
+
self.delete_all_cookies
|
134
|
+
self.execute("localStorage.clear();")
|
135
|
+
|
136
|
+
# Detach the session instance from the underlying HTTP client:
|
137
|
+
@delegate = nil
|
138
|
+
end
|
110
139
|
end
|
111
140
|
end
|
112
141
|
end
|
data/readme.md
CHANGED
@@ -8,7 +8,7 @@ Provides a client implementation of the W3C WebDriver specification with support
|
|
8
8
|
|
9
9
|
In the past, I've used [selenium-webdriver](https://github.com/SeleniumHQ/selenium) for testing web applications. However, I found it to be slow. I wanted to improve the performance of my tests, so I decided to write a new implementation from scratch. The W3C WebDriver specification is quite simple, so it wasn't too difficult to implement, and I was able to get a significant performance improvement, between 2x-10x depending on the usage. Specifically, most test suites can take advantage of pre-warmed sessions, which can minimise the overhead of each test running in a new session. Additionally, I'd like to explore reusing sessions between tests, which could provide even more performance improvements.
|
10
10
|
|
11
|
-
In addition, building on top of [async](https://github.com/socketry/async) allows us to take advantage of [async-http](https://github.com/socketry/async-http)
|
11
|
+
In addition, building on top of [async](https://github.com/socketry/async) allows us to take advantage of [async-http](https://github.com/socketry/async-http) and run the web server in the same reactor as the test itself, which can provide a performance improvement over [capybara](https://github.com/teamcapybara/capybara) which usually needs to start a separate server process. This also makes it possible to share a single database transaction between the client and server, which can significantly reduce the overhead of "cleaning" the database after each test, and improve the opportunity for parallelisation.
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
metadata.gz.sig
CHANGED
Binary file
|