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,44 @@
|
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "Navigation" do
|
|
4
|
+
let(:wait) { Selenium::WebDriver::Wait.new }
|
|
5
|
+
|
|
6
|
+
it "should navigate back and forward" do
|
|
7
|
+
form_title = "We Leave From Here"
|
|
8
|
+
result_title = "We Arrive Here"
|
|
9
|
+
form_url = url_for "formPage.html"
|
|
10
|
+
result_url = url_for "resultPage.html"
|
|
11
|
+
|
|
12
|
+
driver.navigate.to form_url
|
|
13
|
+
driver.title.should == form_title
|
|
14
|
+
|
|
15
|
+
driver.find_element(:id, 'imageButton').submit
|
|
16
|
+
wait.until { driver.title != form_title }
|
|
17
|
+
|
|
18
|
+
driver.current_url.should include(result_url)
|
|
19
|
+
driver.title.should == result_title
|
|
20
|
+
|
|
21
|
+
driver.navigate.back
|
|
22
|
+
|
|
23
|
+
driver.current_url.should include(form_url)
|
|
24
|
+
driver.title.should == form_title
|
|
25
|
+
|
|
26
|
+
driver.navigate.forward
|
|
27
|
+
driver.current_url.should include(result_url)
|
|
28
|
+
driver.title.should == result_title
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should refresh the page" do
|
|
32
|
+
changed_title = "Changed"
|
|
33
|
+
|
|
34
|
+
driver.navigate.to url_for("javascriptPage.html")
|
|
35
|
+
driver.find_element(:link_text, "Change the page title!").click
|
|
36
|
+
driver.title.should == changed_title
|
|
37
|
+
|
|
38
|
+
driver.navigate.refresh
|
|
39
|
+
wait.until { driver.title != changed_title }
|
|
40
|
+
|
|
41
|
+
driver.title.should == "Testing Javascript"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module Opera
|
|
4
|
+
|
|
5
|
+
describe Driver do
|
|
6
|
+
|
|
7
|
+
before(:all) { GlobalTestEnv.quit_driver rescue nil }
|
|
8
|
+
|
|
9
|
+
it 'raises ArgumentError if sent an unknown capability as an argument' do
|
|
10
|
+
lambda {
|
|
11
|
+
Selenium::WebDriver.for :opera, :foo => 'bar'
|
|
12
|
+
}.should raise_error(ArgumentError)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'accepts an array of custom command-line arguments' do
|
|
16
|
+
begin
|
|
17
|
+
driver = Selenium::WebDriver.for :opera, :arguments => ['-geometry 800x600']
|
|
18
|
+
ensure
|
|
19
|
+
driver.quit if driver
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'raises ArgumentError if :arguments is not an Array' do
|
|
24
|
+
lambda {
|
|
25
|
+
Selenium::WebDriver.for :opera, :arguments => '-foo'
|
|
26
|
+
}.should raise_error(ArgumentError)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'accepts a valid logging level' do
|
|
30
|
+
begin
|
|
31
|
+
driver = Selenium::WebDriver.for :opera, :logging_level => :config
|
|
32
|
+
# TODO(andreastt): Validate output to console
|
|
33
|
+
ensure
|
|
34
|
+
driver.quit if driver
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'raises ArgumentError if :logging_level uses an invalid logging level' do
|
|
39
|
+
lambda {
|
|
40
|
+
Selenium::WebDriver.for :opera, :logging_level => :hoobaflooba
|
|
41
|
+
}.should raise_error(ArgumentError)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "Options" do
|
|
4
|
+
describe "cookie management" do
|
|
5
|
+
it "should get all" do
|
|
6
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
|
7
|
+
driver.manage.add_cookie :name => "foo", :value => "bar"
|
|
8
|
+
|
|
9
|
+
cookies = driver.manage.all_cookies
|
|
10
|
+
|
|
11
|
+
cookies.should have(1).things
|
|
12
|
+
cookies.first[:name].should == "foo"
|
|
13
|
+
cookies.first[:value].should == "bar"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should delete one" do
|
|
17
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
|
18
|
+
|
|
19
|
+
driver.manage.add_cookie :name => "foo", :value => "bar"
|
|
20
|
+
driver.manage.delete_cookie("foo")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should delete all" do
|
|
24
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
|
25
|
+
|
|
26
|
+
driver.manage.add_cookie :name => "foo", :value => "bar"
|
|
27
|
+
driver.manage.delete_all_cookies
|
|
28
|
+
driver.manage.all_cookies.should be_empty
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
not_compliant_on :browser => [:ie, :android, :iphone] do
|
|
32
|
+
it "should use DateTime for expires" do
|
|
33
|
+
driver.navigate.to url_for("xhtmlTest.html")
|
|
34
|
+
|
|
35
|
+
expected = DateTime.new(2039)
|
|
36
|
+
driver.manage.add_cookie :name => "foo",
|
|
37
|
+
:value => "bar",
|
|
38
|
+
:expires => expected
|
|
39
|
+
|
|
40
|
+
actual = driver.manage.cookie_named("foo")[:expires]
|
|
41
|
+
actual.should be_kind_of(DateTime)
|
|
42
|
+
actual.should == expected
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
describe Element do
|
|
4
|
+
before do
|
|
5
|
+
driver.file_detector = lambda { |str| __FILE__ }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
after do
|
|
9
|
+
driver.file_detector = nil
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "uses the file detector" do
|
|
13
|
+
driver.navigate.to url_for("upload.html")
|
|
14
|
+
|
|
15
|
+
driver.find_element(:id => "upload").send_keys("random string")
|
|
16
|
+
driver.find_element(:id => "go").submit
|
|
17
|
+
|
|
18
|
+
driver.switch_to.frame("upload_target")
|
|
19
|
+
body = driver.find_element(:xpath => "//body")
|
|
20
|
+
body.text.should include("uses the set file detector")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end # WebDriver
|
|
24
|
+
end # Selenium
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'time'
|
|
3
|
+
require 'rspec'
|
|
4
|
+
require 'ci/reporter/rspec'
|
|
5
|
+
|
|
6
|
+
require 'selenium-webdriver'
|
|
7
|
+
require 'selenium/webdriver/spec_support'
|
|
8
|
+
|
|
9
|
+
include Selenium
|
|
10
|
+
|
|
11
|
+
if WebDriver::Platform.jruby?
|
|
12
|
+
require 'java'
|
|
13
|
+
|
|
14
|
+
[
|
|
15
|
+
Dir['build/**/*.jar'],
|
|
16
|
+
Dir['third_party/java/{jetty,servlet-api}/*.jar']
|
|
17
|
+
].flatten.each { |jar| require jar }
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
GlobalTestEnv = WebDriver::SpecSupport::JRubyTestEnvironment.new
|
|
21
|
+
else
|
|
22
|
+
GlobalTestEnv = WebDriver::SpecSupport::TestEnvironment.new
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Object
|
|
26
|
+
include WebDriver::SpecSupport::Guards
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
RSpec.configure do |c|
|
|
30
|
+
c.include(WebDriver::SpecSupport::Helpers)
|
|
31
|
+
c.before(:suite) do
|
|
32
|
+
if GlobalTestEnv.driver == :remote
|
|
33
|
+
GlobalTestEnv.remote_server.start
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
c.after(:suite) do
|
|
38
|
+
GlobalTestEnv.quit_driver
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
WebDriver::Platform.exit_hook { GlobalTestEnv.quit }
|
|
43
|
+
|
|
44
|
+
$stdout.sync = true
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'selenium/server'
|
|
2
|
+
require 'selenium/webdriver/spec_support/test_environment'
|
|
3
|
+
require 'selenium/webdriver/spec_support/jruby_test_environment'
|
|
4
|
+
require 'selenium/webdriver/spec_support/guards'
|
|
5
|
+
require 'selenium/webdriver/spec_support/helpers'
|
|
6
|
+
|
|
7
|
+
module Selenium
|
|
8
|
+
module WebDriver
|
|
9
|
+
module SpecSupport
|
|
10
|
+
autoload :RackServer, 'selenium/webdriver/spec_support/rack_server'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module SpecSupport
|
|
4
|
+
module Guards
|
|
5
|
+
|
|
6
|
+
class << self
|
|
7
|
+
def guards
|
|
8
|
+
@guards ||= Hash.new { |hash, key| hash[key] = [] }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def record(guard_name, options, data)
|
|
12
|
+
options.each do |opts|
|
|
13
|
+
opts = current_env.merge(opts)
|
|
14
|
+
key = opts.values_at(:browser, :driver, :platform, :native).join('.')
|
|
15
|
+
guards[key] << [guard_name, data]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def report
|
|
20
|
+
key = [
|
|
21
|
+
GlobalTestEnv.browser,
|
|
22
|
+
GlobalTestEnv.driver,
|
|
23
|
+
Platform.os,
|
|
24
|
+
GlobalTestEnv.native_events?
|
|
25
|
+
].join(".")
|
|
26
|
+
|
|
27
|
+
gs = guards[key]
|
|
28
|
+
|
|
29
|
+
print "\n\nSpec guards for this implementation: "
|
|
30
|
+
|
|
31
|
+
if gs.empty?
|
|
32
|
+
puts "none."
|
|
33
|
+
else
|
|
34
|
+
puts
|
|
35
|
+
gs.each do |guard_name, data|
|
|
36
|
+
puts "\t#{guard_name.to_s.ljust(20)}: #{data.inspect}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def current_env
|
|
42
|
+
{
|
|
43
|
+
:browser => GlobalTestEnv.browser,
|
|
44
|
+
:driver => GlobalTestEnv.driver,
|
|
45
|
+
:platform => Platform.os,
|
|
46
|
+
:native => GlobalTestEnv.native_events?
|
|
47
|
+
}
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# not_compliant_on :browser => [:firefox, :chrome]
|
|
52
|
+
# - guard this spec for both firefox and chrome
|
|
53
|
+
#
|
|
54
|
+
# not_compliant_on {:browser => :chrome, :platform => :macosx}, {:browser => :opera}
|
|
55
|
+
# - guard this spec for Chrome on OSX and Opera on any OS
|
|
56
|
+
|
|
57
|
+
def env_matches?(opts)
|
|
58
|
+
opts.any? { |env|
|
|
59
|
+
env.all? { |key, value|
|
|
60
|
+
if value.kind_of?(Array)
|
|
61
|
+
value.include? current_env[key]
|
|
62
|
+
else
|
|
63
|
+
value == current_env[key]
|
|
64
|
+
end
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def not_compliant_on(*opts, &blk)
|
|
71
|
+
Guards.record(:not_compliant, opts, :file => caller.first)
|
|
72
|
+
yield unless Guards.env_matches?(opts)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def compliant_on(*opts, &blk)
|
|
76
|
+
Guards.record(:compliant_on, opts, :file => caller.first)
|
|
77
|
+
yield if Guards.env_matches?(opts)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
alias_method :not_compliant_when, :not_compliant_on
|
|
81
|
+
alias_method :compliant_when, :compliant_on
|
|
82
|
+
|
|
83
|
+
end # Guards
|
|
84
|
+
end # SpecSupport
|
|
85
|
+
end # WebDriver
|
|
86
|
+
end # Selenium
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module SpecSupport
|
|
4
|
+
module Helpers
|
|
5
|
+
|
|
6
|
+
def driver
|
|
7
|
+
GlobalTestEnv.driver_instance
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def reset_driver!
|
|
11
|
+
GlobalTestEnv.reset_driver!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def url_for(filename)
|
|
15
|
+
GlobalTestEnv.url_for filename
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def fix_windows_path(path)
|
|
19
|
+
return path unless WebDriver::Platform.os == :windows
|
|
20
|
+
|
|
21
|
+
if GlobalTestEnv.browser == :ie
|
|
22
|
+
path = path[%r[file://(.*)], 1]
|
|
23
|
+
path.gsub!("/", '\\')
|
|
24
|
+
|
|
25
|
+
"file://#{path}"
|
|
26
|
+
else
|
|
27
|
+
path.sub(%r[file:/{0,2}], "file:///")
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def long_wait
|
|
32
|
+
@long_wait ||= Wait.new(:timeout => 30)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def short_wait
|
|
36
|
+
@short_wait ||= Wait.new(:timeout => 3)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def wait(timeout = 10)
|
|
40
|
+
Wait.new(:timeout => timeout)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end # Helpers
|
|
44
|
+
end # SpecSupport
|
|
45
|
+
end # WebDriver
|
|
46
|
+
end # Selenium
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module SpecSupport
|
|
4
|
+
class JRubyTestEnvironment < TestEnvironment
|
|
5
|
+
|
|
6
|
+
def app_server
|
|
7
|
+
@app_server ||= in_process_test_environment.appServer
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def url_for(filename)
|
|
11
|
+
app_server.whereIs filename
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def quit
|
|
15
|
+
super
|
|
16
|
+
@in_process_test_environment.stop
|
|
17
|
+
@in_process_test_environment = nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def in_process_test_environment
|
|
23
|
+
@in_process_test_environment ||= org.openqa.selenium.environment.InProcessTestEnvironment.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end # JRubyTestEnvironmnet
|
|
27
|
+
end # SpecSupport
|
|
28
|
+
end # WebDriver
|
|
29
|
+
end # Selenium
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
require 'rack'
|
|
2
|
+
require 'socket'
|
|
3
|
+
|
|
4
|
+
module Selenium
|
|
5
|
+
module WebDriver
|
|
6
|
+
module SpecSupport
|
|
7
|
+
class RackServer
|
|
8
|
+
|
|
9
|
+
START_TIMEOUT = 30
|
|
10
|
+
|
|
11
|
+
def initialize(path, port = nil)
|
|
12
|
+
@path = path
|
|
13
|
+
@app = TestApp.new(path)
|
|
14
|
+
|
|
15
|
+
@host = "127.0.0.1"
|
|
16
|
+
@port = Integer(port || PortProber.above(8180))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def start
|
|
20
|
+
if Platform.jruby?
|
|
21
|
+
start_threaded
|
|
22
|
+
elsif Platform.windows?
|
|
23
|
+
start_windows
|
|
24
|
+
else
|
|
25
|
+
start_forked
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
unless SocketPoller.new(@host, @port, START_TIMEOUT).connected?
|
|
29
|
+
raise "rack server not launched in #{START_TIMEOUT} seconds"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def run
|
|
34
|
+
handler.run @app, :Host => @host, :Port => @port
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def where_is(file)
|
|
38
|
+
"http://#{@host}:#{@port}/#{file}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def stop
|
|
42
|
+
if defined?(@thread) && @thread
|
|
43
|
+
@thread.kill
|
|
44
|
+
elsif defined?(@pid) && @pid
|
|
45
|
+
Process.kill('KILL', @pid)
|
|
46
|
+
Process.waitpid(@pid)
|
|
47
|
+
elsif defined?(@process) && @process
|
|
48
|
+
@process.stop
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def handler
|
|
55
|
+
# can't use Platform here since it's being run as a file on Windows + IE.
|
|
56
|
+
if RUBY_PLATFORM =~ /mswin|msys|mingw32/
|
|
57
|
+
handlers = %w[mongrel webrick]
|
|
58
|
+
else
|
|
59
|
+
handlers = %w[thin mongrel webrick]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
handler = handlers.find { |h| load_handler h }
|
|
63
|
+
constant = handler == 'webrick' ? "WEBrick" : handler.capitalize
|
|
64
|
+
Rack::Handler.const_get constant
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def load_handler(handler)
|
|
68
|
+
require handler
|
|
69
|
+
true
|
|
70
|
+
rescue LoadError
|
|
71
|
+
false
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def start_forked
|
|
75
|
+
@pid = fork { run }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def start_threaded
|
|
79
|
+
Thread.abort_on_exception = true
|
|
80
|
+
@thread = Thread.new { run }
|
|
81
|
+
sleep 0.5
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def start_windows
|
|
85
|
+
if %w[ie internet_explorer].include? ENV['WD_SPEC_DRIVER']
|
|
86
|
+
# For IE, the combination of Windows + FFI + MRI seems to cause a
|
|
87
|
+
# deadlock with the get() call and the server thread.
|
|
88
|
+
# Workaround by running this file in a subprocess.
|
|
89
|
+
@process = ChildProcess.build("ruby", "-r", "rubygems", __FILE__, @path, @port).start
|
|
90
|
+
else
|
|
91
|
+
start_threaded
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
class TestApp
|
|
96
|
+
def initialize(file_root)
|
|
97
|
+
@static = Rack::File.new(file_root)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def call(env)
|
|
101
|
+
case env['REQUEST_PATH']
|
|
102
|
+
when "/common/upload"
|
|
103
|
+
req = Rack::Request.new(env)
|
|
104
|
+
|
|
105
|
+
status = 200
|
|
106
|
+
header = {"Content-Type" => "text/html"}
|
|
107
|
+
body = req['upload'][:tempfile].read
|
|
108
|
+
|
|
109
|
+
[status, header, [body]]
|
|
110
|
+
else
|
|
111
|
+
@static.call env
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end # RackServer
|
|
117
|
+
end # SpecSupport
|
|
118
|
+
end # WebDriver
|
|
119
|
+
end # Selenium
|
|
120
|
+
|
|
121
|
+
if __FILE__ == $0
|
|
122
|
+
Selenium::WebDriver::SpecSupport::RackServer.new(ARGV[0], ARGV[1]).run
|
|
123
|
+
end
|