bbc-selenium-webdriver 1.17.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.
- 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,90 @@
|
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
describe Selenium::WebDriver::ActionBuilder do
|
|
4
|
+
let(:bridge) { mock("Bridge").as_null_object }
|
|
5
|
+
let(:keyboard) { mock(Selenium::WebDriver::Keyboard) }
|
|
6
|
+
let(:mouse) { mock(Selenium::WebDriver::Mouse) }
|
|
7
|
+
let(:element) { Selenium::WebDriver::Element.new(bridge, 'element') }
|
|
8
|
+
let(:builder) { Selenium::WebDriver::ActionBuilder.new(mouse, keyboard) }
|
|
9
|
+
|
|
10
|
+
it "should create all keyboard actions" do
|
|
11
|
+
keyboard.should_receive(:press).with(:shift)
|
|
12
|
+
keyboard.should_receive(:send_keys).with("abc")
|
|
13
|
+
keyboard.should_receive(:release).with(:control)
|
|
14
|
+
|
|
15
|
+
builder.key_down(:shift).
|
|
16
|
+
send_keys("abc").
|
|
17
|
+
key_up(:control).perform
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should pass an element to keyboard actions" do
|
|
21
|
+
mouse.should_receive(:click).with(element)
|
|
22
|
+
keyboard.should_receive(:press).with(:shift)
|
|
23
|
+
|
|
24
|
+
builder.key_down(element, :shift).perform
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should allow supplying individual elements to keyboard actions" do
|
|
28
|
+
element2 = Selenium::WebDriver::Element.new(bridge, 'element2')
|
|
29
|
+
element3 = Selenium::WebDriver::Element.new(bridge, 'element3')
|
|
30
|
+
|
|
31
|
+
mouse.should_receive(:click).with(element)
|
|
32
|
+
keyboard.should_receive(:press).with(:shift)
|
|
33
|
+
mouse.should_receive(:click).with(element2)
|
|
34
|
+
keyboard.should_receive(:send_keys).with("abc")
|
|
35
|
+
mouse.should_receive(:click).with(element3)
|
|
36
|
+
keyboard.should_receive(:release).with(:control)
|
|
37
|
+
|
|
38
|
+
builder.key_down(element, :shift ).
|
|
39
|
+
send_keys(element2, "abc").
|
|
40
|
+
key_up(element3, :control).perform
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should create all mouse actions" do
|
|
44
|
+
mouse.should_receive(:down).with(element)
|
|
45
|
+
mouse.should_receive(:up).with(element)
|
|
46
|
+
mouse.should_receive(:click).with(element)
|
|
47
|
+
mouse.should_receive(:double_click).with(element)
|
|
48
|
+
mouse.should_receive(:move_to).with(element)
|
|
49
|
+
mouse.should_receive(:context_click).with(element)
|
|
50
|
+
|
|
51
|
+
builder.click_and_hold(element).
|
|
52
|
+
release(element).
|
|
53
|
+
click(element).
|
|
54
|
+
double_click(element).
|
|
55
|
+
move_to(element).
|
|
56
|
+
context_click(element).perform
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should drag and drop" do
|
|
60
|
+
source = element
|
|
61
|
+
target = Selenium::WebDriver::Element.new(bridge, 'element2')
|
|
62
|
+
|
|
63
|
+
mouse.should_receive(:down).with(source)
|
|
64
|
+
mouse.should_receive(:move_to).with(target)
|
|
65
|
+
mouse.should_receive(:up)
|
|
66
|
+
|
|
67
|
+
builder.drag_and_drop(source, target).perform
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should drag and drop with offsets" do
|
|
71
|
+
source = element
|
|
72
|
+
|
|
73
|
+
mouse.should_receive(:down).with(source)
|
|
74
|
+
mouse.should_receive(:move_by).with(-300, 400)
|
|
75
|
+
mouse.should_receive(:up)
|
|
76
|
+
|
|
77
|
+
builder.drag_and_drop_by(source, -300, 400).perform
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "can move the mouse by coordinates" do
|
|
81
|
+
mouse.should_receive(:down).with(element)
|
|
82
|
+
mouse.should_receive(:move_by).with(-300, 400)
|
|
83
|
+
mouse.should_receive(:up)
|
|
84
|
+
|
|
85
|
+
builder.click_and_hold(element).
|
|
86
|
+
move_by(-300, 400).
|
|
87
|
+
release.perform
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
module Android
|
|
7
|
+
describe Android do
|
|
8
|
+
let(:default_url) { URI.parse(Android::Bridge::DEFAULT_URL) }
|
|
9
|
+
let(:resp) { {"sessionId" => "foo", "value" => Remote::Capabilities.android.as_json }}
|
|
10
|
+
let(:http) { mock(Remote::Http::Default, :call => resp).as_null_object }
|
|
11
|
+
|
|
12
|
+
it "uses the default Android driver URL" do
|
|
13
|
+
http.should_receive(:server_url=).with default_url
|
|
14
|
+
Bridge.new(:http_client => http)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "uses the user-provided URL" do
|
|
18
|
+
http.should_receive(:server_url=).with URI.parse("http://example.com")
|
|
19
|
+
Bridge.new(:http_client => http, :url => "http://example.com")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "uses the default HTTP client when none is specified" do
|
|
23
|
+
Remote::Http::Default.should_receive(:new).and_return http
|
|
24
|
+
Bridge.new
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end # IPhone
|
|
29
|
+
end # WebDriver
|
|
30
|
+
end # Selenium
|
|
31
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
module Chrome
|
|
7
|
+
|
|
8
|
+
describe Bridge do
|
|
9
|
+
let(:resp) { {"sessionId" => "foo", "value" => @default_capabilities }}
|
|
10
|
+
let(:service) { mock(Service, :start => true, :uri => "http://example.com") }
|
|
11
|
+
let(:caps) { {} }
|
|
12
|
+
let(:http) { mock(Remote::Http::Default, :call => resp).as_null_object }
|
|
13
|
+
|
|
14
|
+
before do
|
|
15
|
+
@default_capabilities = Remote::Capabilities.chrome.as_json
|
|
16
|
+
|
|
17
|
+
Remote::Capabilities.stub!(:chrome).and_return(caps)
|
|
18
|
+
Service.stub!(:default_service).and_return(service)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "sets the nativeEvents capability" do
|
|
22
|
+
Bridge.new(:http_client => http, :native_events => true)
|
|
23
|
+
|
|
24
|
+
caps['chromeOptions']['nativeEvents'].should be_true
|
|
25
|
+
caps['chrome.nativeEvents'].should be_true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "sets the args capability" do
|
|
29
|
+
Bridge.new(:http_client => http, :args => %w[--foo=bar])
|
|
30
|
+
|
|
31
|
+
caps['chromeOptions']['args'].should == %w[--foo=bar]
|
|
32
|
+
caps['chrome.switches'].should == %w[--foo=bar]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "sets the proxy capabilitiy" do
|
|
36
|
+
proxy = Proxy.new(:http => "localhost:1234")
|
|
37
|
+
Bridge.new(:http_client => http, :proxy => proxy)
|
|
38
|
+
|
|
39
|
+
caps['proxy'].should == proxy
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "sets the chrome.verbose capability" do
|
|
43
|
+
Bridge.new(:http_client => http, :verbose => true)
|
|
44
|
+
|
|
45
|
+
caps['chromeOptions']['verbose'].should be_true
|
|
46
|
+
caps['chrome.verbose'].should be_true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "sets the chrome.detach capability" do
|
|
50
|
+
Bridge.new(:http_client => http) # true by default
|
|
51
|
+
|
|
52
|
+
caps['chromeOptions']['detach'].should be_true
|
|
53
|
+
caps['chrome.detach'].should be_true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "lets the user override chrome.detach" do
|
|
57
|
+
Bridge.new(:http_client => http, :detach => false)
|
|
58
|
+
|
|
59
|
+
caps['chromeOptions']['detach'].should be_false
|
|
60
|
+
caps['chrome.detach'].should be_false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "uses the user-provided server URL if given" do
|
|
64
|
+
Service.should_not_receive(:default_service)
|
|
65
|
+
http.should_receive(:server_url=).with(URI.parse("http://example.com"))
|
|
66
|
+
|
|
67
|
+
Bridge.new(:http_client => http, :url => "http://example.com")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "raises an ArgumentError if args is not an Array" do
|
|
71
|
+
lambda { Bridge.new(:args => "--foo=bar")}.should raise_error(ArgumentError)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "uses the given profile" do
|
|
75
|
+
profile = Profile.new
|
|
76
|
+
|
|
77
|
+
profile['some_pref'] = true
|
|
78
|
+
profile.add_extension(__FILE__)
|
|
79
|
+
|
|
80
|
+
Bridge.new(:http_client => http, :profile => profile)
|
|
81
|
+
|
|
82
|
+
profile_data = profile.as_json
|
|
83
|
+
caps['chromeOptions']['profile'].should == profile_data['zip']
|
|
84
|
+
caps['chromeOptions']['extensions'].should == profile_data['extensions']
|
|
85
|
+
|
|
86
|
+
caps['chrome.profile'].should == profile_data['zip']
|
|
87
|
+
caps['chrome.extensions'].should == profile_data['extensions']
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end # Chrome
|
|
92
|
+
end # WebDriver
|
|
93
|
+
end # Selenium
|
|
94
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
module Chrome
|
|
7
|
+
|
|
8
|
+
describe Profile do
|
|
9
|
+
let(:profile) { Profile.new }
|
|
10
|
+
let(:model) { "/some/path" }
|
|
11
|
+
let(:model_profile) { Profile.new(model) }
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
File.stub!(:exist?).with(model).and_return true
|
|
15
|
+
File.stub!(:directory?).with(model).and_return true
|
|
16
|
+
|
|
17
|
+
Dir.stub!(:mktmpdir => "/tmp/some/path")
|
|
18
|
+
FileUtils.stub!(:rm_rf)
|
|
19
|
+
FileUtils.stub!(:mkdir_p)
|
|
20
|
+
FileUtils.stub!(:cp_r)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should set and get preference paths" do
|
|
24
|
+
profile['foo.bar.baz'] = true
|
|
25
|
+
profile['foo.bar.baz'].should == true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "reads existing prefs" do
|
|
29
|
+
File.should_receive(:read).with("/some/path/Default/Preferences").
|
|
30
|
+
and_return('{"autofill": {"enabled": false}}')
|
|
31
|
+
|
|
32
|
+
model_profile['autofill.enabled'].should == false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "writes out prefs" do
|
|
36
|
+
File.should_receive(:read).with("/some/path/Default/Preferences").
|
|
37
|
+
and_return('{"autofill": {"enabled": false}}')
|
|
38
|
+
|
|
39
|
+
model_profile['some.other.pref'] = 123
|
|
40
|
+
|
|
41
|
+
mock_io = StringIO.new
|
|
42
|
+
FileUtils.should_receive(:mkdir_p).with("/tmp/some/path/Default")
|
|
43
|
+
File.should_receive(:open).with("/tmp/some/path/Default/Preferences", "w").and_yield(mock_io)
|
|
44
|
+
|
|
45
|
+
model_profile.layout_on_disk
|
|
46
|
+
|
|
47
|
+
result = MultiJson.decode(mock_io.string)
|
|
48
|
+
|
|
49
|
+
result['autofill']['enabled'].should == false
|
|
50
|
+
result['some']['other']['pref'].should == 123
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end # Chrome
|
|
55
|
+
end # WebDriver
|
|
56
|
+
end # Selenium
|
|
57
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
module Selenium
|
|
4
|
+
module WebDriver
|
|
5
|
+
module Chrome
|
|
6
|
+
|
|
7
|
+
describe Service do
|
|
8
|
+
let(:mock_process) do
|
|
9
|
+
mock("ChildProcess", :io => mock.as_null_object, :start => true)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# ugh.
|
|
13
|
+
before { Service.instance_variable_set("@executable_path", nil) }
|
|
14
|
+
|
|
15
|
+
it "uses the user-provided path if set" do
|
|
16
|
+
Platform.stub!(:os => :unix)
|
|
17
|
+
Platform.stub!(:assert_executable).with("/some/path")
|
|
18
|
+
Chrome.driver_path = "/some/path"
|
|
19
|
+
|
|
20
|
+
ChildProcess.should_receive(:build).
|
|
21
|
+
with { |*args| args.first.should == "/some/path" }.
|
|
22
|
+
and_return(mock_process)
|
|
23
|
+
|
|
24
|
+
Service.default_service
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "finds the Chrome server binary by searching PATH" do
|
|
28
|
+
Platform.stub!(:os => :unix)
|
|
29
|
+
Platform.should_receive(:find_binary).once.and_return("/some/path")
|
|
30
|
+
Platform.should_receive(:assert_executable).with("/some/path")
|
|
31
|
+
|
|
32
|
+
Service.executable_path.should == "/some/path"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "raises a nice error if the server binary can't be found" do
|
|
36
|
+
Platform.stub!(:find_binary).and_return(nil)
|
|
37
|
+
|
|
38
|
+
lambda { Service.executable_path }.should raise_error(Error::WebDriverError, /code\.google\.com/)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end # Chrome
|
|
43
|
+
end # WebDriver
|
|
44
|
+
end # Selenium
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
module Selenium
|
|
4
|
+
module WebDriver
|
|
5
|
+
describe Error do
|
|
6
|
+
|
|
7
|
+
context "backwards compatibility" do
|
|
8
|
+
it "aliases StaleElementReferenceError as ObsoleteElementError" do
|
|
9
|
+
lambda {
|
|
10
|
+
raise Error::StaleElementReferenceError
|
|
11
|
+
}.should raise_error(Error::ObsoleteElementError)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "aliases UnknownError as UnhandledError" do
|
|
15
|
+
lambda {
|
|
16
|
+
raise Error::UnknownError
|
|
17
|
+
}.should raise_error(Error::UnhandledError)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "aliases JavascriptError as UnexpectedJavascriptError" do
|
|
21
|
+
lambda {
|
|
22
|
+
raise Error::JavascriptError
|
|
23
|
+
}.should raise_error(Error::UnexpectedJavascriptError)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "aliases NoAlertPresentError as NoAlertOpenError" do
|
|
27
|
+
lambda {
|
|
28
|
+
raise Error::NoAlertPresentError
|
|
29
|
+
}.should raise_error(Error::NoAlertOpenError)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "aliases ElementNotVisibleError as ElementNotDisplayedError" do
|
|
33
|
+
lambda {
|
|
34
|
+
raise Error::ElementNotVisibleError
|
|
35
|
+
}.should raise_error(Error::ElementNotDisplayedError)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
module Firefox
|
|
7
|
+
|
|
8
|
+
describe Bridge do
|
|
9
|
+
it "raises ArgumentError if passed invalid options" do
|
|
10
|
+
lambda { Bridge.new(:foo => 'bar') }.should raise_error(ArgumentError)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end # Firefox
|
|
15
|
+
end # WebDriver
|
|
16
|
+
end # Selenium
|
|
17
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
module IPhone
|
|
7
|
+
describe Bridge do
|
|
8
|
+
let(:default_url) { URI.parse(IPhone::Bridge::DEFAULT_URL) }
|
|
9
|
+
let(:resp) { {"sessionId" => "foo", "value" => Remote::Capabilities.iphone.as_json }}
|
|
10
|
+
let(:http) { mock(Remote::Http::Default, :call => resp).as_null_object }
|
|
11
|
+
|
|
12
|
+
it "uses the default iPhone driver URL" do
|
|
13
|
+
http.should_receive(:server_url=).with default_url
|
|
14
|
+
Bridge.new(:http_client => http)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "uses the user-provided URL" do
|
|
18
|
+
http.should_receive(:server_url=).with URI.parse("http://example.com")
|
|
19
|
+
Bridge.new(:http_client => http, :url => "http://example.com")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "uses the default HTTP client when none is specified" do
|
|
23
|
+
Remote::Http::Default.should_receive(:new).and_return http
|
|
24
|
+
Bridge.new
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end # IPhone
|
|
29
|
+
end # WebDriver
|
|
30
|
+
end # Selenium
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
module Selenium
|
|
4
|
+
module WebDriver
|
|
5
|
+
describe Proxy do
|
|
6
|
+
let :proxy_settings do
|
|
7
|
+
{
|
|
8
|
+
:ftp => "mythicalftpproxy:21",
|
|
9
|
+
:http => "mythicalproxy:80",
|
|
10
|
+
:no_proxy => "noproxy",
|
|
11
|
+
:ssl => "mythicalsslproxy",
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "raises ArgumentError if passed invalid options" do
|
|
16
|
+
lambda { Proxy.new(:invalid_options => 'invalid') }.should raise_error(ArgumentError)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "raises ArgumentError if passed an invalid proxy type" do
|
|
20
|
+
lambda { Proxy.new(:type => :invalid) }.should raise_error(ArgumentError)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "raises ArgumentError if the proxy type is changed" do
|
|
24
|
+
proxy = Proxy.new(:type => :manual)
|
|
25
|
+
lambda { proxy.type = :pac }.should raise_error(ArgumentError)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should allow valid options for a manual proxy" do
|
|
29
|
+
proxy = Proxy.new(proxy_settings)
|
|
30
|
+
|
|
31
|
+
proxy.ftp.should == proxy_settings[:ftp]
|
|
32
|
+
proxy.http.should == proxy_settings[:http]
|
|
33
|
+
proxy.no_proxy.should == proxy_settings[:no_proxy]
|
|
34
|
+
proxy.ssl.should == proxy_settings[:ssl]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return a hash of the json properties to serialize" do
|
|
38
|
+
proxy_json = Proxy.new(proxy_settings).as_json
|
|
39
|
+
|
|
40
|
+
proxy_json['proxyType'].should == "MANUAL"
|
|
41
|
+
proxy_json['ftpProxy'].should == proxy_settings[:ftp]
|
|
42
|
+
proxy_json['httpProxy'].should == proxy_settings[:http]
|
|
43
|
+
proxy_json['noProxy'].should == proxy_settings[:no_proxy]
|
|
44
|
+
proxy_json['sslProxy'].should == proxy_settings[:ssl]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should configure a PAC proxy" do
|
|
48
|
+
proxy_json = Proxy.new(:pac => "http://example.com/foo.pac").as_json
|
|
49
|
+
|
|
50
|
+
proxy_json['proxyType'].should == "PAC"
|
|
51
|
+
proxy_json['proxyAutoconfigUrl'].should == "http://example.com/foo.pac"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should configure an auto-detected proxy" do
|
|
55
|
+
proxy_json = Proxy.new(:auto_detect => true).as_json
|
|
56
|
+
|
|
57
|
+
proxy_json['proxyType'].should == "AUTODETECT"
|
|
58
|
+
proxy_json['autodetect'].should be_true
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should only add settings that are not nil" do
|
|
62
|
+
settings = {:type => :manual, :http => "http proxy"}
|
|
63
|
+
|
|
64
|
+
proxy = Proxy.new(settings)
|
|
65
|
+
proxy_json = proxy.as_json
|
|
66
|
+
|
|
67
|
+
proxy_json.delete('proxyType').should == settings[:type].to_s.upcase
|
|
68
|
+
proxy_json.delete('httpProxy').should == settings[:http]
|
|
69
|
+
|
|
70
|
+
proxy_json.should be_empty
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "returns a JSON string" do
|
|
74
|
+
proxy = Proxy.new(proxy_settings)
|
|
75
|
+
proxy.to_json.should be_kind_of(String)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "can be serialized and deserialized" do
|
|
79
|
+
proxy = Proxy.new(proxy_settings)
|
|
80
|
+
other = Proxy.json_create(proxy.as_json)
|
|
81
|
+
|
|
82
|
+
proxy.should == other
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|