rainux-selenium-webdriver 0.0.17
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/COPYING +204 -0
- data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
- data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
- data/chrome/src/extension/background.html +9 -0
- data/chrome/src/extension/background.js +995 -0
- data/chrome/src/extension/content_script.js +1321 -0
- data/chrome/src/extension/icons/busy.png +0 -0
- data/chrome/src/extension/icons/free.png +0 -0
- data/chrome/src/extension/manifest-nonwin.json +19 -0
- data/chrome/src/extension/manifest-win.json +20 -0
- data/chrome/src/extension/utils.js +231 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +8 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +358 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +124 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +135 -0
- data/common/src/js/abstractcommandprocessor.js +134 -0
- data/common/src/js/asserts.js +296 -0
- data/common/src/js/by.js +149 -0
- data/common/src/js/command.js +304 -0
- data/common/src/js/context.js +58 -0
- data/common/src/js/core/Blank.html +7 -0
- data/common/src/js/core/InjectedRemoteRunner.html +8 -0
- data/common/src/js/core/RemoteRunner.html +101 -0
- data/common/src/js/core/SeleniumLog.html +109 -0
- data/common/src/js/core/TestPrompt.html +145 -0
- data/common/src/js/core/TestRunner-splash.html +55 -0
- data/common/src/js/core/TestRunner.html +165 -0
- data/common/src/js/core/icons/all.png +0 -0
- data/common/src/js/core/icons/continue.png +0 -0
- data/common/src/js/core/icons/continue_disabled.png +0 -0
- data/common/src/js/core/icons/pause.png +0 -0
- data/common/src/js/core/icons/pause_disabled.png +0 -0
- data/common/src/js/core/icons/selected.png +0 -0
- data/common/src/js/core/icons/step.png +0 -0
- data/common/src/js/core/icons/step_disabled.png +0 -0
- data/common/src/js/core/lib/cssQuery/cssQuery-p.js +6 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery-level2.js +142 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery-level3.js +150 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery-standard.js +53 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery.js +356 -0
- data/common/src/js/core/lib/prototype.js +2006 -0
- data/common/src/js/core/lib/scriptaculous/builder.js +101 -0
- data/common/src/js/core/lib/scriptaculous/controls.js +815 -0
- data/common/src/js/core/lib/scriptaculous/dragdrop.js +915 -0
- data/common/src/js/core/lib/scriptaculous/effects.js +958 -0
- data/common/src/js/core/lib/scriptaculous/scriptaculous.js +47 -0
- data/common/src/js/core/lib/scriptaculous/slider.js +283 -0
- data/common/src/js/core/lib/scriptaculous/unittest.js +383 -0
- data/common/src/js/core/lib/snapsie.js +91 -0
- data/common/src/js/core/scripts/find_matching_child.js +69 -0
- data/common/src/js/core/scripts/htmlutils.js +8716 -0
- data/common/src/js/core/scripts/injection.html +72 -0
- data/common/src/js/core/scripts/selenium-api.js +3291 -0
- data/common/src/js/core/scripts/selenium-browserbot.js +2457 -0
- data/common/src/js/core/scripts/selenium-browserdetect.js +153 -0
- data/common/src/js/core/scripts/selenium-commandhandlers.js +379 -0
- data/common/src/js/core/scripts/selenium-executionloop.js +175 -0
- data/common/src/js/core/scripts/selenium-logging.js +148 -0
- data/common/src/js/core/scripts/selenium-remoterunner.js +695 -0
- data/common/src/js/core/scripts/selenium-testrunner.js +1362 -0
- data/common/src/js/core/scripts/selenium-version.js +5 -0
- data/common/src/js/core/scripts/ui-doc.html +808 -0
- data/common/src/js/core/scripts/ui-element.js +1644 -0
- data/common/src/js/core/scripts/ui-map-sample.js +979 -0
- data/common/src/js/core/scripts/user-extensions.js +3 -0
- data/common/src/js/core/scripts/user-extensions.js.sample +75 -0
- data/common/src/js/core/scripts/xmlextras.js +153 -0
- data/common/src/js/core/selenium-logo.png +0 -0
- data/common/src/js/core/selenium-test.css +43 -0
- data/common/src/js/core/selenium.css +316 -0
- data/common/src/js/core/xpath/dom.js +566 -0
- data/common/src/js/core/xpath/javascript-xpath-0.1.11.js +2816 -0
- data/common/src/js/core/xpath/util.js +549 -0
- data/common/src/js/core/xpath/xmltoken.js +149 -0
- data/common/src/js/core/xpath/xpath.js +2481 -0
- data/common/src/js/extension/README +2 -0
- data/common/src/js/extension/dommessenger.js +152 -0
- data/common/src/js/factory.js +55 -0
- data/common/src/js/future.js +141 -0
- data/common/src/js/jsunit.js +40 -0
- data/common/src/js/jsunit/app/css/jsUnitStyle.css +50 -0
- data/common/src/js/jsunit/app/css/readme +10 -0
- data/common/src/js/jsunit/app/emptyPage.html +11 -0
- data/common/src/js/jsunit/app/jsUnitCore.js +534 -0
- data/common/src/js/jsunit/app/jsUnitMockTimeout.js +81 -0
- data/common/src/js/jsunit/app/jsUnitTestManager.js +705 -0
- data/common/src/js/jsunit/app/jsUnitTestSuite.js +44 -0
- data/common/src/js/jsunit/app/jsUnitTracer.js +102 -0
- data/common/src/js/jsunit/app/jsUnitVersionCheck.js +59 -0
- data/common/src/js/jsunit/app/main-counts-errors.html +12 -0
- data/common/src/js/jsunit/app/main-counts-failures.html +13 -0
- data/common/src/js/jsunit/app/main-counts-runs.html +13 -0
- data/common/src/js/jsunit/app/main-counts.html +21 -0
- data/common/src/js/jsunit/app/main-data.html +178 -0
- data/common/src/js/jsunit/app/main-errors.html +23 -0
- data/common/src/js/jsunit/app/main-frame.html +19 -0
- data/common/src/js/jsunit/app/main-loader.html +45 -0
- data/common/src/js/jsunit/app/main-progress.html +25 -0
- data/common/src/js/jsunit/app/main-results.html +67 -0
- data/common/src/js/jsunit/app/main-status.html +13 -0
- data/common/src/js/jsunit/app/testContainer.html +16 -0
- data/common/src/js/jsunit/app/testContainerController.html +77 -0
- data/common/src/js/jsunit/app/xbDebug.js +306 -0
- data/common/src/js/jsunit/changelog.txt +60 -0
- data/common/src/js/jsunit/css/jsUnitStyle.css +83 -0
- data/common/src/js/jsunit/images/green.gif +0 -0
- data/common/src/js/jsunit/images/logo_jsunit.gif +0 -0
- data/common/src/js/jsunit/images/powerby-transparent.gif +0 -0
- data/common/src/js/jsunit/images/red.gif +0 -0
- data/common/src/js/jsunit/licenses/JDOM_license.txt +56 -0
- data/common/src/js/jsunit/licenses/Jetty_license.html +213 -0
- data/common/src/js/jsunit/licenses/MPL-1.1.txt +470 -0
- data/common/src/js/jsunit/licenses/gpl-2.txt +340 -0
- data/common/src/js/jsunit/licenses/index.html +141 -0
- data/common/src/js/jsunit/licenses/lgpl-2.1.txt +504 -0
- data/common/src/js/jsunit/licenses/mpl-tri-license-c.txt +35 -0
- data/common/src/js/jsunit/licenses/mpl-tri-license-html.txt +35 -0
- data/common/src/js/jsunit/readme.txt +19 -0
- data/common/src/js/jsunit/testRunner.html +167 -0
- data/common/src/js/jsunit/version.txt +1 -0
- data/common/src/js/key.js +117 -0
- data/common/src/js/localcommandprocessor.js +185 -0
- data/common/src/js/testcase.js +217 -0
- data/common/src/js/timing.js +89 -0
- data/common/src/js/webdriver.js +890 -0
- data/common/src/js/webelement.js +485 -0
- data/common/src/rb/README +30 -0
- data/common/src/rb/lib/selenium-webdriver.rb +1 -0
- data/common/src/rb/lib/selenium/webdriver.rb +67 -0
- data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +91 -0
- data/common/src/rb/lib/selenium/webdriver/child_process.rb +180 -0
- data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +41 -0
- data/common/src/rb/lib/selenium/webdriver/driver.rb +252 -0
- data/common/src/rb/lib/selenium/webdriver/driver_extensions/takes_screenshot.rb +24 -0
- data/common/src/rb/lib/selenium/webdriver/element.rb +262 -0
- data/common/src/rb/lib/selenium/webdriver/error.rb +67 -0
- data/common/src/rb/lib/selenium/webdriver/find.rb +89 -0
- data/common/src/rb/lib/selenium/webdriver/keys.rb +84 -0
- data/common/src/rb/lib/selenium/webdriver/navigation.rb +27 -0
- data/common/src/rb/lib/selenium/webdriver/options.rb +50 -0
- data/common/src/rb/lib/selenium/webdriver/platform.rb +86 -0
- data/common/src/rb/lib/selenium/webdriver/target_locator.rb +70 -0
- data/firefox/prebuilt/Win32/Release/webdriver-firefox.dll +0 -0
- data/firefox/prebuilt/linux/Release/libwebdriver-firefox.so +0 -0
- data/firefox/prebuilt/linux/Release/x_ignore_nofocus.so +0 -0
- data/firefox/prebuilt/linux64/Release/libwebdriver-firefox.so +0 -0
- data/firefox/prebuilt/linux64/Release/x_ignore_nofocus.so +0 -0
- data/firefox/prebuilt/nsICommandProcessor.xpt +0 -0
- data/firefox/prebuilt/nsINativeEvents.xpt +0 -0
- data/firefox/prebuilt/nsIResponseHandler.xpt +0 -0
- data/firefox/src/extension/chrome.manifest +3 -0
- data/firefox/src/extension/components/badCertListener.js +294 -0
- data/firefox/src/extension/components/context.js +37 -0
- data/firefox/src/extension/components/driver-component.js +127 -0
- data/firefox/src/extension/components/firefoxDriver.js +810 -0
- data/firefox/src/extension/components/json2.js +273 -0
- data/firefox/src/extension/components/keytest.html +554 -0
- data/firefox/src/extension/components/nsCommandProcessor.js +643 -0
- data/firefox/src/extension/components/promptService.js +208 -0
- data/firefox/src/extension/components/screenshooter.js +81 -0
- data/firefox/src/extension/components/socketListener.js +185 -0
- data/firefox/src/extension/components/utils.js +1263 -0
- data/firefox/src/extension/components/webLoadingListener.js +57 -0
- data/firefox/src/extension/components/webdriverserver.js +106 -0
- data/firefox/src/extension/components/wrappedElement.js +683 -0
- data/firefox/src/extension/content/fxdriver.xul +30 -0
- data/firefox/src/extension/content/server.js +95 -0
- data/firefox/src/extension/idl/nsICommandProcessor.idl +38 -0
- data/firefox/src/extension/idl/nsIResponseHandler.idl +34 -0
- data/firefox/src/extension/install.rdf +29 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +31 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +107 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +484 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +90 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +155 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +233 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +59 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +23 -0
- data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +14 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +565 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +99 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +147 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +16 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +408 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb +105 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +53 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +71 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +49 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +32 -0
- metadata +303 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
= selenium-webdriver
|
|
2
|
+
|
|
3
|
+
This gem provides Ruby bindings for WebDriver and has been tested to work on MRI (1.8.6 through 1.9), JRuby and Rubinius.
|
|
4
|
+
|
|
5
|
+
= INSTALL
|
|
6
|
+
|
|
7
|
+
gem install selenium-webdriver
|
|
8
|
+
|
|
9
|
+
= LINKS
|
|
10
|
+
|
|
11
|
+
* http://gemcutter.org/gems/selenium-webdriver
|
|
12
|
+
* http://selenium.googlecode.com/svn/trunk/docs/api/rb/index.html
|
|
13
|
+
* http://code.google.com/p/selenium/wiki/RubyBindings
|
|
14
|
+
* http://code.google.com/p/selenium/issues/list
|
|
15
|
+
|
|
16
|
+
= LICENSE
|
|
17
|
+
|
|
18
|
+
Copyright 2009 WebDriver committers
|
|
19
|
+
|
|
20
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
21
|
+
you may not use this file except in compliance with the License.
|
|
22
|
+
You may obtain a copy of the License at
|
|
23
|
+
|
|
24
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
25
|
+
|
|
26
|
+
Unless required by applicable law or agreed to in writing, software
|
|
27
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
28
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
29
|
+
See the License for the specific language governing permissions and
|
|
30
|
+
limitations under the License.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "selenium/webdriver"
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require "tmpdir"
|
|
2
|
+
require "fileutils"
|
|
3
|
+
|
|
4
|
+
def have_yajl?
|
|
5
|
+
require "yajl/json_gem"
|
|
6
|
+
true
|
|
7
|
+
rescue LoadError
|
|
8
|
+
false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def have_json?
|
|
12
|
+
require "json"
|
|
13
|
+
true
|
|
14
|
+
rescue LoadError
|
|
15
|
+
false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
unless have_yajl? || have_json?
|
|
19
|
+
raise LoadError, <<-END
|
|
20
|
+
|
|
21
|
+
You need to require rubygems or install one of these gems:
|
|
22
|
+
|
|
23
|
+
yajl-ruby (best on MRI)
|
|
24
|
+
json
|
|
25
|
+
json-jruby (native JRuby)
|
|
26
|
+
json_pure (any platform)
|
|
27
|
+
|
|
28
|
+
END
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
require "selenium/webdriver/core_ext/dir"
|
|
33
|
+
require "selenium/webdriver/error"
|
|
34
|
+
require "selenium/webdriver/platform"
|
|
35
|
+
require "selenium/webdriver/child_process"
|
|
36
|
+
require "selenium/webdriver/target_locator"
|
|
37
|
+
require "selenium/webdriver/navigation"
|
|
38
|
+
require "selenium/webdriver/options"
|
|
39
|
+
require "selenium/webdriver/find"
|
|
40
|
+
require "selenium/webdriver/driver_extensions/takes_screenshot"
|
|
41
|
+
require "selenium/webdriver/keys"
|
|
42
|
+
require "selenium/webdriver/bridge_helper"
|
|
43
|
+
require "selenium/webdriver/driver"
|
|
44
|
+
require "selenium/webdriver/element"
|
|
45
|
+
|
|
46
|
+
module Selenium
|
|
47
|
+
module WebDriver
|
|
48
|
+
Point = Struct.new(:x, :y)
|
|
49
|
+
Dimension = Struct.new(:width, :heigth)
|
|
50
|
+
|
|
51
|
+
autoload :IE, 'selenium/webdriver/ie'
|
|
52
|
+
autoload :Remote, 'selenium/webdriver/remote'
|
|
53
|
+
autoload :Chrome, 'selenium/webdriver/chrome'
|
|
54
|
+
autoload :Firefox, 'selenium/webdriver/firefox'
|
|
55
|
+
|
|
56
|
+
def self.root
|
|
57
|
+
@root ||= File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", ".."))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.for(*args)
|
|
61
|
+
WebDriver::Driver.for(*args)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end # WebDriver
|
|
65
|
+
end # Selenium
|
|
66
|
+
|
|
67
|
+
Thread.abort_on_exception = true
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Shared across bridges
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
module BridgeHelper
|
|
9
|
+
|
|
10
|
+
def wrap_script_argument(arg)
|
|
11
|
+
case arg
|
|
12
|
+
when Integer, Float
|
|
13
|
+
{ :type => "NUMBER", :value => arg }
|
|
14
|
+
when TrueClass, FalseClass, NilClass
|
|
15
|
+
{ :type => "BOOLEAN", :value => !!arg }
|
|
16
|
+
when Element
|
|
17
|
+
{ :type => "ELEMENT", :value => arg.ref }
|
|
18
|
+
when String
|
|
19
|
+
{ :type => "STRING", :value => arg.to_s }
|
|
20
|
+
when Array # Enumerable?
|
|
21
|
+
arg.map { |e| wrap_script_argument(e) }
|
|
22
|
+
else
|
|
23
|
+
raise TypeError, "Parameter is not of recognized type: #{arg.inspect}:#{arg.class}"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def unwrap_script_argument(arg)
|
|
28
|
+
if arg.kind_of?(Array)
|
|
29
|
+
arg.map { |e| unwrap_script_argument(e) }
|
|
30
|
+
else
|
|
31
|
+
case arg["type"]
|
|
32
|
+
when "NULL"
|
|
33
|
+
nil
|
|
34
|
+
when "ELEMENT"
|
|
35
|
+
Element.new self, element_id_from(arg["value"])
|
|
36
|
+
when "POINT"
|
|
37
|
+
Point.new arg['x'], arg['y']
|
|
38
|
+
when "DIMENSION"
|
|
39
|
+
Dimension.new arg['width'], arg['height']
|
|
40
|
+
when "COOKIE"
|
|
41
|
+
{:name => arg['name'], :value => arg['value']}
|
|
42
|
+
else
|
|
43
|
+
arg["value"]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def element_id_from(id)
|
|
49
|
+
str = id.kind_of?(Array) ? id.first : id
|
|
50
|
+
after = str.split("/").last
|
|
51
|
+
|
|
52
|
+
after
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def parse_cookie_string(str)
|
|
56
|
+
result = {
|
|
57
|
+
'name' => '',
|
|
58
|
+
'value' => '',
|
|
59
|
+
'domain' => '',
|
|
60
|
+
'path' => '',
|
|
61
|
+
'expires' => '',
|
|
62
|
+
'secure' => false
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
str.split(";").each do |attribute|
|
|
66
|
+
if attribute.include? "="
|
|
67
|
+
key, value = attribute.strip.split("=", 2)
|
|
68
|
+
if result['name'].empty?
|
|
69
|
+
result['name'] = key
|
|
70
|
+
result['value'] = value
|
|
71
|
+
elsif key == 'domain' && value.strip =~ /^\.(.+)/
|
|
72
|
+
result['domain'] = $1
|
|
73
|
+
elsif key && value
|
|
74
|
+
result[key] = value
|
|
75
|
+
end
|
|
76
|
+
elsif attribute == "secure"
|
|
77
|
+
result['secure'] = true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
unless [nil, "", "0"].include?(result['expires'])
|
|
81
|
+
# firefox stores expiry as number of seconds
|
|
82
|
+
result['expires'] = Time.at(result['expires'].to_i)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
result
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end # BridgeHelper
|
|
90
|
+
end # WebDriver
|
|
91
|
+
end # Selenium
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Cross platform child process launcher
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
class ChildProcess
|
|
9
|
+
attr_reader :pid
|
|
10
|
+
|
|
11
|
+
def initialize(*args)
|
|
12
|
+
@args = args
|
|
13
|
+
|
|
14
|
+
if Platform.jruby?
|
|
15
|
+
extend JRubyProcess
|
|
16
|
+
elsif Platform.ironruby?
|
|
17
|
+
extend IronRubyProcess
|
|
18
|
+
elsif Platform.os == :windows
|
|
19
|
+
extend WindowsProcess
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def ugly_death?
|
|
24
|
+
code = exit_value()
|
|
25
|
+
# if exit_val is nil, the process is still alive
|
|
26
|
+
code && code != 0
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def exit_value
|
|
30
|
+
pid, status = Process.waitpid2(@pid, Process::WNOHANG)
|
|
31
|
+
status.exitstatus if pid
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def start
|
|
35
|
+
@pid = fork do
|
|
36
|
+
unless $DEBUG
|
|
37
|
+
[STDOUT, STDERR].each { |io| io.reopen("/dev/null") }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
exec(*@args)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
self
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def wait
|
|
47
|
+
assert_started
|
|
48
|
+
Process.waitpid2 @pid
|
|
49
|
+
rescue Errno::ECHILD
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def kill
|
|
54
|
+
assert_started
|
|
55
|
+
Process.kill('TERM', @pid)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def kill!
|
|
59
|
+
assert_started
|
|
60
|
+
Process.kill('KILL', @pid)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def assert_started
|
|
64
|
+
raise Error::WebDriverError, "process not started" unless @pid
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
module WindowsProcess
|
|
68
|
+
def start
|
|
69
|
+
require "win32/process" # adds a dependency on windows - perhaps we could just use FFI instead?
|
|
70
|
+
@pid = Process.create(
|
|
71
|
+
:app_name => @args.join(" "),
|
|
72
|
+
:inherit => false # don't inherit open file handles
|
|
73
|
+
).process_id
|
|
74
|
+
|
|
75
|
+
self
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def kill
|
|
79
|
+
kill!
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
module JRubyProcess
|
|
84
|
+
def start
|
|
85
|
+
pb = java.lang.ProcessBuilder.new(@args)
|
|
86
|
+
|
|
87
|
+
env = pb.environment
|
|
88
|
+
ENV.each { |k,v| env.put(k, v) }
|
|
89
|
+
|
|
90
|
+
@process = pb.start
|
|
91
|
+
|
|
92
|
+
# Firefox 3.6 on Snow Leopard has a lot output on stderr, which makes
|
|
93
|
+
# the launch act funny if we don't do something to the streams
|
|
94
|
+
|
|
95
|
+
@process.getErrorStream.close
|
|
96
|
+
@process.getInputStream.close
|
|
97
|
+
|
|
98
|
+
# Closing the streams solves that problem, but on other platforms we might
|
|
99
|
+
# need to actually read them.
|
|
100
|
+
|
|
101
|
+
# Thread.new do
|
|
102
|
+
# input, error = 0, 0
|
|
103
|
+
# loop do
|
|
104
|
+
# error = @process.getErrorStream.read if error != -1
|
|
105
|
+
# input = @process.getInputStream.read if input != -1
|
|
106
|
+
# break if error == -1 && input == -1
|
|
107
|
+
# end
|
|
108
|
+
# end
|
|
109
|
+
|
|
110
|
+
self
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def kill
|
|
114
|
+
assert_started
|
|
115
|
+
@process.destroy
|
|
116
|
+
end
|
|
117
|
+
alias_method :kill!, :kill
|
|
118
|
+
|
|
119
|
+
def wait
|
|
120
|
+
assert_started
|
|
121
|
+
@process.waitFor
|
|
122
|
+
[nil, @process.exitValue] # no robust way to get pid here
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def exit_value
|
|
126
|
+
assert_started
|
|
127
|
+
@process.exitValue
|
|
128
|
+
rescue java.lang.IllegalThreadStateException
|
|
129
|
+
nil
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def assert_started
|
|
133
|
+
raise Error::WebDriverError, "process not started" unless @process
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
module IronRubyProcess
|
|
138
|
+
def start
|
|
139
|
+
args = @args.dup
|
|
140
|
+
|
|
141
|
+
@process = System::Diagnostics::Process.new
|
|
142
|
+
@process.StartInfo.UseShellExecute = true
|
|
143
|
+
@process.StartInfo.FileName = args.shift
|
|
144
|
+
@process.StartInfo.Arguments = args.join ' '
|
|
145
|
+
@process.start
|
|
146
|
+
|
|
147
|
+
self
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def kill
|
|
151
|
+
assert_started
|
|
152
|
+
@process.Kill
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def wait
|
|
156
|
+
assert_started
|
|
157
|
+
@process.WaitForExit
|
|
158
|
+
[pid, exit_value]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def pid
|
|
162
|
+
assert_started
|
|
163
|
+
@process.Id
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def exit_value
|
|
167
|
+
assert_started
|
|
168
|
+
return unless @process.HasExited
|
|
169
|
+
|
|
170
|
+
@process.ExitCode
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def assert_started
|
|
174
|
+
raise Error::WebDriverError, "process not started" unless @process
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
end # ChildProcess
|
|
179
|
+
end # WebDriver
|
|
180
|
+
end # Selenium
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Dir
|
|
2
|
+
def self.mktmpdir(prefix_suffix=nil, tmpdir=nil)
|
|
3
|
+
case prefix_suffix
|
|
4
|
+
when nil
|
|
5
|
+
prefix = "d"
|
|
6
|
+
suffix = ""
|
|
7
|
+
when String
|
|
8
|
+
prefix = prefix_suffix
|
|
9
|
+
suffix = ""
|
|
10
|
+
when Array
|
|
11
|
+
prefix = prefix_suffix[0]
|
|
12
|
+
suffix = prefix_suffix[1]
|
|
13
|
+
else
|
|
14
|
+
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
|
|
15
|
+
end
|
|
16
|
+
tmpdir ||= Dir.tmpdir
|
|
17
|
+
t = Time.now.strftime("%Y%m%d")
|
|
18
|
+
n = nil
|
|
19
|
+
begin
|
|
20
|
+
path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
|
|
21
|
+
path << "-#{n}" if n
|
|
22
|
+
path << suffix
|
|
23
|
+
Dir.mkdir(path, 0700)
|
|
24
|
+
rescue Errno::EEXIST
|
|
25
|
+
n ||= 0
|
|
26
|
+
n += 1
|
|
27
|
+
retry
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if block_given?
|
|
31
|
+
begin
|
|
32
|
+
yield path
|
|
33
|
+
ensure
|
|
34
|
+
FileUtils.remove_entry_secure path
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
path
|
|
38
|
+
end
|
|
39
|
+
end unless respond_to? :mktmpdir # > 1.8.7
|
|
40
|
+
end
|
|
41
|
+
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# The main class through which you control the browser.
|
|
6
|
+
#
|
|
7
|
+
# @see Find
|
|
8
|
+
# @see Navigation
|
|
9
|
+
# @see TargetLocator
|
|
10
|
+
# @see Options
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
class Driver
|
|
14
|
+
include Find
|
|
15
|
+
|
|
16
|
+
attr_reader :bridge
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Create a new Driver instance with the correct bridge for the given browser
|
|
22
|
+
#
|
|
23
|
+
# @param browser [Symbol]
|
|
24
|
+
# the driver type to use
|
|
25
|
+
# @param *rest
|
|
26
|
+
# arguments passed to the Bridge.new
|
|
27
|
+
#
|
|
28
|
+
# @return [Driver]
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
def for(browser, *args)
|
|
32
|
+
bridge = case browser
|
|
33
|
+
when :ie, :internet_explorer
|
|
34
|
+
WebDriver::IE::Bridge.new(*args)
|
|
35
|
+
when :remote
|
|
36
|
+
WebDriver::Remote::Bridge.new(*args)
|
|
37
|
+
when :chrome
|
|
38
|
+
WebDriver::Chrome::Bridge.new(*args)
|
|
39
|
+
when :firefox, :ff
|
|
40
|
+
WebDriver::Firefox::Bridge.new(*args)
|
|
41
|
+
else
|
|
42
|
+
raise ArgumentError, "unknown driver: #{browser.inspect}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
driver = new(bridge)
|
|
46
|
+
|
|
47
|
+
unless bridge.driver_extensions.empty?
|
|
48
|
+
driver.extend(*bridge.driver_extensions)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
driver
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
#
|
|
56
|
+
# A new Driver instance
|
|
57
|
+
#
|
|
58
|
+
# @api private
|
|
59
|
+
#
|
|
60
|
+
|
|
61
|
+
def initialize(bridge)
|
|
62
|
+
@bridge = bridge
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def inspect
|
|
66
|
+
'#<%s:0x%x browser=%s>' % [self.class, hash*2, bridge.browser.inspect]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# @return [Navigation]
|
|
71
|
+
# @see Navigation
|
|
72
|
+
#
|
|
73
|
+
|
|
74
|
+
def navigate
|
|
75
|
+
@navigate ||= WebDriver::Navigation.new(self)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
#
|
|
79
|
+
# @return [TargetLocator]
|
|
80
|
+
# @see TargetLocator
|
|
81
|
+
#
|
|
82
|
+
|
|
83
|
+
def switch_to
|
|
84
|
+
@switch_to ||= WebDriver::TargetLocator.new(self)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# @return [Options]
|
|
89
|
+
# @see Options
|
|
90
|
+
#
|
|
91
|
+
|
|
92
|
+
def manage
|
|
93
|
+
@manage ||= WebDriver::Options.new(self)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
#
|
|
97
|
+
# Opens the specified URL in the browser.
|
|
98
|
+
#
|
|
99
|
+
|
|
100
|
+
def get(url)
|
|
101
|
+
navigate.to(url)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#
|
|
105
|
+
# Get the URL of the current page
|
|
106
|
+
#
|
|
107
|
+
# @return [String]
|
|
108
|
+
#
|
|
109
|
+
|
|
110
|
+
def current_url
|
|
111
|
+
bridge.getCurrentUrl
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
#
|
|
115
|
+
# Get the title of the current page
|
|
116
|
+
#
|
|
117
|
+
# @return [String]
|
|
118
|
+
#
|
|
119
|
+
|
|
120
|
+
def title
|
|
121
|
+
bridge.getTitle
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Get the source of the current page
|
|
126
|
+
#
|
|
127
|
+
# @return [String]
|
|
128
|
+
#
|
|
129
|
+
|
|
130
|
+
def page_source
|
|
131
|
+
bridge.getPageSource
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# Get the visibility of the browser. Not applicable for all browsers.
|
|
136
|
+
#
|
|
137
|
+
# @return [Boolean]
|
|
138
|
+
#
|
|
139
|
+
|
|
140
|
+
def visible?
|
|
141
|
+
bridge.getBrowserVisible
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
# Set the visibility of the browser. Not applicable for all browsers.
|
|
146
|
+
#
|
|
147
|
+
# @param [Boolean]
|
|
148
|
+
#
|
|
149
|
+
|
|
150
|
+
def visible=(bool)
|
|
151
|
+
bridge.setBrowserVisible bool
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
#
|
|
155
|
+
# Quit the browser
|
|
156
|
+
#
|
|
157
|
+
|
|
158
|
+
def quit
|
|
159
|
+
bridge.quit
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# Close the current window, or the browser if no windows are left.
|
|
164
|
+
#
|
|
165
|
+
|
|
166
|
+
def close
|
|
167
|
+
bridge.close
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
#
|
|
171
|
+
# Get the window handles of open browser windows.
|
|
172
|
+
#
|
|
173
|
+
# @return [Array]
|
|
174
|
+
# @see TargetLocator#window
|
|
175
|
+
#
|
|
176
|
+
|
|
177
|
+
def window_handles
|
|
178
|
+
bridge.getWindowHandles
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
#
|
|
182
|
+
# Get the current window handle
|
|
183
|
+
#
|
|
184
|
+
# @return [String]
|
|
185
|
+
#
|
|
186
|
+
|
|
187
|
+
def window_handle
|
|
188
|
+
bridge.getCurrentWindowHandle
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
#
|
|
192
|
+
# Execute the given JavaScript
|
|
193
|
+
#
|
|
194
|
+
# @param [String] script
|
|
195
|
+
# JavaScript source to execute
|
|
196
|
+
# @param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] *args
|
|
197
|
+
# Arguments will be available in the given script as the 'arguments' array.
|
|
198
|
+
#
|
|
199
|
+
# @return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
|
|
200
|
+
# The value returned from the script.
|
|
201
|
+
#
|
|
202
|
+
|
|
203
|
+
def execute_script(script, *args)
|
|
204
|
+
bridge.executeScript(script, *args)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#-------------------------------- sugar --------------------------------
|
|
208
|
+
|
|
209
|
+
#
|
|
210
|
+
# driver.first(:id, 'foo')
|
|
211
|
+
#
|
|
212
|
+
|
|
213
|
+
alias_method :first, :find_element
|
|
214
|
+
|
|
215
|
+
#
|
|
216
|
+
# driver.all(:class, 'bar') #=> [#<WebDriver::Element:0x1011c3b88, ...]
|
|
217
|
+
#
|
|
218
|
+
|
|
219
|
+
alias_method :all, :find_elements
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# driver.script('function() { ... };')
|
|
223
|
+
#
|
|
224
|
+
|
|
225
|
+
alias_method :script, :execute_script
|
|
226
|
+
|
|
227
|
+
# Get the first element matching the given id.
|
|
228
|
+
#
|
|
229
|
+
# @param [String] id
|
|
230
|
+
# @return [WebDriver::Element]
|
|
231
|
+
#
|
|
232
|
+
# driver['someElementId'] #=> #<WebDriver::Element:0x1011c3b88>
|
|
233
|
+
#
|
|
234
|
+
|
|
235
|
+
def [](id)
|
|
236
|
+
find_element :id, id
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
#
|
|
241
|
+
# for Find
|
|
242
|
+
#
|
|
243
|
+
# @api private
|
|
244
|
+
#
|
|
245
|
+
|
|
246
|
+
def ref
|
|
247
|
+
nil
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
end # Driver
|
|
251
|
+
end # WebDriver
|
|
252
|
+
end # Selenium
|