selenium-webdriver 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +10 -0
- data/lib/selenium/client.rb +1 -0
- data/lib/selenium/webdriver.rb +0 -1
- data/lib/selenium/webdriver/chrome.rb +2 -1
- data/lib/selenium/webdriver/chrome/bridge.rb +2 -0
- data/lib/selenium/webdriver/chrome/profile.rb +66 -0
- data/lib/selenium/webdriver/common.rb +2 -0
- data/lib/selenium/webdriver/common/core_ext/base64.rb +9 -0
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +16 -0
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +14 -0
- data/lib/selenium/webdriver/common/element.rb +1 -1
- data/lib/selenium/webdriver/common/profile_helper.rb +67 -0
- data/lib/selenium/webdriver/common/zipper.rb +1 -1
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/profile.rb +1 -44
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +18 -18
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +15 -11
- metadata +75 -118
data/CHANGES
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
2.3.0 (2011-08-01)
|
2
|
+
==================
|
3
|
+
|
4
|
+
* Add Selenium::WebDriver::Chrome::Profile
|
5
|
+
* Better detection of clickable areas in Firefox.
|
6
|
+
* Merge of Google-contributed code into the underlying Atoms.
|
7
|
+
* IE click issue fixed (#1650)
|
8
|
+
* No longer raise in Element#inspect if the element is obsolete.
|
9
|
+
|
10
|
+
|
1
11
|
2.2.0 (2011-07-26)
|
2
12
|
==================
|
3
13
|
|
data/lib/selenium/client.rb
CHANGED
data/lib/selenium/webdriver.rb
CHANGED
@@ -2,6 +2,7 @@ require 'net/http'
|
|
2
2
|
|
3
3
|
require 'selenium/webdriver/chrome/service'
|
4
4
|
require 'selenium/webdriver/chrome/bridge'
|
5
|
+
require 'selenium/webdriver/chrome/profile'
|
5
6
|
|
6
7
|
module Selenium
|
7
8
|
module WebDriver
|
@@ -17,7 +18,7 @@ module Selenium
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def self.path
|
20
|
-
@path
|
21
|
+
@path ||= nil
|
21
22
|
end
|
22
23
|
|
23
24
|
end
|
@@ -10,6 +10,7 @@ module Selenium
|
|
10
10
|
switches = opts.delete(:switches)
|
11
11
|
native_events = opts.delete(:native_events)
|
12
12
|
verbose = opts.delete(:verbose)
|
13
|
+
profile = opts.delete(:profile)
|
13
14
|
|
14
15
|
unless opts.empty?
|
15
16
|
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
@@ -28,6 +29,7 @@ module Selenium
|
|
28
29
|
caps.merge! 'chrome.binary' => Chrome.path if Chrome.path
|
29
30
|
caps.merge! 'chrome.nativeEvents' => true if native_events
|
30
31
|
caps.merge! 'chrome.verbose' => true if verbose
|
32
|
+
caps.merge! 'chrome.profile' => profile.as_json['zip'] if profile
|
31
33
|
|
32
34
|
@service = Service.default_service
|
33
35
|
@service.start
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Chrome
|
4
|
+
|
5
|
+
#
|
6
|
+
# @private
|
7
|
+
#
|
8
|
+
|
9
|
+
class Profile
|
10
|
+
include ProfileHelper
|
11
|
+
|
12
|
+
def initialize(model = nil)
|
13
|
+
@model = verify_model(model)
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# Set a preference in the profile.
|
18
|
+
#
|
19
|
+
# See http://codesearch.google.com/codesearch#OAMlx_jo-ck/src/chrome/common/pref_names.cc&exact_package=chromium
|
20
|
+
#
|
21
|
+
|
22
|
+
def []=(key, value)
|
23
|
+
parts = key.split(".")
|
24
|
+
parts[0..-2].inject(prefs) { |pr, k| pr[k] ||= {} }[parts.last] = value
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](key)
|
28
|
+
parts = key.split(".")
|
29
|
+
parts.inject(prefs) { |pr, k| pr.fetch(k) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def layout_on_disk
|
33
|
+
dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir("webdriver-chrome-profile")
|
34
|
+
FileReaper << dir
|
35
|
+
|
36
|
+
write_prefs_to dir
|
37
|
+
|
38
|
+
dir
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def write_prefs_to(dir)
|
44
|
+
prefs_file = prefs_file_for(dir)
|
45
|
+
|
46
|
+
FileUtils.mkdir_p File.dirname(prefs_file)
|
47
|
+
File.open(prefs_file, "w") { |file| file << prefs.to_json }
|
48
|
+
end
|
49
|
+
|
50
|
+
def prefs
|
51
|
+
@prefs ||= read_model_prefs
|
52
|
+
end
|
53
|
+
|
54
|
+
def read_model_prefs
|
55
|
+
return {} unless @model
|
56
|
+
JSON.parse File.read(prefs_file_for(@model))
|
57
|
+
end
|
58
|
+
|
59
|
+
def prefs_file_for(dir)
|
60
|
+
File.join dir, 'Default', 'Preferences'
|
61
|
+
end
|
62
|
+
end # Profile
|
63
|
+
|
64
|
+
end # Chrome
|
65
|
+
end # WebDriver
|
66
|
+
end # Selenium
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'selenium/webdriver/common/core_ext/dir'
|
2
2
|
require 'selenium/webdriver/common/core_ext/string'
|
3
|
+
require 'selenium/webdriver/common/core_ext/base64'
|
3
4
|
require 'selenium/webdriver/common/error'
|
4
5
|
require 'selenium/webdriver/common/platform'
|
5
6
|
require 'selenium/webdriver/common/proxy'
|
@@ -22,5 +23,6 @@ require 'selenium/webdriver/common/driver_extensions/rotatable'
|
|
22
23
|
require 'selenium/webdriver/common/driver_extensions/has_input_devices'
|
23
24
|
require 'selenium/webdriver/common/keys'
|
24
25
|
require 'selenium/webdriver/common/bridge_helper'
|
26
|
+
require 'selenium/webdriver/common/profile_helper'
|
25
27
|
require 'selenium/webdriver/common/driver'
|
26
28
|
require 'selenium/webdriver/common/element'
|
@@ -10,6 +10,14 @@ module Selenium
|
|
10
10
|
|
11
11
|
ORIENTATIONS = [:landscape, :portrait]
|
12
12
|
|
13
|
+
#
|
14
|
+
# Change the screen orientation
|
15
|
+
#
|
16
|
+
# @param [:landscape, :portrait] Orientation
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
#
|
20
|
+
|
13
21
|
def rotate(orientation)
|
14
22
|
unless ORIENTATIONS.include?(orientation)
|
15
23
|
raise ArgumentError, "expected #{ORIENTATIONS.inspect}, got #{orientation.inspect}"
|
@@ -18,6 +26,14 @@ module Selenium
|
|
18
26
|
bridge.setScreenOrientation(orientation.to_s.upcase)
|
19
27
|
end
|
20
28
|
|
29
|
+
#
|
30
|
+
# Get the current screen orientation
|
31
|
+
#
|
32
|
+
# @return [:landscape, :portrait] orientation
|
33
|
+
#
|
34
|
+
# @api public
|
35
|
+
#
|
36
|
+
|
21
37
|
def orientation
|
22
38
|
bridge.getScreenOrientation.to_sym.downcase
|
23
39
|
end
|
@@ -8,10 +8,24 @@ module Selenium
|
|
8
8
|
module DriverExtensions
|
9
9
|
module TakesScreenshot
|
10
10
|
|
11
|
+
#
|
12
|
+
# Save a PNG screenshot to the given path
|
13
|
+
#
|
14
|
+
# @api public
|
15
|
+
#
|
16
|
+
|
11
17
|
def save_screenshot(png_path)
|
12
18
|
File.open(png_path, 'wb') { |f| f << screenshot_as(:png) }
|
13
19
|
end
|
14
20
|
|
21
|
+
#
|
22
|
+
# Return a PNG screenshot in the given format as a string
|
23
|
+
#
|
24
|
+
# @param [:base64, :png] format
|
25
|
+
# @return String screenshot
|
26
|
+
#
|
27
|
+
# @api public
|
28
|
+
|
15
29
|
def screenshot_as(format)
|
16
30
|
case format
|
17
31
|
when :base64
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
|
4
|
+
#
|
5
|
+
# @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
|
+
as_json.to_json(*args)
|
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 = JSON.parse(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}")
|
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
|
Binary file
|
File without changes
|
Binary file
|
@@ -2,6 +2,7 @@ module Selenium
|
|
2
2
|
module WebDriver
|
3
3
|
module Firefox
|
4
4
|
class Profile
|
5
|
+
include ProfileHelper
|
5
6
|
|
6
7
|
WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
|
7
8
|
WEBDRIVER_PREFS = {
|
@@ -55,7 +56,6 @@ module Selenium
|
|
55
56
|
@secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != "true"
|
56
57
|
@untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == "true"
|
57
58
|
@load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == "true" # not stored in profile atm, so will always be false.
|
58
|
-
|
59
59
|
@additional_prefs = model_prefs
|
60
60
|
end
|
61
61
|
|
@@ -74,29 +74,6 @@ module Selenium
|
|
74
74
|
profile_dir
|
75
75
|
end
|
76
76
|
|
77
|
-
def as_json(opts = nil)
|
78
|
-
{'zip' => Zipper.zip(layout_on_disk)}
|
79
|
-
end
|
80
|
-
|
81
|
-
def to_json(*args)
|
82
|
-
as_json.to_json(*args)
|
83
|
-
end
|
84
|
-
|
85
|
-
def self.from_json(json)
|
86
|
-
data = JSON.parse(json).fetch('zip')
|
87
|
-
|
88
|
-
# can't use Tempfile here since it doesn't support File::BINARY mode on 1.8
|
89
|
-
# can't use Dir.mktmpdir(&blk) because of http://jira.codehaus.org/browse/JRUBY-4082
|
90
|
-
tmp_dir = Dir.mktmpdir
|
91
|
-
begin
|
92
|
-
zip_path = File.join(tmp_dir, "webdriver-profile-duplicate-#{json.hash}")
|
93
|
-
File.open(zip_path, "wb") { |zip_file| zip_file << Base64.decode64(data) }
|
94
|
-
|
95
|
-
new Zipper.unzip(zip_path)
|
96
|
-
ensure
|
97
|
-
FileUtils.rm_rf tmp_dir
|
98
|
-
end
|
99
|
-
end
|
100
77
|
|
101
78
|
#
|
102
79
|
# Set a preference for this particular profile.
|
@@ -213,15 +190,6 @@ module Selenium
|
|
213
190
|
end
|
214
191
|
end
|
215
192
|
|
216
|
-
def verify_model(model)
|
217
|
-
return unless model
|
218
|
-
|
219
|
-
raise Errno::ENOENT, model unless File.exist?(model)
|
220
|
-
raise Errno::ENOTDIR, model unless File.directory?(model)
|
221
|
-
|
222
|
-
model
|
223
|
-
end
|
224
|
-
|
225
193
|
def read_model_prefs
|
226
194
|
return {} unless @model
|
227
195
|
|
@@ -242,17 +210,6 @@ module Selenium
|
|
242
210
|
File.basename(path, File.extname(path))
|
243
211
|
end
|
244
212
|
|
245
|
-
def create_tmp_copy(directory)
|
246
|
-
tmp_directory = Dir.mktmpdir("webdriver-rb-profilecopy")
|
247
|
-
|
248
|
-
# TODO: must be a better way..
|
249
|
-
FileUtils.rm_rf tmp_directory
|
250
|
-
FileUtils.mkdir_p File.dirname(tmp_directory), :mode => 0700
|
251
|
-
FileUtils.cp_r directory, tmp_directory
|
252
|
-
|
253
|
-
tmp_directory
|
254
|
-
end
|
255
|
-
|
256
213
|
def update_user_prefs_in(directory)
|
257
214
|
path = File.join(directory, 'user.js')
|
258
215
|
prefs = read_user_prefs(path)
|
@@ -3,24 +3,24 @@ module Selenium
|
|
3
3
|
module Support
|
4
4
|
|
5
5
|
class AbstractEventListener
|
6
|
-
def before_navigate_to(url) end
|
7
|
-
def after_navigate_to(url) end
|
8
|
-
def before_navigate_back() end
|
9
|
-
def after_navigate_back() end
|
10
|
-
def before_navigate_forward() end
|
11
|
-
def after_navigate_forward() end
|
12
|
-
def before_find(by, what) end
|
13
|
-
def after_find(by, what) end
|
14
|
-
def before_click(element) end
|
15
|
-
def after_click(element) end
|
16
|
-
def before_change_value_of(element) end
|
17
|
-
def after_change_value_of(element) end
|
18
|
-
def before_execute_script(script) end
|
19
|
-
def after_execute_script(script) end
|
20
|
-
def before_quit() end
|
21
|
-
def after_quit() end
|
22
|
-
def before_close() end
|
23
|
-
def after_close() end
|
6
|
+
def before_navigate_to(url, driver) end
|
7
|
+
def after_navigate_to(url, driver) end
|
8
|
+
def before_navigate_back(driver) end
|
9
|
+
def after_navigate_back(driver) end
|
10
|
+
def before_navigate_forward(driver) end
|
11
|
+
def after_navigate_forward(driver) end
|
12
|
+
def before_find(by, what, driver) end
|
13
|
+
def after_find(by, what, driver) end
|
14
|
+
def before_click(element, driver) end
|
15
|
+
def after_click(element, driver) end
|
16
|
+
def before_change_value_of(element, driver) end
|
17
|
+
def after_change_value_of(element, driver) end
|
18
|
+
def before_execute_script(script, driver) end
|
19
|
+
def after_execute_script(script, driver) end
|
20
|
+
def before_quit(driver) end
|
21
|
+
def after_quit(driver) end
|
22
|
+
def before_close(driver) end
|
23
|
+
def after_close(driver) end
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
@@ -18,43 +18,43 @@ module Selenium
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def get(url)
|
21
|
-
dispatch(:navigate_to, url) {
|
21
|
+
dispatch(:navigate_to, url, driver) {
|
22
22
|
@delegate.get(url)
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
26
26
|
def goForward
|
27
|
-
dispatch(:navigate_forward) {
|
27
|
+
dispatch(:navigate_forward, driver) {
|
28
28
|
@delegate.goForward
|
29
29
|
}
|
30
30
|
end
|
31
31
|
|
32
32
|
def goBack
|
33
|
-
dispatch(:navigate_back) {
|
33
|
+
dispatch(:navigate_back, driver) {
|
34
34
|
@delegate.goBack
|
35
35
|
}
|
36
36
|
end
|
37
37
|
|
38
38
|
def clickElement(ref)
|
39
|
-
dispatch(:click, create_element(ref)) {
|
39
|
+
dispatch(:click, create_element(ref), driver) {
|
40
40
|
@delegate.clickElement(ref)
|
41
41
|
}
|
42
42
|
end
|
43
43
|
|
44
44
|
def clearElement(ref)
|
45
|
-
dispatch(:change_value_of, create_element(ref)) {
|
45
|
+
dispatch(:change_value_of, create_element(ref), driver) {
|
46
46
|
@delegate.clearElement(ref)
|
47
47
|
}
|
48
48
|
end
|
49
49
|
|
50
50
|
def sendKeysToElement(ref, keys)
|
51
|
-
dispatch(:change_value_of, create_element(ref)) {
|
51
|
+
dispatch(:change_value_of, create_element(ref), driver) {
|
52
52
|
@delegate.sendKeysToElement(ref, keys)
|
53
53
|
}
|
54
54
|
end
|
55
55
|
|
56
56
|
def find_element_by(how, what, parent = nil)
|
57
|
-
e = dispatch(:find, how, what) {
|
57
|
+
e = dispatch(:find, how, what, driver) {
|
58
58
|
@delegate.find_element_by how, what, parent
|
59
59
|
}
|
60
60
|
|
@@ -62,7 +62,7 @@ module Selenium
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def find_elements_by(how, what, parent = nil)
|
65
|
-
es = dispatch(:find, how, what) {
|
65
|
+
es = dispatch(:find, how, what, driver) {
|
66
66
|
@delegate.find_elements_by(how, what, parent)
|
67
67
|
}
|
68
68
|
|
@@ -70,17 +70,17 @@ module Selenium
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def executeScript(script, *args)
|
73
|
-
dispatch(:execute_script, script) {
|
73
|
+
dispatch(:execute_script, script, driver) {
|
74
74
|
@delegate.executeScript(script, *args)
|
75
75
|
}
|
76
76
|
end
|
77
77
|
|
78
78
|
def quit
|
79
|
-
dispatch(:quit) { @delegate.quit }
|
79
|
+
dispatch(:quit, driver) { @delegate.quit }
|
80
80
|
end
|
81
81
|
|
82
82
|
def close
|
83
|
-
dispatch(:close) { @delegate.close }
|
83
|
+
dispatch(:close, driver) { @delegate.close }
|
84
84
|
end
|
85
85
|
|
86
86
|
private
|
@@ -90,6 +90,10 @@ module Selenium
|
|
90
90
|
Element.new @delegate, ref
|
91
91
|
end
|
92
92
|
|
93
|
+
def driver
|
94
|
+
@driver ||= Driver.new(self)
|
95
|
+
end
|
96
|
+
|
93
97
|
def dispatch(name, *args, &blk)
|
94
98
|
@listener.__send__("before_#{name}", *args)
|
95
99
|
returned = yield
|
metadata
CHANGED
@@ -1,137 +1,101 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium-webdriver
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.3.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 2
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 2.2.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Jari Bakken
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-08-01 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: json_pure
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2170962760 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: rubyzip
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: *2170962760
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rubyzip
|
27
|
+
requirement: &2170962280 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
46
33
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: childprocess
|
50
34
|
prerelease: false
|
51
|
-
|
35
|
+
version_requirements: *2170962280
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: childprocess
|
38
|
+
requirement: &2170948800 !ruby/object:Gem::Requirement
|
52
39
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
hash: 9
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
- 1
|
60
|
-
- 9
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
61
43
|
version: 0.1.9
|
62
44
|
type: :runtime
|
63
|
-
version_requirements: *id003
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: ffi
|
66
45
|
prerelease: false
|
67
|
-
|
46
|
+
version_requirements: *2170948800
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ffi
|
49
|
+
requirement: &2170948140 !ruby/object:Gem::Requirement
|
68
50
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
hash: 25
|
73
|
-
segments:
|
74
|
-
- 1
|
75
|
-
- 0
|
76
|
-
- 7
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
77
54
|
version: 1.0.7
|
78
55
|
type: :runtime
|
79
|
-
version_requirements: *id004
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: rspec
|
82
56
|
prerelease: false
|
83
|
-
|
57
|
+
version_requirements: *2170948140
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rspec
|
60
|
+
requirement: &2170947540 !ruby/object:Gem::Requirement
|
84
61
|
none: false
|
85
|
-
requirements:
|
62
|
+
requirements:
|
86
63
|
- - ~>
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
|
89
|
-
segments:
|
90
|
-
- 2
|
91
|
-
- 0
|
92
|
-
version: "2.0"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '2.0'
|
93
66
|
type: :development
|
94
|
-
version_requirements: *id005
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: rack
|
97
67
|
prerelease: false
|
98
|
-
|
68
|
+
version_requirements: *2170947540
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack
|
71
|
+
requirement: &2170946740 !ruby/object:Gem::Requirement
|
99
72
|
none: false
|
100
|
-
requirements:
|
73
|
+
requirements:
|
101
74
|
- - ~>
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
|
104
|
-
segments:
|
105
|
-
- 1
|
106
|
-
- 0
|
107
|
-
version: "1.0"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '1.0'
|
108
77
|
type: :development
|
109
|
-
version_requirements: *id006
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: ci_reporter
|
112
78
|
prerelease: false
|
113
|
-
|
79
|
+
version_requirements: *2170946740
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: ci_reporter
|
82
|
+
requirement: &2170946220 !ruby/object:Gem::Requirement
|
114
83
|
none: false
|
115
|
-
requirements:
|
84
|
+
requirements:
|
116
85
|
- - ~>
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
hash: 11
|
119
|
-
segments:
|
120
|
-
- 1
|
121
|
-
- 6
|
122
|
-
- 2
|
86
|
+
- !ruby/object:Gem::Version
|
123
87
|
version: 1.6.2
|
124
88
|
type: :development
|
125
|
-
|
126
|
-
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *2170946220
|
91
|
+
description: WebDriver is a tool for writing automated tests of websites. It aims
|
92
|
+
to mimic the behaviour of a real user, and as such interacts with the HTML of the
|
93
|
+
application.
|
127
94
|
email: jari.bakken@gmail.com
|
128
95
|
executables: []
|
129
|
-
|
130
96
|
extensions: []
|
131
|
-
|
132
97
|
extra_rdoc_files: []
|
133
|
-
|
134
|
-
files:
|
98
|
+
files:
|
135
99
|
- lib/selenium/client/base.rb
|
136
100
|
- lib/selenium/client/driver.rb
|
137
101
|
- lib/selenium/client/errors.rb
|
@@ -149,11 +113,13 @@ files:
|
|
149
113
|
- lib/selenium/webdriver/android/bridge.rb
|
150
114
|
- lib/selenium/webdriver/android.rb
|
151
115
|
- lib/selenium/webdriver/chrome/bridge.rb
|
116
|
+
- lib/selenium/webdriver/chrome/profile.rb
|
152
117
|
- lib/selenium/webdriver/chrome/service.rb
|
153
118
|
- lib/selenium/webdriver/chrome.rb
|
154
119
|
- lib/selenium/webdriver/common/action_builder.rb
|
155
120
|
- lib/selenium/webdriver/common/alert.rb
|
156
121
|
- lib/selenium/webdriver/common/bridge_helper.rb
|
122
|
+
- lib/selenium/webdriver/common/core_ext/base64.rb
|
157
123
|
- lib/selenium/webdriver/common/core_ext/dir.rb
|
158
124
|
- lib/selenium/webdriver/common/core_ext/string.rb
|
159
125
|
- lib/selenium/webdriver/common/driver.rb
|
@@ -170,6 +136,7 @@ files:
|
|
170
136
|
- lib/selenium/webdriver/common/options.rb
|
171
137
|
- lib/selenium/webdriver/common/platform.rb
|
172
138
|
- lib/selenium/webdriver/common/port_prober.rb
|
139
|
+
- lib/selenium/webdriver/common/profile_helper.rb
|
173
140
|
- lib/selenium/webdriver/common/proxy.rb
|
174
141
|
- lib/selenium/webdriver/common/search_context.rb
|
175
142
|
- lib/selenium/webdriver/common/socket_poller.rb
|
@@ -221,36 +188,26 @@ files:
|
|
221
188
|
- README
|
222
189
|
homepage: http://selenium.googlecode.com
|
223
190
|
licenses: []
|
224
|
-
|
225
191
|
post_install_message:
|
226
192
|
rdoc_options: []
|
227
|
-
|
228
|
-
require_paths:
|
193
|
+
require_paths:
|
229
194
|
- lib
|
230
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
195
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
231
196
|
none: false
|
232
|
-
requirements:
|
233
|
-
- -
|
234
|
-
- !ruby/object:Gem::Version
|
235
|
-
|
236
|
-
|
237
|
-
- 0
|
238
|
-
version: "0"
|
239
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
|
+
requirements:
|
198
|
+
- - ! '>='
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: '0'
|
201
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
240
202
|
none: false
|
241
|
-
requirements:
|
242
|
-
- -
|
243
|
-
- !ruby/object:Gem::Version
|
244
|
-
|
245
|
-
segments:
|
246
|
-
- 0
|
247
|
-
version: "0"
|
203
|
+
requirements:
|
204
|
+
- - ! '>='
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
version: '0'
|
248
207
|
requirements: []
|
249
|
-
|
250
208
|
rubyforge_project:
|
251
|
-
rubygems_version: 1.8.
|
209
|
+
rubygems_version: 1.8.6
|
252
210
|
signing_key:
|
253
211
|
specification_version: 3
|
254
212
|
summary: The next generation developer focused tool for automated testing of webapps
|
255
213
|
test_files: []
|
256
|
-
|