bbc-selenium-webdriver 1.17.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +473 -0
- data/README +31 -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 +118 -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 +223 -0
- data/lib/selenium/webdriver.rb +64 -0
- data/lib/selenium/webdriver/android.rb +9 -0
- data/lib/selenium/webdriver/android/bridge.rb +51 -0
- data/lib/selenium/webdriver/chrome.rb +26 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +106 -0
- data/lib/selenium/webdriver/chrome/profile.rb +83 -0
- data/lib/selenium/webdriver/chrome/service.rb +74 -0
- data/lib/selenium/webdriver/common.rb +30 -0
- data/lib/selenium/webdriver/common/action_builder.rb +352 -0
- data/lib/selenium/webdriver/common/alert.rb +26 -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_input_devices.rb +39 -0
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +44 -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 +262 -0
- data/lib/selenium/webdriver/common/error.rb +212 -0
- data/lib/selenium/webdriver/common/file_reaper.rb +47 -0
- data/lib/selenium/webdriver/common/keyboard.rb +52 -0
- data/lib/selenium/webdriver/common/keys.rb +109 -0
- data/lib/selenium/webdriver/common/mouse.rb +65 -0
- data/lib/selenium/webdriver/common/navigation.rb +43 -0
- data/lib/selenium/webdriver/common/options.rb +128 -0
- data/lib/selenium/webdriver/common/platform.rb +166 -0
- data/lib/selenium/webdriver/common/port_prober.rb +25 -0
- data/lib/selenium/webdriver/common/profile_helper.rb +67 -0
- data/lib/selenium/webdriver/common/proxy.rb +120 -0
- data/lib/selenium/webdriver/common/search_context.rb +92 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +100 -0
- data/lib/selenium/webdriver/common/target_locator.rb +81 -0
- data/lib/selenium/webdriver/common/timeouts.rb +29 -0
- data/lib/selenium/webdriver/common/wait.rb +60 -0
- data/lib/selenium/webdriver/common/window.rb +96 -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 +161 -0
- data/lib/selenium/webdriver/firefox/bridge.rb +58 -0
- data/lib/selenium/webdriver/firefox/extension.rb +52 -0
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +104 -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 +315 -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 +60 -0
- data/lib/selenium/webdriver/ie/native/win32/IEDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/native/x64/IEDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/server.rb +64 -0
- data/lib/selenium/webdriver/iphone.rb +9 -0
- data/lib/selenium/webdriver/iphone/bridge.rb +50 -0
- data/lib/selenium/webdriver/opera.rb +24 -0
- data/lib/selenium/webdriver/opera/bridge.rb +113 -0
- data/lib/selenium/webdriver/opera/service.rb +49 -0
- data/lib/selenium/webdriver/remote.rb +21 -0
- data/lib/selenium/webdriver/remote/bridge.rb +473 -0
- data/lib/selenium/webdriver/remote/capabilities.rb +241 -0
- data/lib/selenium/webdriver/remote/commands.rb +181 -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 +102 -0
- data/lib/selenium/webdriver/remote/http/persistent.rb +38 -0
- data/lib/selenium/webdriver/remote/response.rb +99 -0
- data/lib/selenium/webdriver/remote/server_error.rb +17 -0
- data/lib/selenium/webdriver/support.rb +4 -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/event_firing_bridge.rb +112 -0
- data/lib/selenium/webdriver/support/select.rb +293 -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 +29 -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/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 +125 -0
- data/spec/integration/selenium/webdriver/chrome/driver_spec.rb +28 -0
- data/spec/integration/selenium/webdriver/chrome/profile_spec.rb +42 -0
- data/spec/integration/selenium/webdriver/driver_spec.rb +253 -0
- data/spec/integration/selenium/webdriver/element_spec.rb +185 -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/mouse_spec.rb +55 -0
- data/spec/integration/selenium/webdriver/navigation_spec.rb +44 -0
- data/spec/integration/selenium/webdriver/opera/driver_spec.rb +47 -0
- data/spec/integration/selenium/webdriver/options_spec.rb +49 -0
- data/spec/integration/selenium/webdriver/remote/element_spec.rb +24 -0
- data/spec/integration/selenium/webdriver/spec_helper.rb +44 -0
- data/spec/integration/selenium/webdriver/spec_support.rb +13 -0
- data/spec/integration/selenium/webdriver/spec_support/guards.rb +86 -0
- data/spec/integration/selenium/webdriver/spec_support/helpers.rb +46 -0
- data/spec/integration/selenium/webdriver/spec_support/jruby_test_environment.rb +29 -0
- data/spec/integration/selenium/webdriver/spec_support/rack_server.rb +123 -0
- data/spec/integration/selenium/webdriver/spec_support/test_environment.rb +199 -0
- data/spec/integration/selenium/webdriver/target_locator_spec.rb +170 -0
- data/spec/integration/selenium/webdriver/timeout_spec.rb +56 -0
- data/spec/integration/selenium/webdriver/window_spec.rb +56 -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 +131 -0
- data/spec/unit/selenium/webdriver/action_builder_spec.rb +90 -0
- data/spec/unit/selenium/webdriver/android/bridge_spec.rb +31 -0
- data/spec/unit/selenium/webdriver/chrome/bridge_spec.rb +94 -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 +17 -0
- data/spec/unit/selenium/webdriver/iphone/bridge_spec.rb +30 -0
- data/spec/unit/selenium/webdriver/proxy_spec.rb +87 -0
- data/spec/unit/selenium/webdriver/remote/bridge_spec.rb +16 -0
- data/spec/unit/selenium/webdriver/remote/capabilities_spec.rb +111 -0
- data/spec/unit/selenium/webdriver/remote/http/common_spec.rb +24 -0
- data/spec/unit/selenium/webdriver/remote/http/default_spec.rb +46 -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 +6 -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 +40 -0
- metadata +215 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
<htmL>
|
2
|
+
<head>
|
3
|
+
<title>Prototype - Selenium Ruby Client Sample App</title>
|
4
|
+
<script type="application/x-javascript" src="/prototype-1.6.0.3.js"></script>
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<h1 id="title">Prototype - Selenium Ruby Client Sample App</h1>
|
8
|
+
|
9
|
+
<div id="element-present-demo">
|
10
|
+
<h2>Element / Text Present</h2>
|
11
|
+
<input type="button" id="create-element-button" value="Create Mojo" />
|
12
|
+
<input type="button" id="delete-element-button" value="Destroy Mojo" />
|
13
|
+
|
14
|
+
<script type="text/javascript" language="javascript">
|
15
|
+
Event.observe(window, 'load', function() {
|
16
|
+
|
17
|
+
Event.observe('create-element-button', 'click', function (event) {
|
18
|
+
$('element-present-demo').insert('<div id="new-element">We All Need ' + 'Some Mojo</div>');
|
19
|
+
});
|
20
|
+
|
21
|
+
Event.observe('delete-element-button', 'click', function (event) {
|
22
|
+
$('new-element').remove();
|
23
|
+
});
|
24
|
+
});
|
25
|
+
</script>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div id="regexp-support">
|
29
|
+
<div id="dangerous-characters">There are some dangerous characters here: ' / \</div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<div id="ajax-demo">
|
33
|
+
<h2>AJAX Calculator</h2>
|
34
|
+
<form id="calculator-form" action="#" method="post" onSubmit="return false;">
|
35
|
+
<input id="calculator-expression" name="calculator-expression"/>
|
36
|
+
<input type="submit" id="calculator-button" value="Compute" />
|
37
|
+
<br/><br/>
|
38
|
+
<div>Result: <input id="calculator-result" disabled /></div>
|
39
|
+
</form>
|
40
|
+
|
41
|
+
<script type="text/javascript" language="javascript">
|
42
|
+
Event.observe(window, 'load', function() {
|
43
|
+
|
44
|
+
Event.observe('calculator-button', 'click', function (event) {
|
45
|
+
new Ajax.Request('/compute', {
|
46
|
+
method: 'post',
|
47
|
+
parameters: $('calculator-form').serialize(true),
|
48
|
+
onSuccess: function(transport) {
|
49
|
+
$('calculator-result').value = transport.responseText;
|
50
|
+
},
|
51
|
+
});
|
52
|
+
return false;
|
53
|
+
});
|
54
|
+
|
55
|
+
});
|
56
|
+
</script>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
</body>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rack'
|
3
|
+
require 'webrick'
|
4
|
+
|
5
|
+
# TODO: Use Selenium::WebDriver::SpecSupport::RackServer?
|
6
|
+
class SampleApp
|
7
|
+
|
8
|
+
def self.start(host, port)
|
9
|
+
Rack::Handler::WEBrick.run(new, :Host => host, :Port => port)
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@public = Rack::File.new(File.expand_path("../public", __FILE__))
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
req = Rack::Request.new(env)
|
18
|
+
|
19
|
+
case req.path
|
20
|
+
when "/"
|
21
|
+
[200, {}, ["Selenium Ruby Client Sample Application"]]
|
22
|
+
when "/compute"
|
23
|
+
sleep 5
|
24
|
+
resp = eval(req.params['calculator-expression']).to_s
|
25
|
+
[200, {}, [resp]]
|
26
|
+
else
|
27
|
+
@public.call(env)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'selenium/client'
|
3
|
+
require 'tmpdir'
|
4
|
+
require File.expand_path('../sample-app/sample_app', __FILE__)
|
5
|
+
|
6
|
+
# for bamboo
|
7
|
+
require 'ci/reporter/rspec'
|
8
|
+
|
9
|
+
class SeleniumClientTestEnvironment
|
10
|
+
def initialize
|
11
|
+
$stdout.sync = true
|
12
|
+
@jar = File.expand_path("../../../../../../build/java/server/test/org/openqa/selenium/server-with-tests-standalone.jar", __FILE__)
|
13
|
+
|
14
|
+
raise Errno::ENOENT, @jar unless File.exist?(@jar)
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
start_server
|
19
|
+
start_example_app
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def stop
|
25
|
+
stop_example_app
|
26
|
+
stop_server
|
27
|
+
end
|
28
|
+
|
29
|
+
def driver
|
30
|
+
@driver ||= new_driver_with_session
|
31
|
+
end
|
32
|
+
|
33
|
+
def in_separate_driver
|
34
|
+
@driver.stop if @driver
|
35
|
+
begin
|
36
|
+
@driver = new_driver_with_session
|
37
|
+
yield
|
38
|
+
ensure
|
39
|
+
@driver.stop
|
40
|
+
@driver = new_driver_with_session
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def new_driver_with_session
|
47
|
+
application_host = ENV['SELENIUM_APPLICATION_HOST'] || "localhost"
|
48
|
+
application_port = ENV['SELENIUM_APPLICATION_PORT'] || "4567"
|
49
|
+
url = "http://#{application_host}:#{application_port}"
|
50
|
+
|
51
|
+
driver = Selenium::Client::Driver.new :host => (ENV['SELENIUM_RC_HOST'] || "localhost"),
|
52
|
+
:port => (ENV['SELENIUM_RC_PORT'] || 4444),
|
53
|
+
:browser => (ENV['SELENIUM_BROWSER'] || "*firefox"),
|
54
|
+
:timeout_in_seconds => (ENV['SELENIUM_RC_TIMEOUT'] || 20),
|
55
|
+
:url => url
|
56
|
+
|
57
|
+
driver.start_new_browser_session
|
58
|
+
driver.set_context self.class.name
|
59
|
+
|
60
|
+
driver
|
61
|
+
end
|
62
|
+
|
63
|
+
def start_server
|
64
|
+
@server = Selenium::Server.new(@jar, :background => true,
|
65
|
+
:timeout => 3*60,
|
66
|
+
:port => 4444,
|
67
|
+
:log => true)
|
68
|
+
|
69
|
+
@server << "-singleWindow"
|
70
|
+
@server.start
|
71
|
+
end
|
72
|
+
|
73
|
+
def stop_server
|
74
|
+
@server && @server.stop
|
75
|
+
end
|
76
|
+
|
77
|
+
def start_example_app
|
78
|
+
Thread.abort_on_exception = true
|
79
|
+
@example_app = Thread.new { SampleApp.start("127.0.0.1", 4567) }
|
80
|
+
|
81
|
+
poller = Selenium::WebDriver::SocketPoller.new("127.0.0.1", 4567, 60)
|
82
|
+
unless poller.connected?
|
83
|
+
raise "timed out waiting for SampleApp to launch"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def stop_example_app
|
88
|
+
@example_app.kill
|
89
|
+
end
|
90
|
+
end # SeleniumClientTestEnvironment
|
91
|
+
|
92
|
+
|
93
|
+
RSpec.configure do |config|
|
94
|
+
|
95
|
+
config.after(:suite) do
|
96
|
+
$selenium_client_test_environment && $selenium_client_test_environment.stop
|
97
|
+
end
|
98
|
+
|
99
|
+
def selenium_driver
|
100
|
+
test_environment.driver
|
101
|
+
end
|
102
|
+
alias :page :selenium_driver
|
103
|
+
|
104
|
+
def test_environment
|
105
|
+
$selenium_client_test_environment ||= SeleniumClientTestEnvironment.new.run
|
106
|
+
end
|
107
|
+
|
108
|
+
def in_separate_driver(&blk)
|
109
|
+
test_environment.in_separate_driver(&blk)
|
110
|
+
end
|
111
|
+
|
112
|
+
def should_timeout
|
113
|
+
begin
|
114
|
+
yield
|
115
|
+
raise "Should have timed out"
|
116
|
+
rescue Timeout::Error => e
|
117
|
+
# All good
|
118
|
+
rescue Selenium::Client::CommandError => e
|
119
|
+
raise unless e.message =~ /ed out after/
|
120
|
+
# All good
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Chrome
|
4
|
+
|
5
|
+
describe Driver do
|
6
|
+
it "should accept an array of custom command line arguments" do
|
7
|
+
begin
|
8
|
+
driver = Selenium::WebDriver.for :chrome, :args => ["--user-agent=foo;bar"]
|
9
|
+
driver.navigate.to url_for("click_jacker.html")
|
10
|
+
|
11
|
+
ua = driver.execute_script "return window.navigator.userAgent"
|
12
|
+
ua.should == "foo;bar"
|
13
|
+
ensure
|
14
|
+
driver.quit if driver
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should raise ArgumentError if :args is not an Array" do
|
19
|
+
lambda {
|
20
|
+
Selenium::WebDriver.for(:chrome, :args => "--foo")
|
21
|
+
}.should raise_error(ArgumentError)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end # Chrome
|
26
|
+
end # WebDriver
|
27
|
+
end # Selenium
|
28
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Chrome
|
4
|
+
|
5
|
+
describe Profile do
|
6
|
+
let(:profile) { Profile.new }
|
7
|
+
|
8
|
+
it "launches Chrome with a custom profile" do
|
9
|
+
profile['autofill.disabled'] = true
|
10
|
+
|
11
|
+
begin
|
12
|
+
driver = WebDriver.for :chrome, :profile => profile
|
13
|
+
ensure
|
14
|
+
driver.quit if driver
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be serializable to JSON" do
|
19
|
+
profile['foo.boolean'] = true
|
20
|
+
|
21
|
+
new_profile = Profile.from_json(profile.to_json)
|
22
|
+
new_profile['foo.boolean'].should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "adds an extension" do
|
26
|
+
ext_path = "/some/path.crx"
|
27
|
+
|
28
|
+
File.should_receive(:file?).with(ext_path).and_return true
|
29
|
+
profile.add_extension(ext_path).should == [ext_path]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "raises an error if the extension doesn't exist" do
|
33
|
+
lambda {
|
34
|
+
profile.add_extension("/not/likely/to/exist.crx")
|
35
|
+
}.should raise_error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end # Chrome
|
40
|
+
end # WebDriver
|
41
|
+
end # Selenium
|
42
|
+
|
@@ -0,0 +1,253 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe "Driver" do
|
4
|
+
it "should get the page title" do
|
5
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
6
|
+
driver.title.should == "XHTML Test Page"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should get the page source" do
|
10
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
11
|
+
driver.page_source.should match(%r[<title>XHTML Test Page</title>]i)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should refresh the page" do
|
15
|
+
driver.navigate.to url_for("javascriptPage.html")
|
16
|
+
driver.find_element(:link_text, 'Update a div').click
|
17
|
+
driver.find_element(:id, 'dynamo').text.should == "Fish and chips!"
|
18
|
+
driver.navigate.refresh
|
19
|
+
driver.find_element(:id, 'dynamo').text.should == "What's for dinner?"
|
20
|
+
end
|
21
|
+
|
22
|
+
not_compliant_on({:browser => [:opera, :iphone]}) do
|
23
|
+
it "should save a screenshot" do
|
24
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
25
|
+
path = "screenshot_tmp.png"
|
26
|
+
|
27
|
+
begin
|
28
|
+
driver.save_screenshot path
|
29
|
+
File.exist?(path).should be_true # sic
|
30
|
+
File.size(path).should > 0
|
31
|
+
ensure
|
32
|
+
File.delete(path) if File.exist?(path)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return a screenshot in the specified format" do
|
37
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
38
|
+
|
39
|
+
ss = driver.screenshot_as(:png)
|
40
|
+
ss.should be_kind_of(String)
|
41
|
+
ss.size.should > 0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it "raises an error when given an unknown format" do
|
46
|
+
lambda { driver.screenshot_as(:jpeg) }.should raise_error(WebDriver::Error::UnsupportedOperationError)
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "one element" do
|
50
|
+
it "should find by id" do
|
51
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
52
|
+
element = driver.find_element(:id, "id1")
|
53
|
+
element.should be_kind_of(WebDriver::Element)
|
54
|
+
element.text.should == "Foo"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should find by field name" do
|
58
|
+
driver.navigate.to url_for("formPage.html")
|
59
|
+
driver.find_element(:name, "x").attribute('value').should == "name"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should find by class name" do
|
63
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
64
|
+
driver.find_element(:class, "header").text.should == "XHTML Might Be The Future"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should find by link text" do
|
68
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
69
|
+
driver.find_element(:link, "Foo").text.should == "Foo"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should find by xpath" do
|
73
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
74
|
+
driver.find_element(:xpath, "//h1").text.should == "XHTML Might Be The Future"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should find by css selector" do
|
78
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
79
|
+
driver.find_element(:css, "div.content").attribute("class").should == "content"
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should find by tag name" do
|
83
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
84
|
+
driver.find_element(:tag_name, 'div').attribute("class").should == "navigation"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should find child element" do
|
88
|
+
driver.navigate.to url_for("nestedElements.html")
|
89
|
+
|
90
|
+
element = driver.find_element(:name, "form2")
|
91
|
+
child = element.find_element(:name, "selectomatic")
|
92
|
+
|
93
|
+
child.attribute("id").should == "2"
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should find child element by tag name" do
|
97
|
+
driver.navigate.to url_for("nestedElements.html")
|
98
|
+
|
99
|
+
element = driver.find_element(:name, "form2")
|
100
|
+
child = element.find_element(:tag_name, "select")
|
101
|
+
|
102
|
+
child.attribute("id").should == "2"
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should raise on nonexistant element" do
|
106
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
107
|
+
lambda { driver.find_element("nonexistant") }.should raise_error
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should find elements with a hash selector" do
|
111
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
112
|
+
driver.find_element(:class => "header").text.should == "XHTML Might Be The Future"
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should find elements with the shortcut syntax" do
|
116
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
117
|
+
|
118
|
+
driver[:id1].should be_kind_of(WebDriver::Element)
|
119
|
+
driver[:xpath => "//h1"].should be_kind_of(WebDriver::Element)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "many elements" do
|
124
|
+
it "should find by class name" do
|
125
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
126
|
+
driver.find_elements(:class, "nameC").should have(2).things
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should find by css selector" do
|
130
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
131
|
+
driver.find_elements(:css, 'p')
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should find children by field name" do
|
135
|
+
driver.navigate.to url_for("nestedElements.html")
|
136
|
+
element = driver.find_element(:name, "form2")
|
137
|
+
children = element.find_elements(:name, "selectomatic")
|
138
|
+
children.should have(2).items
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "execute script" do
|
143
|
+
it "should return strings" do
|
144
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
145
|
+
driver.execute_script("return document.title;").should == "XHTML Test Page"
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should return numbers" do
|
149
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
150
|
+
driver.execute_script("return document.title.length;").should == "XHTML Test Page".length
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should return elements" do
|
154
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
155
|
+
element = driver.execute_script("return document.getElementById('id1');")
|
156
|
+
element.should be_kind_of(WebDriver::Element)
|
157
|
+
element.text.should == "Foo"
|
158
|
+
end
|
159
|
+
|
160
|
+
not_compliant_on :browser => [:opera, :android] do
|
161
|
+
it "should unwrap elements in deep objects" do
|
162
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
163
|
+
result = driver.execute_script(<<-SCRIPT)
|
164
|
+
var e1 = document.getElementById('id1');
|
165
|
+
var body = document.body;
|
166
|
+
|
167
|
+
return {
|
168
|
+
elements: {'body' : body, other: [e1] }
|
169
|
+
};
|
170
|
+
SCRIPT
|
171
|
+
|
172
|
+
result.should be_kind_of(Hash)
|
173
|
+
result['elements']['body'].should be_kind_of(WebDriver::Element)
|
174
|
+
result['elements']['other'].first.should be_kind_of(WebDriver::Element)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should return booleans" do
|
179
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
180
|
+
driver.execute_script("return true;").should == true
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should raise if the script is bad" do
|
184
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
185
|
+
lambda { driver.execute_script("return squiggle();") }.should raise_error
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should return arrays" do
|
189
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
190
|
+
driver.execute_script('return ["zero", "one", "two"];').should == %w[zero one two]
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should be able to call functions on the page" do
|
194
|
+
driver.navigate.to url_for("javascriptPage.html")
|
195
|
+
driver.execute_script("displayMessage('I like cheese');")
|
196
|
+
driver.find_element(:id, "result").text.strip.should == "I like cheese"
|
197
|
+
end
|
198
|
+
|
199
|
+
it "should be able to pass string arguments" do
|
200
|
+
driver.navigate.to url_for("javascriptPage.html")
|
201
|
+
driver.execute_script("return arguments[0] == 'fish' ? 'fish' : 'not fish';", "fish").should == "fish"
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should be able to pass boolean arguments" do
|
205
|
+
driver.navigate.to url_for("javascriptPage.html")
|
206
|
+
driver.execute_script("return arguments[0] == true;", true).should == true
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should be able to pass numeric arguments" do
|
210
|
+
driver.navigate.to url_for("javascriptPage.html")
|
211
|
+
driver.execute_script("return arguments[0] == 1 ? 1 : 0;", 1).should == 1
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should be able to pass element arguments" do
|
215
|
+
driver.navigate.to url_for("javascriptPage.html")
|
216
|
+
button = driver.find_element(:id, "plainButton")
|
217
|
+
driver.execute_script("arguments[0]['flibble'] = arguments[0].getAttribute('id'); return arguments[0]['flibble'];", button).should == "plainButton"
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should be able to pass in multiple arguments" do
|
221
|
+
driver.navigate.to url_for("javascriptPage.html")
|
222
|
+
driver.execute_script("return arguments[0] + arguments[1];", "one", "two").should == "onetwo"
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
not_compliant_on :browser => [:opera, :iphone, :android] do
|
227
|
+
describe "execute async script" do
|
228
|
+
before {
|
229
|
+
driver.manage.timeouts.script_timeout = 0
|
230
|
+
driver.navigate.to url_for("ajaxy_page.html")
|
231
|
+
}
|
232
|
+
|
233
|
+
it "should be able to return arrays of primitives from async scripts" do
|
234
|
+
result = driver.execute_async_script "arguments[arguments.length - 1]([null, 123, 'abc', true, false]);"
|
235
|
+
result.should == [nil, 123, 'abc', true, false]
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should be able to pass multiple arguments to async scripts" do
|
239
|
+
result = driver.execute_async_script "arguments[arguments.length - 1](arguments[0] + arguments[1]);", 1, 2
|
240
|
+
result.should == 3
|
241
|
+
end
|
242
|
+
|
243
|
+
it "times out if the callback is not invoked" do
|
244
|
+
lambda {
|
245
|
+
# Script is expected to be async and explicitly callback, so this should timeout.
|
246
|
+
driver.execute_async_script "return 1 + 2;"
|
247
|
+
}.should raise_error(Selenium::WebDriver::Error::ScriptTimeOutError)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|