async-webdriver 0.1.2 → 0.2.0
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/async/webdriver/bridge/chrome.rb +81 -0
- data/lib/async/webdriver/bridge/firefox.rb +80 -0
- data/lib/async/webdriver/bridge/generic.rb +91 -0
- data/lib/async/webdriver/bridge/pool.rb +99 -0
- data/lib/async/webdriver/bridge/process_group.rb +77 -0
- data/lib/async/webdriver/bridge.rb +30 -0
- data/lib/async/webdriver/client.rb +71 -26
- data/lib/async/webdriver/element.rb +270 -17
- data/lib/async/webdriver/error.rb +214 -0
- data/lib/async/webdriver/locator.rb +127 -0
- data/lib/async/webdriver/request_helper.rb +120 -0
- data/lib/async/webdriver/scope/alerts.rb +40 -0
- data/lib/async/webdriver/scope/cookies.rb +43 -0
- data/lib/async/webdriver/scope/document.rb +41 -0
- data/lib/async/webdriver/scope/elements.rb +111 -0
- data/lib/async/webdriver/scope/fields.rb +66 -0
- data/lib/async/webdriver/scope/frames.rb +33 -0
- data/lib/async/webdriver/scope/navigation.rb +50 -0
- data/lib/async/webdriver/scope/printing.rb +22 -0
- data/lib/async/webdriver/scope/screen_capture.rb +23 -0
- data/lib/async/webdriver/scope/timeouts.rb +63 -0
- data/lib/async/webdriver/scope.rb +15 -0
- data/lib/async/webdriver/session.rb +107 -65
- data/lib/async/webdriver/version.rb +8 -3
- data/lib/async/webdriver/xpath.rb +29 -0
- data/lib/async/webdriver.rb +7 -12
- data/{LICENSE.txt → license.md} +6 -6
- data/readme.md +37 -0
- data.tar.gz.sig +0 -0
- metadata +71 -149
- metadata.gz.sig +0 -0
- data/.gitignore +0 -11
- data/.rspec +0 -3
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -7
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -103
- data/Guardfile +0 -45
- data/README.md +0 -3
- data/Rakefile +0 -6
- data/async-webdriver.gemspec +0 -37
- data/bin/console +0 -12
- data/bin/setup +0 -8
- data/examples/multiple_sessions.rb +0 -29
- data/lib/async/webdriver/connection.rb +0 -78
- data/lib/async/webdriver/connection_path.rb +0 -25
- data/lib/async/webdriver/execute.rb +0 -29
- data/lib/async/webdriver/session_creator.rb +0 -22
| @@ -1,70 +1,112 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
              module Webdriver
         | 
| 3 | 
            -
                class Session
         | 
| 4 | 
            -
                  def initialize(json:, connection:)
         | 
| 5 | 
            -
                    @capabilities = json.fetch "capabilities"
         | 
| 6 | 
            -
                    @id = json.fetch "id"
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                    @session_connection = ConnectionPath.new "session/#{@id}", connection: connection
         | 
| 9 | 
            -
                    @execute = Execute.new connection: @session_connection
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                  attr_reader :id, :execute
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                  def elements
         | 
| 16 | 
            -
                    body = {
         | 
| 17 | 
            -
                      using: "css selector",
         | 
| 18 | 
            -
                      value: "html"
         | 
| 19 | 
            -
                    }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                    session_id, value = @session_connection.call method: "post", path: "elements", body: body
         | 
| 22 | 
            -
                    list = []
         | 
| 23 | 
            -
                    for e in value do
         | 
| 24 | 
            -
                      list << Element.new(json: e, connection: @session_connection)
         | 
| 25 | 
            -
                    end
         | 
| 26 | 
            -
                    list
         | 
| 27 | 
            -
                  end
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 28 2 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
                  end
         | 
| 3 | 
            +
            # Released under the MIT License.
         | 
| 4 | 
            +
            # Copyright, 2023, by Samuel Williams.
         | 
| 32 5 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
                      url: url
         | 
| 36 | 
            -
                    }
         | 
| 6 | 
            +
            require_relative 'request_helper'
         | 
| 7 | 
            +
            require_relative 'element'
         | 
| 37 8 |  | 
| 38 | 
            -
             | 
| 39 | 
            -
                    self
         | 
| 40 | 
            -
                  end
         | 
| 9 | 
            +
            require_relative 'scope'
         | 
| 41 10 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 11 | 
            +
            module Async
         | 
| 12 | 
            +
            	module WebDriver
         | 
| 13 | 
            +
            		# A session represents a single browser session, potentially with multiple windows. It is the primary interface for interacting with a browser.
         | 
| 14 | 
            +
            		#
         | 
| 15 | 
            +
            		# ``` ruby
         | 
| 16 | 
            +
            		# begin
         | 
| 17 | 
            +
            		# 	bridge = Async::WebDriver::Bridge::Pool.start(Async::WebDriver::Bridge::Chrome.new)
         | 
| 18 | 
            +
            		# 	session = bridge.session
         | 
| 19 | 
            +
            		# 	session.navigate_to("https://google.com")
         | 
| 20 | 
            +
            		# 	# ...
         | 
| 21 | 
            +
            		# ensure
         | 
| 22 | 
            +
            		# 	bridge&.close
         | 
| 23 | 
            +
            		# end
         | 
| 24 | 
            +
            		# ```
         | 
| 25 | 
            +
            		class Session
         | 
| 26 | 
            +
            			# Open a new session.
         | 
| 27 | 
            +
            			# @parameter endpoint [Async::HTTP::Endpoint] The endpoint to connect to.
         | 
| 28 | 
            +
            			# @yields {|session| ...} The session will be closed automatically if you provide a block.
         | 
| 29 | 
            +
            			# 	@parameter session [Session] The session.
         | 
| 30 | 
            +
            			# @returns [Session] The session if no block is given.
         | 
| 31 | 
            +
            			def self.open(endpoint, *arguments, **options)
         | 
| 32 | 
            +
            				client = self.new(
         | 
| 33 | 
            +
            					Async::HTTP::Client.open(endpoint, **options),
         | 
| 34 | 
            +
            					*arguments
         | 
| 35 | 
            +
            				)
         | 
| 36 | 
            +
            				
         | 
| 37 | 
            +
            				return client unless block_given?
         | 
| 38 | 
            +
            				
         | 
| 39 | 
            +
            				begin
         | 
| 40 | 
            +
            					yield client
         | 
| 41 | 
            +
            				ensure
         | 
| 42 | 
            +
            					client.close
         | 
| 43 | 
            +
            				end
         | 
| 44 | 
            +
            			end
         | 
| 45 | 
            +
            			
         | 
| 46 | 
            +
            			# Initialize the session.
         | 
| 47 | 
            +
            			# @parameter delegate [Protocol::HTTP::Middleware] The underlying HTTP client (or wrapper).
         | 
| 48 | 
            +
            			# @parameter id [String] The session identifier.
         | 
| 49 | 
            +
            			# @parameter capabilities [Hash] The capabilities of the session.
         | 
| 50 | 
            +
            			def initialize(delegate, id, capabilities)
         | 
| 51 | 
            +
            				@delegate = delegate
         | 
| 52 | 
            +
            				@id = id
         | 
| 53 | 
            +
            				@capabilities = capabilities
         | 
| 54 | 
            +
            			end
         | 
| 55 | 
            +
            			
         | 
| 56 | 
            +
            			def inspect
         | 
| 57 | 
            +
            				"\#<#{self.class} id=#{@id.inspect}>"
         | 
| 58 | 
            +
            			end
         | 
| 59 | 
            +
            			
         | 
| 60 | 
            +
            			# @attribute [Protocol::HTTP::Middleware] The underlying HTTP client (or wrapper).
         | 
| 61 | 
            +
            			attr :delegate
         | 
| 62 | 
            +
            			
         | 
| 63 | 
            +
            			# @attribute [String] The session identifier.
         | 
| 64 | 
            +
            			attr :id
         | 
| 65 | 
            +
            			
         | 
| 66 | 
            +
            			# @attribute [Hash] The capabilities of the session.
         | 
| 67 | 
            +
            			attr :capabilities
         | 
| 68 | 
            +
            			
         | 
| 69 | 
            +
            			# The path used for making requests to the web driver bridge.
         | 
| 70 | 
            +
            			# @parameter path [String | Nil] The path to append to the request path.
         | 
| 71 | 
            +
            			# @returns [String] The path used for making requests to the web driver bridge.
         | 
| 72 | 
            +
            			def request_path(path = nil)
         | 
| 73 | 
            +
            				if path
         | 
| 74 | 
            +
            					"/session/#{@id}/#{path}"
         | 
| 75 | 
            +
            				else
         | 
| 76 | 
            +
            					"/session/#{@id}"
         | 
| 77 | 
            +
            				end
         | 
| 78 | 
            +
            			end
         | 
| 79 | 
            +
            			
         | 
| 80 | 
            +
            			include RequestHelper
         | 
| 81 | 
            +
            			
         | 
| 82 | 
            +
            			# Close the session.
         | 
| 83 | 
            +
            			def close
         | 
| 84 | 
            +
            				if @delegate
         | 
| 85 | 
            +
            					self.delete
         | 
| 86 | 
            +
            					@delegate = nil
         | 
| 87 | 
            +
            				end
         | 
| 88 | 
            +
            			end
         | 
| 89 | 
            +
            			
         | 
| 90 | 
            +
            			# @returns [Session] The session.
         | 
| 91 | 
            +
            			def session
         | 
| 92 | 
            +
            				self
         | 
| 93 | 
            +
            			end
         | 
| 94 | 
            +
            			
         | 
| 95 | 
            +
            			# @returns [Session] The current scope.
         | 
| 96 | 
            +
            			def current_scope
         | 
| 97 | 
            +
            				self
         | 
| 98 | 
            +
            			end
         | 
| 99 | 
            +
            			
         | 
| 100 | 
            +
            			include Scope::Alerts
         | 
| 101 | 
            +
            			include Scope::Cookies
         | 
| 102 | 
            +
            			include Scope::Document
         | 
| 103 | 
            +
            			include Scope::Elements
         | 
| 104 | 
            +
            			include Scope::Fields
         | 
| 105 | 
            +
            			include Scope::Frames
         | 
| 106 | 
            +
            			include Scope::Navigation
         | 
| 107 | 
            +
            			include Scope::Printing
         | 
| 108 | 
            +
            			include Scope::ScreenCapture
         | 
| 109 | 
            +
            			include Scope::Timeouts
         | 
| 110 | 
            +
            		end
         | 
| 111 | 
            +
            	end
         | 
| 70 112 | 
             
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # Released under the MIT License.
         | 
| 4 | 
            +
            # Copyright, 2023, by Samuel Williams.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Async
         | 
| 7 | 
            +
            	module WebDriver
         | 
| 8 | 
            +
            		# Helpers for working with XPath.
         | 
| 9 | 
            +
            		module XPath
         | 
| 10 | 
            +
            			# Escape a value for use in XPath.
         | 
| 11 | 
            +
            			#
         | 
| 12 | 
            +
            			# XPath 1.0  does not provide any standard mechanism for escaping quotes, so we have to do it ourselves using `concat`.
         | 
| 13 | 
            +
            			#
         | 
| 14 | 
            +
            			# @parameter value [String | Numeric] The value to escape.
         | 
| 15 | 
            +
            			def self.escape(value)
         | 
| 16 | 
            +
            				case value
         | 
| 17 | 
            +
            				when String
         | 
| 18 | 
            +
            					if value.include?("'")
         | 
| 19 | 
            +
            						"concat('#{value.split("'").join("', \"'\", '")}')"
         | 
| 20 | 
            +
            					else
         | 
| 21 | 
            +
            						"'#{value}'"
         | 
| 22 | 
            +
            					end
         | 
| 23 | 
            +
            				else
         | 
| 24 | 
            +
            					value.to_s
         | 
| 25 | 
            +
            				end
         | 
| 26 | 
            +
            			end
         | 
| 27 | 
            +
            		end
         | 
| 28 | 
            +
            	end
         | 
| 29 | 
            +
            end
         | 
    
        data/lib/async/webdriver.rb
    CHANGED
    
    | @@ -1,15 +1,10 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
              module Webdriver
         | 
| 3 | 
            -
              end
         | 
| 4 | 
            -
            end
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 5 2 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
            require_relative "webdriver/connection"
         | 
| 9 | 
            -
            require_relative "webdriver/connection_path"
         | 
| 3 | 
            +
            # Released under the MIT License.
         | 
| 4 | 
            +
            # Copyright, 2023, by Samuel Williams.
         | 
| 10 5 |  | 
| 11 | 
            -
            require_relative  | 
| 12 | 
            -
            require_relative  | 
| 6 | 
            +
            require_relative 'webdriver/bridge'
         | 
| 7 | 
            +
            require_relative 'webdriver/bridge/pool'
         | 
| 13 8 |  | 
| 14 | 
            -
            require_relative  | 
| 15 | 
            -
            require_relative  | 
| 9 | 
            +
            require_relative 'webdriver/client'
         | 
| 10 | 
            +
            require_relative 'webdriver/locator'
         | 
    
        data/{LICENSE.txt → license.md}
    RENAMED
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # MIT License
         | 
| 2 2 |  | 
| 3 | 
            -
            Copyright  | 
| 3 | 
            +
            Copyright, 2023, by Samuel Williams.  
         | 
| 4 4 |  | 
| 5 5 | 
             
            Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 6 6 | 
             
            of this software and associated documentation files (the "Software"), to deal
         | 
| @@ -9,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 9 9 | 
             
            copies of the Software, and to permit persons to whom the Software is
         | 
| 10 10 | 
             
            furnished to do so, subject to the following conditions:
         | 
| 11 11 |  | 
| 12 | 
            -
            The above copyright notice and this permission notice shall be included in
         | 
| 13 | 
            -
             | 
| 12 | 
            +
            The above copyright notice and this permission notice shall be included in all
         | 
| 13 | 
            +
            copies or substantial portions of the Software.
         | 
| 14 14 |  | 
| 15 15 | 
             
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         | 
| 16 16 | 
             
            IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         | 
| 17 17 | 
             
            FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
         | 
| 18 18 | 
             
            AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         | 
| 19 19 | 
             
            LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         | 
| 20 | 
            -
            OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
         | 
| 21 | 
            -
             | 
| 20 | 
            +
            OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
         | 
| 21 | 
            +
            SOFTWARE.
         | 
    
        data/readme.md
    ADDED
    
    | @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            # Async::WebDriver
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Provides a client implementation of the W3C WebDriver specification with support for Chrome and Firefox.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            [](https://github.com/socketry/async-webdriver/actions?workflow=Test)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## Motivation
         | 
| 8 | 
            +
             | 
| 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 | 
            +
             | 
| 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) running in the same reactor, which can provide a significant performance improvement over the existing HTTP servers like [capybara](https://github.com/teamcapybara/capybara) which need to start a separate application 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 | 
            +
             | 
| 13 | 
            +
            ## Usage
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            Please see the [project documentation](https://socketry.github.io/async-webdriver/) for more details.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              - [Getting Started](https://socketry.github.io/async-webdriver/guides/getting-started/index) - This guide explains how to use `async-webdriver` for controlling a browser.
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              - [GitHub Actions Integrations](https://socketry.github.io/async-webdriver/guides/github-actions-integration/index) - This guide explains how to use `async-webdriver` with GitHub Actions.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ## Contributing
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            We welcome contributions to this project.
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            1.  Fork it.
         | 
| 26 | 
            +
            2.  Create your feature branch (`git checkout -b my-new-feature`).
         | 
| 27 | 
            +
            3.  Commit your changes (`git commit -am 'Add some feature'`).
         | 
| 28 | 
            +
            4.  Push to the branch (`git push origin my-new-feature`).
         | 
| 29 | 
            +
            5.  Create new Pull Request.
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            ### Developer Certificate of Origin
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            This project uses the [Developer Certificate of Origin](https://developercertificate.org/). All contributors to this project must agree to this document to have their contributions accepted.
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            ### Contributor Covenant
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            This project is governed by [Contributor Covenant](https://www.contributor-covenant.org/). All contributors and participants agree to abide by its terms.
         | 
    
        data.tar.gz.sig
    ADDED
    
    | Binary file | 
    
        metadata
    CHANGED
    
    | @@ -1,177 +1,99 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: async-webdriver
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 | 
            -
            -  | 
| 8 | 
            -
            autorequire: | 
| 9 | 
            -
            bindir:  | 
| 10 | 
            -
            cert_chain: | 
| 11 | 
            -
             | 
| 7 | 
            +
            - Samuel Williams
         | 
| 8 | 
            +
            autorequire:
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain:
         | 
| 11 | 
            +
            - |
         | 
| 12 | 
            +
              -----BEGIN CERTIFICATE-----
         | 
| 13 | 
            +
              MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
         | 
| 14 | 
            +
              ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
         | 
| 15 | 
            +
              CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
         | 
| 16 | 
            +
              MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
         | 
| 17 | 
            +
              MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
         | 
| 18 | 
            +
              bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
         | 
| 19 | 
            +
              igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
         | 
| 20 | 
            +
              9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
         | 
| 21 | 
            +
              sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
         | 
| 22 | 
            +
              e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
         | 
| 23 | 
            +
              XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
         | 
| 24 | 
            +
              RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
         | 
| 25 | 
            +
              tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
         | 
| 26 | 
            +
              zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
         | 
| 27 | 
            +
              xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
         | 
| 28 | 
            +
              BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
         | 
| 29 | 
            +
              aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
         | 
| 30 | 
            +
              aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
         | 
| 31 | 
            +
              cBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl
         | 
| 32 | 
            +
              xCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/
         | 
| 33 | 
            +
              c1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp
         | 
| 34 | 
            +
              8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
         | 
| 35 | 
            +
              JkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP
         | 
| 36 | 
            +
              eX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt
         | 
| 37 | 
            +
              Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
         | 
| 38 | 
            +
              voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
         | 
| 39 | 
            +
              -----END CERTIFICATE-----
         | 
| 40 | 
            +
            date: 2023-12-04 00:00:00.000000000 Z
         | 
| 12 41 | 
             
            dependencies:
         | 
| 13 42 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 43 | 
             
              name: async-http
         | 
| 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: selenium-webdriver
         | 
| 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: bundler
         | 
| 43 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            -
                requirements:
         | 
| 45 | 
            -
                - - "~>"
         | 
| 46 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: '1.16'
         | 
| 48 | 
            -
              type: :development
         | 
| 49 | 
            -
              prerelease: false
         | 
| 50 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            -
                requirements:
         | 
| 52 | 
            -
                - - "~>"
         | 
| 53 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: '1.16'
         | 
| 55 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            -
              name: rake
         | 
| 57 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            -
                requirements:
         | 
| 59 | 
            -
                - - "~>"
         | 
| 60 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: '10.0'
         | 
| 62 | 
            -
              type: :development
         | 
| 63 | 
            -
              prerelease: false
         | 
| 64 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            -
                requirements:
         | 
| 66 | 
            -
                - - "~>"
         | 
| 67 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: '10.0'
         | 
| 69 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name: rspec
         | 
| 71 44 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 45 | 
             
                requirements:
         | 
| 73 46 | 
             
                - - "~>"
         | 
| 74 47 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: ' | 
| 76 | 
            -
              type: : | 
| 48 | 
            +
                    version: '0.42'
         | 
| 49 | 
            +
              type: :runtime
         | 
| 77 50 | 
             
              prerelease: false
         | 
| 78 51 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 52 | 
             
                requirements:
         | 
| 80 53 | 
             
                - - "~>"
         | 
| 81 54 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: ' | 
| 83 | 
            -
             | 
| 84 | 
            -
              name: guard
         | 
| 85 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            -
                requirements:
         | 
| 87 | 
            -
                - - ">="
         | 
| 88 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: '0'
         | 
| 90 | 
            -
              type: :development
         | 
| 91 | 
            -
              prerelease: false
         | 
| 92 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            -
                requirements:
         | 
| 94 | 
            -
                - - ">="
         | 
| 95 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: '0'
         | 
| 97 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            -
              name: guard-rspec
         | 
| 99 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 | 
            -
                requirements:
         | 
| 101 | 
            -
                - - ">="
         | 
| 102 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            -
                    version: '0'
         | 
| 104 | 
            -
              type: :development
         | 
| 105 | 
            -
              prerelease: false
         | 
| 106 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 | 
            -
                requirements:
         | 
| 108 | 
            -
                - - ">="
         | 
| 109 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                    version: '0'
         | 
| 111 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 112 | 
            -
              name: async-rspec
         | 
| 113 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 | 
            -
                requirements:
         | 
| 115 | 
            -
                - - ">="
         | 
| 116 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: '0'
         | 
| 118 | 
            -
              type: :development
         | 
| 119 | 
            -
              prerelease: false
         | 
| 120 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 | 
            -
                requirements:
         | 
| 122 | 
            -
                - - ">="
         | 
| 123 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: '0'
         | 
| 125 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 126 | 
            -
              name: pry-byebug
         | 
| 127 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 | 
            -
                requirements:
         | 
| 129 | 
            -
                - - ">="
         | 
| 130 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                    version: '0'
         | 
| 132 | 
            -
              type: :development
         | 
| 133 | 
            -
              prerelease: false
         | 
| 134 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 | 
            -
                requirements:
         | 
| 136 | 
            -
                - - ">="
         | 
| 137 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            -
                    version: '0'
         | 
| 139 | 
            -
            description: 
         | 
| 55 | 
            +
                    version: '0.42'
         | 
| 56 | 
            +
            description:
         | 
| 140 57 | 
             
            email:
         | 
| 141 | 
            -
            - matti.paksula@iki.fi
         | 
| 142 58 | 
             
            executables: []
         | 
| 143 59 | 
             
            extensions: []
         | 
| 144 60 | 
             
            extra_rdoc_files: []
         | 
| 145 61 | 
             
            files:
         | 
| 146 | 
            -
            - ".gitignore"
         | 
| 147 | 
            -
            - ".rspec"
         | 
| 148 | 
            -
            - ".ruby-gemset"
         | 
| 149 | 
            -
            - ".ruby-version"
         | 
| 150 | 
            -
            - ".travis.yml"
         | 
| 151 | 
            -
            - Gemfile
         | 
| 152 | 
            -
            - Gemfile.lock
         | 
| 153 | 
            -
            - Guardfile
         | 
| 154 | 
            -
            - LICENSE.txt
         | 
| 155 | 
            -
            - README.md
         | 
| 156 | 
            -
            - Rakefile
         | 
| 157 | 
            -
            - async-webdriver.gemspec
         | 
| 158 | 
            -
            - bin/console
         | 
| 159 | 
            -
            - bin/setup
         | 
| 160 | 
            -
            - examples/multiple_sessions.rb
         | 
| 161 62 | 
             
            - lib/async/webdriver.rb
         | 
| 63 | 
            +
            - lib/async/webdriver/bridge.rb
         | 
| 64 | 
            +
            - lib/async/webdriver/bridge/chrome.rb
         | 
| 65 | 
            +
            - lib/async/webdriver/bridge/firefox.rb
         | 
| 66 | 
            +
            - lib/async/webdriver/bridge/generic.rb
         | 
| 67 | 
            +
            - lib/async/webdriver/bridge/pool.rb
         | 
| 68 | 
            +
            - lib/async/webdriver/bridge/process_group.rb
         | 
| 162 69 | 
             
            - lib/async/webdriver/client.rb
         | 
| 163 | 
            -
            - lib/async/webdriver/connection.rb
         | 
| 164 | 
            -
            - lib/async/webdriver/connection_path.rb
         | 
| 165 70 | 
             
            - lib/async/webdriver/element.rb
         | 
| 166 | 
            -
            - lib/async/webdriver/ | 
| 71 | 
            +
            - lib/async/webdriver/error.rb
         | 
| 72 | 
            +
            - lib/async/webdriver/locator.rb
         | 
| 73 | 
            +
            - lib/async/webdriver/request_helper.rb
         | 
| 74 | 
            +
            - lib/async/webdriver/scope.rb
         | 
| 75 | 
            +
            - lib/async/webdriver/scope/alerts.rb
         | 
| 76 | 
            +
            - lib/async/webdriver/scope/cookies.rb
         | 
| 77 | 
            +
            - lib/async/webdriver/scope/document.rb
         | 
| 78 | 
            +
            - lib/async/webdriver/scope/elements.rb
         | 
| 79 | 
            +
            - lib/async/webdriver/scope/fields.rb
         | 
| 80 | 
            +
            - lib/async/webdriver/scope/frames.rb
         | 
| 81 | 
            +
            - lib/async/webdriver/scope/navigation.rb
         | 
| 82 | 
            +
            - lib/async/webdriver/scope/printing.rb
         | 
| 83 | 
            +
            - lib/async/webdriver/scope/screen_capture.rb
         | 
| 84 | 
            +
            - lib/async/webdriver/scope/timeouts.rb
         | 
| 167 85 | 
             
            - lib/async/webdriver/session.rb
         | 
| 168 | 
            -
            - lib/async/webdriver/session_creator.rb
         | 
| 169 86 | 
             
            - lib/async/webdriver/version.rb
         | 
| 170 | 
            -
             | 
| 87 | 
            +
            - lib/async/webdriver/xpath.rb
         | 
| 88 | 
            +
            - license.md
         | 
| 89 | 
            +
            - readme.md
         | 
| 90 | 
            +
            homepage: https://github.com/socketry/async-webdriver/
         | 
| 171 91 | 
             
            licenses:
         | 
| 172 92 | 
             
            - MIT
         | 
| 173 | 
            -
            metadata: | 
| 174 | 
            -
             | 
| 93 | 
            +
            metadata:
         | 
| 94 | 
            +
              documentation_uri: https://socketry.github.io/async-webdriver/
         | 
| 95 | 
            +
              funding_uri: https://github.com/sponsors/ioquatix
         | 
| 96 | 
            +
            post_install_message:
         | 
| 175 97 | 
             
            rdoc_options: []
         | 
| 176 98 | 
             
            require_paths:
         | 
| 177 99 | 
             
            - lib
         | 
| @@ -179,15 +101,15 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 179 101 | 
             
              requirements:
         | 
| 180 102 | 
             
              - - ">="
         | 
| 181 103 | 
             
                - !ruby/object:Gem::Version
         | 
| 182 | 
            -
                  version: '0'
         | 
| 104 | 
            +
                  version: '3.0'
         | 
| 183 105 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 184 106 | 
             
              requirements:
         | 
| 185 107 | 
             
              - - ">="
         | 
| 186 108 | 
             
                - !ruby/object:Gem::Version
         | 
| 187 109 | 
             
                  version: '0'
         | 
| 188 110 | 
             
            requirements: []
         | 
| 189 | 
            -
            rubygems_version: 3. | 
| 190 | 
            -
            signing_key: | 
| 111 | 
            +
            rubygems_version: 3.4.22
         | 
| 112 | 
            +
            signing_key:
         | 
| 191 113 | 
             
            specification_version: 4
         | 
| 192 | 
            -
            summary:  | 
| 114 | 
            +
            summary: A native library implementing the W3C WebDriver client specification.
         | 
| 193 115 | 
             
            test_files: []
         | 
    
        metadata.gz.sig
    ADDED
    
    | Binary file | 
    
        data/.gitignore
    DELETED
    
    
    
        data/.rspec
    DELETED
    
    
    
        data/.ruby-gemset
    DELETED
    
    | @@ -1 +0,0 @@ | |
| 1 | 
            -
            async-webdriver
         | 
    
        data/.ruby-version
    DELETED
    
    | @@ -1 +0,0 @@ | |
| 1 | 
            -
            2.6.0
         | 
    
        data/.travis.yml
    DELETED