browserstack-webdriver 0.0.1
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/CHANGES +791 -0
- data/README.md +31 -0
- data/build.desc +334 -0
- data/lib/selenium-client.rb +2 -0
- data/lib/selenium-webdriver.rb +1 -0
- data/lib/selenium/client.rb +37 -0
- data/lib/selenium/client/base.rb +132 -0
- data/lib/selenium/client/driver.rb +10 -0
- data/lib/selenium/client/errors.rb +9 -0
- data/lib/selenium/client/extensions.rb +118 -0
- data/lib/selenium/client/idiomatic.rb +488 -0
- data/lib/selenium/client/javascript_expression_builder.rb +116 -0
- data/lib/selenium/client/javascript_frameworks/jquery.rb +13 -0
- data/lib/selenium/client/javascript_frameworks/prototype.rb +13 -0
- data/lib/selenium/client/legacy_driver.rb +1720 -0
- data/lib/selenium/client/protocol.rb +104 -0
- data/lib/selenium/client/selenium_helper.rb +34 -0
- data/lib/selenium/rake/server_task.rb +157 -0
- data/lib/selenium/server.rb +248 -0
- data/lib/selenium/webdriver.rb +71 -0
- data/lib/selenium/webdriver/android.rb +9 -0
- data/lib/selenium/webdriver/android/bridge.rb +47 -0
- data/lib/selenium/webdriver/chrome.rb +26 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +120 -0
- data/lib/selenium/webdriver/chrome/profile.rb +90 -0
- data/lib/selenium/webdriver/chrome/service.rb +75 -0
- data/lib/selenium/webdriver/common.rb +44 -0
- data/lib/selenium/webdriver/common/action_builder.rb +352 -0
- data/lib/selenium/webdriver/common/alert.rb +30 -0
- data/lib/selenium/webdriver/common/bridge_helper.rb +67 -0
- data/lib/selenium/webdriver/common/core_ext/base64.rb +9 -0
- data/lib/selenium/webdriver/common/core_ext/dir.rb +42 -0
- data/lib/selenium/webdriver/common/core_ext/string.rb +5 -0
- data/lib/selenium/webdriver/common/driver.rb +301 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +17 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +39 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +25 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +13 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +22 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +19 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +22 -0
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +45 -0
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +43 -0
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +46 -0
- data/lib/selenium/webdriver/common/element.rb +293 -0
- data/lib/selenium/webdriver/common/error.rb +207 -0
- data/lib/selenium/webdriver/common/file_reaper.rb +47 -0
- data/lib/selenium/webdriver/common/html5/local_storage.rb +42 -0
- data/lib/selenium/webdriver/common/html5/location.rb +0 -0
- data/lib/selenium/webdriver/common/html5/session_storage.rb +44 -0
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +42 -0
- data/lib/selenium/webdriver/common/json_helper.rb +34 -0
- data/lib/selenium/webdriver/common/keyboard.rb +55 -0
- data/lib/selenium/webdriver/common/keys.rb +109 -0
- data/lib/selenium/webdriver/common/log_entry.rb +29 -0
- data/lib/selenium/webdriver/common/logs.rb +23 -0
- data/lib/selenium/webdriver/common/mouse.rb +72 -0
- data/lib/selenium/webdriver/common/navigation.rb +43 -0
- data/lib/selenium/webdriver/common/options.rb +136 -0
- data/lib/selenium/webdriver/common/platform.rb +218 -0
- data/lib/selenium/webdriver/common/port_prober.rb +42 -0
- data/lib/selenium/webdriver/common/profile_helper.rb +67 -0
- data/lib/selenium/webdriver/common/proxy.rb +149 -0
- data/lib/selenium/webdriver/common/search_context.rb +92 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +105 -0
- data/lib/selenium/webdriver/common/target_locator.rb +81 -0
- data/lib/selenium/webdriver/common/timeouts.rb +38 -0
- data/lib/selenium/webdriver/common/touch_action_builder.rb +64 -0
- data/lib/selenium/webdriver/common/touch_screen.rb +105 -0
- data/lib/selenium/webdriver/common/wait.rb +63 -0
- data/lib/selenium/webdriver/common/window.rb +104 -0
- data/lib/selenium/webdriver/common/zipper.rb +82 -0
- data/lib/selenium/webdriver/firefox.rb +37 -0
- data/lib/selenium/webdriver/firefox/binary.rb +158 -0
- data/lib/selenium/webdriver/firefox/bridge.rb +70 -0
- data/lib/selenium/webdriver/firefox/extension.rb +52 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +106 -0
- data/lib/selenium/webdriver/firefox/profile.rb +263 -0
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +62 -0
- data/lib/selenium/webdriver/firefox/socket_lock.rb +61 -0
- data/lib/selenium/webdriver/firefox/util.rb +29 -0
- data/lib/selenium/webdriver/ie.rb +19 -0
- data/lib/selenium/webdriver/ie/bridge.rb +68 -0
- data/lib/selenium/webdriver/ie/server.rb +86 -0
- data/lib/selenium/webdriver/iphone.rb +9 -0
- data/lib/selenium/webdriver/iphone/bridge.rb +45 -0
- data/lib/selenium/webdriver/opera.rb +24 -0
- data/lib/selenium/webdriver/opera/bridge.rb +112 -0
- data/lib/selenium/webdriver/opera/service.rb +49 -0
- data/lib/selenium/webdriver/phantomjs.rb +22 -0
- data/lib/selenium/webdriver/phantomjs/bridge.rb +59 -0
- data/lib/selenium/webdriver/phantomjs/service.rb +90 -0
- data/lib/selenium/webdriver/remote.rb +22 -0
- data/lib/selenium/webdriver/remote/bridge.rb +644 -0
- data/lib/selenium/webdriver/remote/capabilities.rb +267 -0
- data/lib/selenium/webdriver/remote/commands.rb +193 -0
- data/lib/selenium/webdriver/remote/http/common.rb +74 -0
- data/lib/selenium/webdriver/remote/http/curb.rb +79 -0
- data/lib/selenium/webdriver/remote/http/default.rb +139 -0
- data/lib/selenium/webdriver/remote/http/persistent.rb +38 -0
- data/lib/selenium/webdriver/remote/response.rb +97 -0
- data/lib/selenium/webdriver/remote/server_error.rb +17 -0
- data/lib/selenium/webdriver/safari.rb +46 -0
- data/lib/selenium/webdriver/safari/bridge.rb +110 -0
- data/lib/selenium/webdriver/safari/browser.rb +20 -0
- data/lib/selenium/webdriver/safari/extension.rb +120 -0
- data/lib/selenium/webdriver/safari/server.rb +145 -0
- data/lib/selenium/webdriver/support.rb +5 -0
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +28 -0
- data/lib/selenium/webdriver/support/block_event_listener.rb +17 -0
- data/lib/selenium/webdriver/support/color.rb +110 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +112 -0
- data/lib/selenium/webdriver/support/select.rb +293 -0
- data/ruby.iml +13 -0
- data/spec/integration/selenium/client/api/backward_compatible_api_spec.rb +22 -0
- data/spec/integration/selenium/client/api/browser_xpath_library_spec.rb +17 -0
- data/spec/integration/selenium/client/api/click_spec.rb +39 -0
- data/spec/integration/selenium/client/api/cookie_spec.rb +39 -0
- data/spec/integration/selenium/client/api/element_spec.rb +14 -0
- data/spec/integration/selenium/client/api/highlight_located_element_spec.rb +19 -0
- data/spec/integration/selenium/client/api/retrieve_last_remote_control_logs_spec.rb +33 -0
- data/spec/integration/selenium/client/api/screenshot_spec.rb +31 -0
- data/spec/integration/selenium/client/api/select_window_spec.rb +46 -0
- data/spec/integration/selenium/client/api/start_stop_spec.rb +9 -0
- data/spec/integration/selenium/client/api/wait_for_ajax_spec.rb +27 -0
- data/spec/integration/selenium/client/api/wait_for_element_spec.rb +56 -0
- data/spec/integration/selenium/client/api/wait_for_field_value_spec.rb +52 -0
- data/spec/integration/selenium/client/api/wait_for_text_spec.rb +98 -0
- data/spec/integration/selenium/client/api/webdriver_backed_spec.rb +21 -0
- data/spec/integration/selenium/client/sample-app/public/jquery-1.3.2.js +4376 -0
- data/spec/integration/selenium/client/sample-app/public/jquery.html +55 -0
- data/spec/integration/selenium/client/sample-app/public/prototype-1.6.0.3.js +4320 -0
- data/spec/integration/selenium/client/sample-app/public/prototype.html +59 -0
- data/spec/integration/selenium/client/sample-app/sample_app.rb +32 -0
- data/spec/integration/selenium/client/spec_helper.rb +139 -0
- data/spec/integration/selenium/webdriver/app_cache_spec.rb +47 -0
- data/spec/integration/selenium/webdriver/browser_connection_spec.rb +20 -0
- data/spec/integration/selenium/webdriver/chrome/driver_spec.rb +28 -0
- data/spec/integration/selenium/webdriver/chrome/profile_spec.rb +63 -0
- data/spec/integration/selenium/webdriver/driver_spec.rb +266 -0
- data/spec/integration/selenium/webdriver/element_spec.rb +191 -0
- data/spec/integration/selenium/webdriver/error_spec.rb +30 -0
- data/spec/integration/selenium/webdriver/firefox/driver_spec.rb +21 -0
- data/spec/integration/selenium/webdriver/firefox/profile_spec.rb +141 -0
- data/spec/integration/selenium/webdriver/keyboard_spec.rb +57 -0
- data/spec/integration/selenium/webdriver/location_spec.rb +29 -0
- data/spec/integration/selenium/webdriver/mouse_spec.rb +57 -0
- data/spec/integration/selenium/webdriver/navigation_spec.rb +46 -0
- data/spec/integration/selenium/webdriver/opera/driver_spec.rb +47 -0
- data/spec/integration/selenium/webdriver/options_spec.rb +77 -0
- data/spec/integration/selenium/webdriver/remote/driver_spec.rb +19 -0
- data/spec/integration/selenium/webdriver/remote/element_spec.rb +26 -0
- data/spec/integration/selenium/webdriver/spec_helper.rb +36 -0
- data/spec/integration/selenium/webdriver/spec_support.rb +12 -0
- data/spec/integration/selenium/webdriver/spec_support/guards.rb +110 -0
- data/spec/integration/selenium/webdriver/spec_support/helpers.rb +51 -0
- data/spec/integration/selenium/webdriver/spec_support/rack_server.rb +123 -0
- data/spec/integration/selenium/webdriver/spec_support/test_environment.rb +239 -0
- data/spec/integration/selenium/webdriver/sql_database_spec.rb +59 -0
- data/spec/integration/selenium/webdriver/storage_spec.rb +96 -0
- data/spec/integration/selenium/webdriver/target_locator_spec.rb +186 -0
- data/spec/integration/selenium/webdriver/timeout_spec.rb +69 -0
- data/spec/integration/selenium/webdriver/touch_spec.rb +176 -0
- data/spec/integration/selenium/webdriver/window_spec.rb +70 -0
- data/spec/integration/selenium/webdriver/zipper_spec.rb +66 -0
- data/spec/unit/selenium/client/base_spec.rb +239 -0
- data/spec/unit/selenium/client/extensions_spec.rb +174 -0
- data/spec/unit/selenium/client/idiomatic_spec.rb +500 -0
- data/spec/unit/selenium/client/javascript_expression_builder_spec.rb +79 -0
- data/spec/unit/selenium/client/javascript_frameworks/jquery_spec.rb +10 -0
- data/spec/unit/selenium/client/javascript_frameworks/prototype_spec.rb +10 -0
- data/spec/unit/selenium/client/protocol_spec.rb +124 -0
- data/spec/unit/selenium/client/selenium_helper_spec.rb +56 -0
- data/spec/unit/selenium/client/spec_helper.rb +24 -0
- data/spec/unit/selenium/rake/task_spec.rb +79 -0
- data/spec/unit/selenium/server_spec.rb +150 -0
- data/spec/unit/selenium/webdriver/action_builder_spec.rb +97 -0
- data/spec/unit/selenium/webdriver/android/bridge_spec.rb +43 -0
- data/spec/unit/selenium/webdriver/chrome/bridge_spec.rb +137 -0
- data/spec/unit/selenium/webdriver/chrome/profile_spec.rb +57 -0
- data/spec/unit/selenium/webdriver/chrome/service_spec.rb +44 -0
- data/spec/unit/selenium/webdriver/error_spec.rb +41 -0
- data/spec/unit/selenium/webdriver/firefox/bridge_spec.rb +47 -0
- data/spec/unit/selenium/webdriver/ie/bridge_spec.rb +91 -0
- data/spec/unit/selenium/webdriver/iphone/bridge_spec.rb +42 -0
- data/spec/unit/selenium/webdriver/log_entry_spec.rb +11 -0
- data/spec/unit/selenium/webdriver/opera/bridge_spec.rb +44 -0
- data/spec/unit/selenium/webdriver/phantomjs/bridge_spec.rb +55 -0
- data/spec/unit/selenium/webdriver/proxy_spec.rb +106 -0
- data/spec/unit/selenium/webdriver/remote/bridge_spec.rb +16 -0
- data/spec/unit/selenium/webdriver/remote/capabilities_spec.rb +115 -0
- data/spec/unit/selenium/webdriver/remote/http/common_spec.rb +24 -0
- data/spec/unit/selenium/webdriver/remote/http/default_spec.rb +124 -0
- data/spec/unit/selenium/webdriver/search_context_spec.rb +61 -0
- data/spec/unit/selenium/webdriver/socket_poller_spec.rb +68 -0
- data/spec/unit/selenium/webdriver/spec_helper.rb +27 -0
- data/spec/unit/selenium/webdriver/support/color_spec.rb +119 -0
- data/spec/unit/selenium/webdriver/support/event_firing_spec.rb +111 -0
- data/spec/unit/selenium/webdriver/support/select_spec.rb +290 -0
- data/spec/unit/selenium/webdriver/wait_spec.rb +49 -0
- metadata +370 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
class PortProber
|
|
4
|
+
def self.above(port)
|
|
5
|
+
port += 1 until free? port
|
|
6
|
+
port
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.random
|
|
10
|
+
# TODO: Avoid this
|
|
11
|
+
#
|
|
12
|
+
# (a) should pick a port that's guaranteed to be free on all interfaces
|
|
13
|
+
# (b) should pick a random port outside the ephemeral port range
|
|
14
|
+
#
|
|
15
|
+
server = TCPServer.new(Platform.localhost, 0)
|
|
16
|
+
port = server.addr[1]
|
|
17
|
+
server.close
|
|
18
|
+
|
|
19
|
+
port
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
IGNORED_ERRORS = [Errno::EADDRNOTAVAIL]
|
|
23
|
+
IGNORED_ERRORS << Errno::EBADF if Platform.cygwin?
|
|
24
|
+
|
|
25
|
+
def self.free?(port)
|
|
26
|
+
Platform.interfaces.each do |host|
|
|
27
|
+
begin
|
|
28
|
+
TCPServer.new(host, port).close
|
|
29
|
+
rescue *IGNORED_ERRORS => ex
|
|
30
|
+
$stderr.puts "port prober could not bind to #{host}:#{port} (#{ex.message})" if $DEBUG
|
|
31
|
+
# ignored - some machines appear unable to bind to some of their interfaces
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
true
|
|
36
|
+
rescue SocketError, Errno::EADDRINUSE
|
|
37
|
+
false
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end # PortProber
|
|
41
|
+
end # WebDriver
|
|
42
|
+
end # Selenium
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# @api private
|
|
6
|
+
#
|
|
7
|
+
# Common methods for Chrome::Profile and Firefox::Profile
|
|
8
|
+
# Includers must implement #layout_on_disk
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
module ProfileHelper
|
|
12
|
+
|
|
13
|
+
def self.included(base)
|
|
14
|
+
base.extend ClassMethods
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def as_json(opts = nil)
|
|
18
|
+
{'zip' => Zipper.zip(layout_on_disk)}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_json(*args)
|
|
22
|
+
WebDriver.json_dump as_json
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def create_tmp_copy(directory)
|
|
28
|
+
tmp_directory = Dir.mktmpdir("webdriver-rb-profilecopy")
|
|
29
|
+
|
|
30
|
+
# TODO: must be a better way..
|
|
31
|
+
FileUtils.rm_rf tmp_directory
|
|
32
|
+
FileUtils.mkdir_p File.dirname(tmp_directory), :mode => 0700
|
|
33
|
+
FileUtils.cp_r directory, tmp_directory
|
|
34
|
+
|
|
35
|
+
tmp_directory
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def verify_model(model)
|
|
39
|
+
return unless model
|
|
40
|
+
|
|
41
|
+
raise Errno::ENOENT, model unless File.exist?(model)
|
|
42
|
+
raise Errno::ENOTDIR, model unless File.directory?(model)
|
|
43
|
+
|
|
44
|
+
model
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
module ClassMethods
|
|
48
|
+
def from_json(json)
|
|
49
|
+
data = WebDriver.json_load(json).fetch('zip')
|
|
50
|
+
|
|
51
|
+
# can't use Tempfile here since it doesn't support File::BINARY mode on 1.8
|
|
52
|
+
# can't use Dir.mktmpdir(&blk) because of http://jira.codehaus.org/browse/JRUBY-4082
|
|
53
|
+
tmp_dir = Dir.mktmpdir
|
|
54
|
+
begin
|
|
55
|
+
zip_path = File.join(tmp_dir, "webdriver-profile-duplicate-#{json.hash}.zip")
|
|
56
|
+
File.open(zip_path, "wb") { |zip_file| zip_file << Base64.decode64(data) }
|
|
57
|
+
|
|
58
|
+
new Zipper.unzip(zip_path)
|
|
59
|
+
ensure
|
|
60
|
+
FileUtils.rm_rf tmp_dir
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end # ClassMethods
|
|
64
|
+
|
|
65
|
+
end # ProfileHelper
|
|
66
|
+
end # WebDriver
|
|
67
|
+
end # Selenium
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
class Proxy
|
|
4
|
+
TYPES = {
|
|
5
|
+
:direct => "DIRECT", # Direct connection, no proxy (default on Windows).
|
|
6
|
+
:manual => "MANUAL", # Manual proxy settings (e.g., for httpProxy).
|
|
7
|
+
:pac => "PAC", # Proxy autoconfiguration from URL.
|
|
8
|
+
:auto_detect => "AUTODETECT", # Proxy autodetection (presumably with WPAD).
|
|
9
|
+
:system => "SYSTEM" # Use system settings (default on Linux).
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
attr_reader :type,
|
|
13
|
+
:ftp,
|
|
14
|
+
:http,
|
|
15
|
+
:socks,
|
|
16
|
+
:socks_username,
|
|
17
|
+
:socks_password,
|
|
18
|
+
:no_proxy,
|
|
19
|
+
:pac,
|
|
20
|
+
:ssl,
|
|
21
|
+
:auto_detect
|
|
22
|
+
|
|
23
|
+
def initialize(opts = {})
|
|
24
|
+
opts = opts.dup
|
|
25
|
+
|
|
26
|
+
self.type = opts.delete(:type) if opts.has_key? :type
|
|
27
|
+
self.ftp = opts.delete(:ftp) if opts.has_key? :ftp
|
|
28
|
+
self.http = opts.delete(:http) if opts.has_key? :http
|
|
29
|
+
self.no_proxy = opts.delete(:no_proxy) if opts.has_key? :no_proxy
|
|
30
|
+
self.ssl = opts.delete(:ssl) if opts.has_key? :ssl
|
|
31
|
+
self.pac = opts.delete(:pac) if opts.has_key? :pac
|
|
32
|
+
self.auto_detect = opts.delete(:auto_detect) if opts.has_key? :auto_detect
|
|
33
|
+
self.socks = opts.delete(:socks) if opts.has_key? :socks
|
|
34
|
+
self.socks_username = opts.delete(:socks_username) if opts.has_key? :socks_username
|
|
35
|
+
self.socks_password = opts.delete(:socks_password) if opts.has_key? :socks_password
|
|
36
|
+
|
|
37
|
+
unless opts.empty?
|
|
38
|
+
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def ==(other)
|
|
43
|
+
other.kind_of?(self.class) && as_json == other.as_json
|
|
44
|
+
end
|
|
45
|
+
alias_method :eql?, :==
|
|
46
|
+
|
|
47
|
+
def ftp=(value)
|
|
48
|
+
self.type = :manual
|
|
49
|
+
@ftp = value
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def http=(value)
|
|
53
|
+
self.type = :manual
|
|
54
|
+
@http = value
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def no_proxy=(value)
|
|
58
|
+
self.type = :manual
|
|
59
|
+
@no_proxy = value
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def ssl=(value)
|
|
63
|
+
self.type = :manual
|
|
64
|
+
@ssl = value
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def pac=(url)
|
|
68
|
+
self.type = :pac
|
|
69
|
+
@pac = url
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def auto_detect=(bool)
|
|
73
|
+
self.type = :auto_detect
|
|
74
|
+
@auto_detect = bool
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def socks=(value)
|
|
78
|
+
self.type = :manual
|
|
79
|
+
@socks = value
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def socks_username=(value)
|
|
83
|
+
self.type = :manual
|
|
84
|
+
@socks_username = value
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def socks_password=(value)
|
|
88
|
+
self.type = :manual
|
|
89
|
+
@socks_password = value
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def type=(type)
|
|
93
|
+
unless TYPES.has_key? type
|
|
94
|
+
raise ArgumentError, "invalid proxy type: #{type.inspect}, expected one of #{TYPES.keys.inspect}"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if defined?(@type) && type != @type
|
|
98
|
+
raise ArgumentError, "incompatible proxy type #{type.inspect} (already set to #{@type.inspect})"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
@type = type
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def as_json(opts = nil)
|
|
105
|
+
json_result = {
|
|
106
|
+
"proxyType" => TYPES[type]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
json_result["ftpProxy"] = ftp if ftp
|
|
110
|
+
json_result["httpProxy"] = http if http
|
|
111
|
+
json_result["noProxy"] = no_proxy if no_proxy
|
|
112
|
+
json_result["proxyAutoconfigUrl"] = pac if pac
|
|
113
|
+
json_result["sslProxy"] = ssl if ssl
|
|
114
|
+
json_result["autodetect"] = auto_detect if auto_detect
|
|
115
|
+
json_result["socksProxy"] = socks if socks
|
|
116
|
+
json_result["socksUsername"] = socks_username if socks_username
|
|
117
|
+
json_result["socksPassword"] = socks_password if socks_password
|
|
118
|
+
|
|
119
|
+
json_result if json_result.length > 1
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def to_json(*args)
|
|
123
|
+
WebDriver.json_dump as_json
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
class << self
|
|
127
|
+
def json_create(data)
|
|
128
|
+
return if data['proxyType'] == 'UNSPECIFIED'
|
|
129
|
+
|
|
130
|
+
proxy = new
|
|
131
|
+
|
|
132
|
+
proxy.type = data['proxyType'].downcase.to_sym if data.has_key? 'proxyType'
|
|
133
|
+
proxy.ftp = data['ftpProxy'] if data.has_key? 'ftpProxy'
|
|
134
|
+
proxy.http = data['httpProxy'] if data.has_key? 'httpProxy'
|
|
135
|
+
proxy.no_proxy = data['noProxy'] if data.has_key? 'noProxy'
|
|
136
|
+
proxy.pac = data['proxyAutoconfigUrl'] if data.has_key? 'proxyAutoconfigUrl'
|
|
137
|
+
proxy.ssl = data['sslProxy'] if data.has_key? 'sslProxy'
|
|
138
|
+
proxy.auto_detect = data['autodetect'] if data.has_key? 'autodetect'
|
|
139
|
+
proxy.socks = data['socksProxy'] if data.has_key? 'socksProxy'
|
|
140
|
+
proxy.socks_username = data['socksUsername'] if data.has_key? 'socksUsername'
|
|
141
|
+
proxy.socks_password = data['socksPassword'] if data.has_key? 'socksPassword'
|
|
142
|
+
|
|
143
|
+
proxy
|
|
144
|
+
end
|
|
145
|
+
end # class << self
|
|
146
|
+
|
|
147
|
+
end # Proxy
|
|
148
|
+
end # WebDriver
|
|
149
|
+
end # Selenium
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module SearchContext
|
|
4
|
+
|
|
5
|
+
# @api private
|
|
6
|
+
FINDERS = {
|
|
7
|
+
:class => 'class name',
|
|
8
|
+
:class_name => 'class name',
|
|
9
|
+
:css => 'css selector',
|
|
10
|
+
:id => 'id',
|
|
11
|
+
:link => 'link text',
|
|
12
|
+
:link_text => 'link text',
|
|
13
|
+
:name => 'name',
|
|
14
|
+
:partial_link_text => 'partial link text',
|
|
15
|
+
:tag_name => 'tag name',
|
|
16
|
+
:xpath => 'xpath',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Find the first element matching the given arguments.
|
|
21
|
+
#
|
|
22
|
+
# When using Element#find_element with :xpath, be aware that webdriver
|
|
23
|
+
# follows standard conventions: a search prefixed with "//" will search
|
|
24
|
+
# the entire document, not just the children of this current node. Use
|
|
25
|
+
# ".//" to limit your search to the children of the receiving Element.
|
|
26
|
+
#
|
|
27
|
+
# @param [:class, :class_name, :css, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath] how
|
|
28
|
+
# @param [String] what
|
|
29
|
+
# @return [Element]
|
|
30
|
+
#
|
|
31
|
+
# @raise [Error::NoSuchElementError] if the element doesn't exist
|
|
32
|
+
#
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
def find_element(*args)
|
|
36
|
+
how, what = extract_args(args)
|
|
37
|
+
|
|
38
|
+
unless by = FINDERS[how.to_sym]
|
|
39
|
+
raise ArgumentError, "cannot find element by #{how.inspect}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
bridge.find_element_by by, what.to_s, ref
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Find all elements matching the given arguments
|
|
47
|
+
#
|
|
48
|
+
# @see SearchContext#find_element
|
|
49
|
+
#
|
|
50
|
+
# @param [:class, :class_name, :css, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath] how
|
|
51
|
+
# @param [String] what
|
|
52
|
+
# @return [Array<Element>]
|
|
53
|
+
#
|
|
54
|
+
|
|
55
|
+
def find_elements(*args)
|
|
56
|
+
how, what = extract_args(args)
|
|
57
|
+
|
|
58
|
+
unless by = FINDERS[how.to_sym]
|
|
59
|
+
raise ArgumentError, "cannot find elements by #{how.inspect}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
bridge.find_elements_by by, what.to_s, ref
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def extract_args(args)
|
|
68
|
+
case args.size
|
|
69
|
+
when 2
|
|
70
|
+
args
|
|
71
|
+
when 1
|
|
72
|
+
arg = args.first
|
|
73
|
+
|
|
74
|
+
unless arg.respond_to?(:shift)
|
|
75
|
+
raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# this will be a single-entry hash, so use #shift over #first or #[]
|
|
79
|
+
arr = arg.dup.shift
|
|
80
|
+
unless arr.size == 2
|
|
81
|
+
raise ArgumentError, "expected #{arr.inspect} to have 2 elements"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
arr
|
|
85
|
+
else
|
|
86
|
+
raise ArgumentError, "wrong number of arguments (#{args.size} for 2)"
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end # SearchContext
|
|
91
|
+
end # WebDriver
|
|
92
|
+
end # Selenium
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
require 'selenium/webdriver/common/platform'
|
|
2
|
+
require 'socket'
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
class SocketPoller
|
|
7
|
+
|
|
8
|
+
def initialize(host, port, timeout = 0, interval = 0.25)
|
|
9
|
+
@host = host
|
|
10
|
+
@port = Integer(port)
|
|
11
|
+
@timeout = Float(timeout)
|
|
12
|
+
@interval = interval
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# Returns true if the server is listening within the given timeout,
|
|
17
|
+
# false otherwise.
|
|
18
|
+
#
|
|
19
|
+
# @return [Boolean]
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
def connected?
|
|
23
|
+
with_timeout { listening? }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Returns true if the server has stopped listening within the given timeout,
|
|
28
|
+
# false otherwise.
|
|
29
|
+
#
|
|
30
|
+
# @return [Boolean]
|
|
31
|
+
#
|
|
32
|
+
|
|
33
|
+
def closed?
|
|
34
|
+
with_timeout { not listening? }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
CONNECT_TIMEOUT = 5
|
|
40
|
+
|
|
41
|
+
NOT_CONNECTED_ERRORS = [Errno::ECONNREFUSED, Errno::ENOTCONN, SocketError]
|
|
42
|
+
NOT_CONNECTED_ERRORS << Errno::EPERM if Platform.cygwin?
|
|
43
|
+
|
|
44
|
+
CONNECTED_ERRORS = [Errno::EISCONN]
|
|
45
|
+
CONNECTED_ERRORS << Errno::EINVAL if Platform.windows?
|
|
46
|
+
|
|
47
|
+
if Platform.jruby?
|
|
48
|
+
# we use a plain TCPSocket here since JRuby has issues select()ing on a connecting socket
|
|
49
|
+
# see http://jira.codehaus.org/browse/JRUBY-5165
|
|
50
|
+
def listening?
|
|
51
|
+
TCPSocket.new(@host, @port).close
|
|
52
|
+
true
|
|
53
|
+
rescue *NOT_CONNECTED_ERRORS
|
|
54
|
+
false
|
|
55
|
+
end
|
|
56
|
+
else
|
|
57
|
+
def listening?
|
|
58
|
+
addr = Socket.getaddrinfo(@host, @port, Socket::AF_INET, Socket::SOCK_STREAM)
|
|
59
|
+
sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
|
60
|
+
sockaddr = Socket.pack_sockaddr_in(@port, addr[0][3])
|
|
61
|
+
|
|
62
|
+
begin
|
|
63
|
+
sock.connect_nonblock sockaddr
|
|
64
|
+
rescue Errno::EINPROGRESS
|
|
65
|
+
if IO.select(nil, [sock], nil, CONNECT_TIMEOUT)
|
|
66
|
+
retry
|
|
67
|
+
else
|
|
68
|
+
raise Errno::ECONNREFUSED
|
|
69
|
+
end
|
|
70
|
+
rescue *CONNECTED_ERRORS
|
|
71
|
+
# yay!
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
sock.close
|
|
75
|
+
true
|
|
76
|
+
rescue *NOT_CONNECTED_ERRORS
|
|
77
|
+
sock.close if sock
|
|
78
|
+
$stderr.puts [@host, @port].inspect if $DEBUG
|
|
79
|
+
false
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def with_timeout(&blk)
|
|
84
|
+
max_time = time_now + @timeout
|
|
85
|
+
|
|
86
|
+
(
|
|
87
|
+
return true if yield
|
|
88
|
+
wait
|
|
89
|
+
) until time_now > max_time
|
|
90
|
+
|
|
91
|
+
false
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def wait
|
|
95
|
+
sleep @interval
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# for testability
|
|
99
|
+
def time_now
|
|
100
|
+
Time.now
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end # SocketPoller
|
|
104
|
+
end # WebDriver
|
|
105
|
+
end # Selenium
|