selenium-webdriver 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +12 -0
  2. data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +5 -1
  3. data/common/src/js/core/scripts/htmlutils.js +404 -76
  4. data/common/src/js/core/scripts/rpc-optimizing-user-extension.js +5206 -0
  5. data/common/src/js/core/scripts/selenium-api.js +10 -15
  6. data/common/src/js/core/scripts/selenium-browserbot.js +26 -21
  7. data/common/src/rb/lib/selenium/webdriver/child_process.rb +62 -8
  8. data/common/src/rb/lib/selenium/webdriver/find.rb +12 -11
  9. data/common/src/rb/lib/selenium/webdriver/platform.rb +34 -36
  10. data/common/src/rb/lib/selenium/webdriver/target_locator.rb +8 -0
  11. data/firefox/prebuilt/linux/Release/libwebdriver-firefox.so +0 -0
  12. data/firefox/src/extension/components/badCertListener.js +121 -19
  13. data/firefox/src/extension/components/screenshooter.js +1 -1
  14. data/firefox/src/extension/components/utils.js +19 -10
  15. data/firefox/src/extension/components/wrappedElement.js +8 -8
  16. data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +8 -1
  17. data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +1 -1
  18. data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +12 -0
  19. data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +1 -1
  20. data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +4 -0
  21. data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +18 -9
  22. data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
  23. data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
  24. data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +4 -0
  25. data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +3 -2
  26. data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +4 -0
  27. data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +1 -1
  28. metadata +3 -2
@@ -37,7 +37,7 @@ Screenshooter.grab = function(window) {
37
37
  canvas.width = width;
38
38
  canvas.height = height;
39
39
  var context = canvas.getContext('2d');
40
- context.drawWindow(window, 0, 0, width, height, 'rgb(0,0,0)');
40
+ context.drawWindow(window, 0, 0, width, height, 'rgb(255,255,255)');
41
41
  return canvas;
42
42
  };
43
43
 
@@ -154,7 +154,7 @@ function getTextFromNode(node, toReturn, textSoFar) {
154
154
 
155
155
  // Or is this just plain text?
156
156
  if (child.nodeName == "#text") {
157
- if (Utils.isDisplayed(child)) {
157
+ if (Utils.isDisplayed(child, false)) {
158
158
  var textToAdd = child.nodeValue;
159
159
  textToAdd =
160
160
  textToAdd.replace(new RegExp(String.fromCharCode(160), "gm"), " ");
@@ -211,7 +211,10 @@ Utils.isInHead = function(element) {
211
211
  };
212
212
 
213
213
 
214
- Utils.isDisplayed = function(element) {
214
+ /**
215
+ * Checks that the element is not hidden by dimensions or CSS
216
+ */
217
+ Utils.isDisplayed = function(element, scrollIfNecessary) {
215
218
  // Ensure that we're dealing with an element.
216
219
  var el = element;
217
220
  while (el.nodeType != 1 && !(el.nodeType >= 9 && el.nodeType <= 11)) {
@@ -227,7 +230,7 @@ Utils.isDisplayed = function(element) {
227
230
  return false;
228
231
  }
229
232
 
230
- var box = Utils.getLocationOnceScrolledIntoView(el);
233
+ var box = scrollIfNecessary ? Utils.getLocationOnceScrolledIntoView(el) : Utils.getLocation(el);
231
234
  // Elements with zero width or height are never displayed
232
235
  if (box.width == 0 || box.height == 0) {
233
236
  return false;
@@ -427,6 +430,7 @@ Utils.type = function(context, element, text, opt_useNativeEvents) {
427
430
  var inputtype = element.getAttribute("type");
428
431
  if (inputtype && inputtype.toLowerCase() == "file") {
429
432
  element.value = text;
433
+ Utils.fireHtmlEvent(context, element, "change");
430
434
  return;
431
435
  }
432
436
  }
@@ -1085,13 +1089,7 @@ Utils.findElementsByXPath = function (xpath, contextNode, context) {
1085
1089
  };
1086
1090
 
1087
1091
 
1088
- Utils.getLocationOnceScrolledIntoView = function(element) {
1089
- // Some elements may not a scrollIntoView function - for example,
1090
- // elements under an SVG element. Call those only if they exist.
1091
- if (typeof element.scrollIntoView == 'function') {
1092
- element.scrollIntoView(true);
1093
- }
1094
-
1092
+ Utils.getLocation = function(element) {
1095
1093
  var retrieval = Utils.newInstance(
1096
1094
  "@mozilla.org/accessibleRetrieval;1", "nsIAccessibleRetrieval");
1097
1095
 
@@ -1175,6 +1173,17 @@ Utils.getLocationOnceScrolledIntoView = function(element) {
1175
1173
  };
1176
1174
 
1177
1175
 
1176
+ Utils.getLocationOnceScrolledIntoView = function(element) {
1177
+ // Some elements may not a scrollIntoView function - for example,
1178
+ // elements under an SVG element. Call those only if they exist.
1179
+ if (typeof element.scrollIntoView == 'function') {
1180
+ element.scrollIntoView(true);
1181
+ }
1182
+
1183
+ return Utils.getLocation(element);
1184
+ };
1185
+
1186
+
1178
1187
  Utils.unwrapParameters = function(wrappedParameters, resultArray, context) {
1179
1188
  while (wrappedParameters && wrappedParameters.length > 0) {
1180
1189
  var t = wrappedParameters.shift();
@@ -20,7 +20,7 @@
20
20
  FirefoxDriver.prototype.click = function(respond) {
21
21
  var element = Utils.getElementAt(respond.elementId, respond.context);
22
22
 
23
- if (!Utils.isDisplayed(element) && !Utils.isInHead(element)) {
23
+ if (!Utils.isDisplayed(element, true) && !Utils.isInHead(element)) {
24
24
  respond.isError = true;
25
25
  respond.response =
26
26
  "Element is not currently visible and so may not be clicked";
@@ -164,7 +164,7 @@ FirefoxDriver.prototype.getValue = function(respond) {
164
164
  FirefoxDriver.prototype.sendKeys = function(respond, value) {
165
165
  var element = Utils.getElementAt(respond.elementId, respond.context);
166
166
 
167
- if (!Utils.isDisplayed(element) && !Utils.isInHead(element)) {
167
+ if (!Utils.isDisplayed(element, true) && !Utils.isInHead(element)) {
168
168
  respond.isError = true;
169
169
  respond.response =
170
170
  "Element is not currently visible and so may not be used for typing";
@@ -198,7 +198,7 @@ FirefoxDriver.prototype.sendKeys = function(respond, value) {
198
198
  FirefoxDriver.prototype.clear = function(respond) {
199
199
  var element = Utils.getElementAt(respond.elementId, respond.context);
200
200
 
201
- if (!Utils.isDisplayed(element) && !Utils.isInHead(element)) {
201
+ if (!Utils.isDisplayed(element, true) && !Utils.isInHead(element)) {
202
202
  respond.isError = true;
203
203
  respond.response =
204
204
  "Element is not currently visible and so may not be cleared";
@@ -322,7 +322,7 @@ FirefoxDriver.prototype.submit = function(respond) {
322
322
  while (element.parentNode != null && element.tagName.toLowerCase() != "form") {
323
323
  element = element.parentNode;
324
324
  }
325
- if (element.tagName.toLowerCase() == "form") {
325
+ if (element.tagName && element.tagName.toLowerCase() == "form") {
326
326
  if (Utils.fireHtmlEvent(respond.context, element, "submit")) {
327
327
  new WebLoadingListener(Utils.getBrowser(respond.context), function() {
328
328
  respond.send();
@@ -375,7 +375,7 @@ FirefoxDriver.prototype.isSelected = function(respond) {
375
375
  FirefoxDriver.prototype.setSelected = function(respond) {
376
376
  var element = Utils.getElementAt(respond.elementId, respond.context);
377
377
 
378
- if (!Utils.isDisplayed(element) && !Utils.isInHead(element)) {
378
+ if (!Utils.isDisplayed(element, true) && !Utils.isInHead(element)) {
379
379
  respond.isError = true;
380
380
  respond.response =
381
381
  "Element is not currently visible and so may not be selected";
@@ -491,7 +491,7 @@ FirefoxDriver.prototype.toggle = function(respond) {
491
491
 
492
492
  FirefoxDriver.prototype.isDisplayed = function(respond) {
493
493
  var element = Utils.getElementAt(respond.elementId, respond.context);
494
- respond.response = Utils.isDisplayed(element);
494
+ respond.response = Utils.isDisplayed(element, false);
495
495
  respond.send();
496
496
  };
497
497
 
@@ -525,7 +525,7 @@ FirefoxDriver.prototype.getSize = function(respond) {
525
525
  FirefoxDriver.prototype.dragElement = function(respond, movementString) {
526
526
  var element = Utils.getElementAt(respond.elementId, respond.context);
527
527
 
528
- if (!Utils.isDisplayed(element) && !Utils.isInHead(element)) {
528
+ if (!Utils.isDisplayed(element, true) && !Utils.isInHead(element)) {
529
529
  respond.isError = true;
530
530
  respond.response =
531
531
  "Element is not currently visible and so may not be used for drag and drop";
@@ -601,7 +601,7 @@ FirefoxDriver.prototype.getValueOfCssProperty = function(respond,
601
601
  FirefoxDriver.prototype.getLocationOnceScrolledIntoView = function(respond) {
602
602
  var element = Utils.getElementAt(respond.elementId, respond.context);
603
603
 
604
- if (!Utils.isDisplayed(element)) {
604
+ if (!Utils.isDisplayed(element, true)) {
605
605
  respond.response = undefined;
606
606
  respond.send();
607
607
  return;
@@ -15,8 +15,15 @@ module Selenium
15
15
 
16
16
  DEFAULT_PROFILE_NAME = "WebDriver".freeze
17
17
  DEFAULT_PORT = 7055
18
- DEFAULT_ENABLE_NATIVE_EVENTS = Platform.win?
18
+ DEFAULT_ENABLE_NATIVE_EVENTS = [:windows, :linux].include? Platform.os
19
19
 
20
20
  end
21
21
  end
22
+ end
23
+
24
+
25
+ # SocketError was added in Ruby 1.8.7.
26
+ # If it's not defined, we add it here so it can be used in rescues.
27
+ unless defined? SocketError
28
+ class SocketError < IOError; end
22
29
  end
@@ -87,7 +87,7 @@ module Selenium
87
87
  end
88
88
 
89
89
  def windows_registry_path
90
- return if Platform.jruby?
90
+ return if Platform.jruby? || Platform.ironruby?
91
91
  require "win32/registry"
92
92
 
93
93
  lm = Win32::Registry::HKEY_LOCAL_MACHINE
@@ -151,6 +151,14 @@ module Selenium
151
151
  find_elements_by 'xpath', xpath, parent
152
152
  end
153
153
 
154
+ def findElementByCssSelector(parent, selector)
155
+ find_element_by 'css selector', selector, parent
156
+ end
157
+
158
+ def findElementsByCssSelector(parent, selector)
159
+ find_elements_by 'css selector', selector, parent
160
+ end
161
+
154
162
  #
155
163
  # Element functions
156
164
  #
@@ -327,6 +335,10 @@ module Selenium
327
335
  :parameters => [name.to_s]
328
336
  end
329
337
 
338
+ def switchToDefaultContent
339
+ execute :switchToDefaultContent
340
+ end
341
+
330
342
  def switchToWindow(name)
331
343
  @context = execute :switchToWindow,
332
344
  :parameters => [name.to_s]
@@ -13,7 +13,7 @@ module Selenium
13
13
  loop do
14
14
  begin
15
15
  return new_socket
16
- rescue Errno::ECONNREFUSED, Errno::ENOTCONN => e
16
+ rescue Errno::ECONNREFUSED, Errno::ENOTCONN, SocketError => e
17
17
  $stderr.puts "#{self} caught #{e.message} for #{@host}:#{@port}" if $DEBUG
18
18
  sleep 0.25
19
19
  end
@@ -1,3 +1,5 @@
1
+ require "fcntl"
2
+
1
3
  module Selenium
2
4
  module WebDriver
3
5
  module Firefox
@@ -29,6 +31,8 @@ module Selenium
29
31
 
30
32
  def with_lock
31
33
  socket_lock = TCPServer.new(@host, @port - 1)
34
+ socket_lock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
35
+
32
36
  yield
33
37
  ensure
34
38
  socket_lock.close if socket_lock
@@ -16,14 +16,15 @@ module Selenium
16
16
  ["#{WebDriver.root}/firefox/prebuilt/nsIResponseHandler.xpt", "components/nsIResponseHandler.xpt"],
17
17
  ]
18
18
 
19
- NATIVE = {
20
- :windows => ["#{WebDriver.root}/firefox/prebuilt/Win32/Release/webdriver-firefox.dll", "platform/WINNT_x86-msvc/components/webdriver-firefox.dll"],
21
- :linux => ["#{WebDriver.root}/firefox/prebuilt/linux64/Release/libwebdriver-firefox.so", "platform/Linux/components/libwebdriver-firefox.so"]
22
- }
19
+ NATIVE_WINDOWS = ["#{WebDriver.root}/firefox/prebuilt/Win32/Release/webdriver-firefox.dll", "platform/WINNT_x86-msvc/components/webdriver-firefox.dll"]
20
+ NATIVE_LINUX = [
21
+ ["#{WebDriver.root}/firefox/prebuilt/linux/Release/libwebdriver-firefox.so", "platform/Linux_x86-gcc3/components/libwebdriver-firefox.so"],
22
+ ["#{WebDriver.root}/firefox/prebuilt/linux64/Release/libwebdriver-firefox.so", "platform/Linux_x86_64-gcc3/components/libwebdriver-firefox.so"]
23
+ ]
23
24
 
24
25
  NO_FOCUS = [
25
- ["#{WebDriver.root}/firefox/prebuilt/linux64/Release/x_ignore_nofocus.so" , "amd64/x_ignore_nofocus.so"],
26
- ["#{WebDriver.root}/firefox/prebuilt/linux/Release/x_ignore_nofocus.so" , "x86/x_ignore_nofocus.so"],
26
+ ["#{WebDriver.root}/firefox/prebuilt/linux64/Release/x_ignore_nofocus.so", "amd64/x_ignore_nofocus.so"],
27
+ ["#{WebDriver.root}/firefox/prebuilt/linux/Release/x_ignore_nofocus.so", "x86/x_ignore_nofocus.so"],
27
28
  ]
28
29
 
29
30
  SHARED = [
@@ -90,13 +91,21 @@ module Selenium
90
91
  from_to = XPTS + SHARED
91
92
 
92
93
  if native_events?
93
- from_to << (NATIVE[Platform.os] || raise(Error::WebDriverError,
94
- "can't enable native events on #{Platform.os.inspect}"))
94
+ case Platform.os
95
+ when :linux
96
+ NATIVE_LINUX.each do |lib|
97
+ from_to << lib
98
+ end
99
+ when :windows
100
+ from_to << NATIVE_WINDOWS
101
+ else
102
+ raise Error::WebDriverError, "can't enable native events on #{Platform.os.inspect}"
103
+ end
95
104
  end
96
105
 
97
106
  if Platform.os == :linux || load_no_focus_lib?
98
107
  from_to += NO_FOCUS
99
- modify_link_library_path(NO_FOCUS.map { |source, dest| File.join(ext_path, dest) })
108
+ modify_link_library_path(NO_FOCUS.map { |source, dest| File.join(ext_path, File.dirname(dest)) })
100
109
  end
101
110
 
102
111
  from_to.each do |source, destination|
@@ -90,6 +90,10 @@ module Selenium
90
90
  end
91
91
  end
92
92
 
93
+ def switchToDefaultContent
94
+ switchToFrame ""
95
+ end
96
+
93
97
  def quit
94
98
  getWindowHandles.each do |handle|
95
99
  begin
@@ -62,6 +62,7 @@ module Selenium
62
62
 
63
63
  def extract_string_from(string_ptr_ref)
64
64
  string_ptr = string_ptr_ref.get_pointer(0)
65
+ return if string_ptr.null? # getElementAttribute()
65
66
 
66
67
  length_ptr = FFI::MemoryPointer.new :int
67
68
 
@@ -78,7 +79,7 @@ module Selenium
78
79
 
79
80
  wstring_to_bytestring raw_string
80
81
  ensure
81
- Lib.wdFreeString(string_ptr)
82
+ Lib.wdFreeString(string_ptr) unless string_ptr.null?
82
83
  string_ptr_ref.free
83
84
  end
84
85
 
@@ -87,7 +88,7 @@ module Selenium
87
88
  length_ptr = FFI::MemoryPointer.new :int
88
89
 
89
90
  check_error_code Lib.wdcGetElementCollectionLength(elements_ptr, length_ptr),
90
- "Cannot extract elements from collection"
91
+ "Cannot extract elements from collection"
91
92
 
92
93
  arr = []
93
94
 
@@ -131,6 +131,10 @@ module Selenium
131
131
  execute :switchToFrame, :id => id
132
132
  end
133
133
 
134
+ def switchToDefaultContent
135
+ execute :switchToFrame, :id => nil
136
+ end
137
+
134
138
  def quit
135
139
  execute :quit
136
140
  end
@@ -56,7 +56,7 @@ module Selenium
56
56
  if res.content_type == CONTENT_TYPE
57
57
  Response.new do |r|
58
58
  r.code = res.code.to_i
59
- r.payload = JSON.parse(res.body)
59
+ r.payload = JSON.parse(res.body.strip)
60
60
  end
61
61
  elsif res.code == '204'
62
62
  Response.new { |r| r.code = res.code.to_i }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jari Bakken
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-05 00:00:00 +01:00
12
+ date: 2010-01-21 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -111,6 +111,7 @@ files:
111
111
  - common/src/js/core/scripts/find_matching_child.js
112
112
  - common/src/js/core/scripts/htmlutils.js
113
113
  - common/src/js/core/scripts/injection.html
114
+ - common/src/js/core/scripts/rpc-optimizing-user-extension.js
114
115
  - common/src/js/core/scripts/selenium-api.js
115
116
  - common/src/js/core/scripts/selenium-browserbot.js
116
117
  - common/src/js/core/scripts/selenium-browserdetect.js