Class: Selenium::WebDriver::IE::Bridge

Inherits:
Object
  • Object
show all
Includes:
Util
Defined in:
lib/selenium/webdriver/ie/bridge.rb

Constant Summary

Constants included from Util

Util::CP_ACP, Util::CP_MACCP, Util::CP_OEMCP, Util::CP_SYMBOL, Util::CP_THREAD_ACP, Util::CP_UTF7, Util::CP_UTF8

Instance Method Summary collapse

Methods included from Util

#create_element, #create_element_collection, #create_string, #extract_elements_from, #extract_string_from, #string_array_from, #wstring_ptr, #wstring_to_bytestring

Constructor Details

#initializeBridge

Returns a new instance of Bridge



12
13
14
15
16
17
18
19
20
# File 'lib/selenium/webdriver/ie/bridge.rb', line 12

def initialize
  ptr_ref = FFI::MemoryPointer.new :pointer

  check_error_code Lib.wdNewDriverInstance(ptr_ref),
                   "could not create driver instance"

  @driver_pointer = ptr_ref.get_pointer(0)
  @speed          = :fast
end

Instance Method Details

#addCookie(opts) ⇒ Object

Configuration



176
177
178
179
180
181
182
183
# File 'lib/selenium/webdriver/ie/bridge.rb', line 176

def addCookie(opts)
  cookie_string  = "#{opts[:name]}=#{opts[:value]}; "
  cookie_string << "path=#{opts[:path]}; "                  if opts[:path] && !opts[:path].empty?
  cookie_string << "domain=#{opts[:domain][/^(.+?):/, 1]};" if opts[:domain] && !opts[:domain].empty?

  check_error_code Lib.wdAddCookie(@driver_pointer, wstring_ptr(cookie_string)),
                   "unable to add cookie"
end

#browserObject



22
23
24
# File 'lib/selenium/webdriver/ie/bridge.rb', line 22

def browser
  :internet_explorer
end

#clearElement(element_pointer) ⇒ Object



372
373
374
# File 'lib/selenium/webdriver/ie/bridge.rb', line 372

def clearElement(element_pointer)
  check_error_code Lib.wdeClear(element_pointer), "unable to clear element"
end

#clickElement(element_pointer) ⇒ Object

Element functions



334
335
336
# File 'lib/selenium/webdriver/ie/bridge.rb', line 334

def clickElement(element_pointer)
  check_error_code Lib.wdeClick(element_pointer), "unable to click element"
end

#closeObject



122
123
124
# File 'lib/selenium/webdriver/ie/bridge.rb', line 122

def close
  check_error_code Lib.wdClose(@driver_pointer), "unable to close driver"
end

#deleteAllCookiesObject

Raises:

  • (NotImplementedError)


209
210
211
# File 'lib/selenium/webdriver/ie/bridge.rb', line 209

def deleteAllCookies
  raise NotImplementedError, "missing from IE driver"
end

#deleteCookie(name) ⇒ Object

Raises:

  • (NotImplementedError)


205
206
207
# File 'lib/selenium/webdriver/ie/bridge.rb', line 205

def deleteCookie(name)
  raise NotImplementedError, "missing from IE driver"
end

#dragElement(element_pointer, right_by, down_by) ⇒ Object



444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
# File 'lib/selenium/webdriver/ie/bridge.rb', line 444

def dragElement(element_pointer, right_by, down_by)
  # TODO: check return values?
  hwnd                = FFI::MemoryPointer.new :pointer
  x, y, width, height = Array.new(4) { FFI::MemoryPointer.new :long }

  check_error_code Lib.wdeGetDetailsOnceScrolledOnToScreen(element_pointer, hwnd, x, y, width, height),
                   "unable to determine location once scrolled on to screen"

  Lib.wdeMouseDownAt(hwnd.get_pointer(0), x.get_long(0), y.get_long(0))

  destination_x = x.get_long(0) + right_by
  destination_y = y.get_long(0) + down_by
  duration      = 500 # TODO: parent.manage().getSpeed().getTimeOut();

  Lib.wdeMouseMoveTo(hwnd.get_pointer(0), duration, x.get_long(0), y.get_long(0), destination_x, destination_y)
  Lib.wdeMouseUpAt(hwnd.get_pointer(0), destination_x, destination_y)
ensure
  [hwnd, x, y, width, height].each { |pointer| pointer.free }
end

#driver_extensionsObject



26
27
28
# File 'lib/selenium/webdriver/ie/bridge.rb', line 26

def driver_extensions
  []
end

#elementEquals(element, other) ⇒ Object



440
441
442
# File 'lib/selenium/webdriver/ie/bridge.rb', line 440

def elementEquals(element, other)
  executeScript "return arguments[0] === arguments[1]", element, other
end

#executeScript(script, *args) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/selenium/webdriver/ie/bridge.rb', line 146

def executeScript(script, *args)
  script_args_ref = FFI::MemoryPointer.new :pointer
  result          = Lib.wdNewScriptArgs(script_args_ref, args.size)

  check_error_code result, "unable to create new script arguments array"

  args_pointer = script_args_ref.get_pointer(0)
  populate_arguments(result, args_pointer, args)

  script            = "(function() { return function(){" + script + "};})();"
  script_result_ref = FFI::MemoryPointer.new :pointer

  check_error_code Lib.wdExecuteScript(@driver_pointer, wstring_ptr(script), args_pointer, script_result_ref),
                   "Cannot execute script"

  extract_return_value script_result_ref
ensure
  script_args_ref.free
  script_result_ref.free if script_result_ref
  Lib.wdFreeScriptArgs(args_pointer) if args_pointer
end

#finalize(element_pointer) ⇒ Object



488
489
490
491
# File 'lib/selenium/webdriver/ie/bridge.rb', line 488

def finalize(element_pointer)
  check_error_code Lib.wdeFreeElement(element_pointer),
                   "unable to finalize #{element_pointer} for #{self}"
end

#findElementByClassName(parent, class_name) ⇒ Object

Finders



225
226
227
228
229
230
231
232
# File 'lib/selenium/webdriver/ie/bridge.rb', line 225

def findElementByClassName(parent, class_name)
  # TODO: argument checks

  create_element do |raw_element|
    check_error_code Lib.wdFindElementByClassName(@driver_pointer, parent, wstring_ptr(class_name), raw_element),
                     "unable to find element by class name using #{class_name.inspect}"
  end
end

#findElementById(parent, id) ⇒ Object



243
244
245
246
247
248
# File 'lib/selenium/webdriver/ie/bridge.rb', line 243

def findElementById(parent, id)
  create_element do |raw_element|
    check_error_code Lib.wdFindElementById(@driver_pointer, parent, wstring_ptr(id), raw_element),
                     "unable to find element by id using #{id.inspect}"
  end
end

#findElementByLinkText(parent, link_text) ⇒ Object



257
258
259
260
261
262
# File 'lib/selenium/webdriver/ie/bridge.rb', line 257

def findElementByLinkText(parent, link_text)
  create_element do |raw_element|
    check_error_code Lib.wdFindElementByLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_element),
                     "unable to find element by link text using #{link_text.inspect}"
  end
end

#findElementByName(parent, name) ⇒ Object



285
286
287
288
289
290
# File 'lib/selenium/webdriver/ie/bridge.rb', line 285

def findElementByName(parent, name)
  create_element do |raw_element|
    check_error_code Lib.wdFindElementByName(@driver_pointer, parent, wstring_ptr(name), raw_element),
                     "unable to find element by name using #{name.inspect}"
  end
end

#findElementByPartialLinkText(parent, link_text) ⇒ Object



271
272
273
274
275
276
# File 'lib/selenium/webdriver/ie/bridge.rb', line 271

def findElementByPartialLinkText(parent, link_text)
  create_element do |raw_element|
    check_error_code Lib.wdFindElementByPartialLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_element),
                     "unable to find element by partial link text using #{link_text.inspect}"
  end
end

#findElementByTagName(parent, tag_name) ⇒ Object



299
300
301
302
303
304
# File 'lib/selenium/webdriver/ie/bridge.rb', line 299

def findElementByTagName(parent, tag_name)
  create_element do |raw_element|
    check_error_code Lib.wdFindElementByTagName(@driver_pointer, parent, wstring_ptr(tag_name), raw_element),
                     "unable to find element by tag name using #{tag_name.inspect}"
  end
end

#findElementByXpath(parent, xpath) ⇒ Object



313
314
315
316
317
318
319
# File 'lib/selenium/webdriver/ie/bridge.rb', line 313

def findElementByXpath(parent, xpath)
  create_element do |raw_element|
    check_error_code Lib.wdFindElementByXPath(@driver_pointer, parent, wstring_ptr(xpath), raw_element),
                     "unable to find element by xpath using #{xpath.inspect}"
    # TODO: Additional error handling
  end
end

#findElementsByClassName(parent, class_name) ⇒ Object



234
235
236
237
238
239
240
241
# File 'lib/selenium/webdriver/ie/bridge.rb', line 234

def findElementsByClassName(parent, class_name)
  # TODO: argument checks

  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsByClassName(@driver_pointer, parent, wstring_ptr(class_name), raw_elements),
                     "unable to find elements by class name using #{class_name.inspect}"
  end
end

#findElementsById(parent, id) ⇒ Object



250
251
252
253
254
255
# File 'lib/selenium/webdriver/ie/bridge.rb', line 250

def findElementsById(parent, id)
  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsById(@driver_pointer, parent, wstring_ptr(id), raw_elements),
                     "unable to find elements by id using #{id.inspect}"
  end
end

#findElementsByLinkText(parent, link_text) ⇒ Object



264
265
266
267
268
269
# File 'lib/selenium/webdriver/ie/bridge.rb', line 264

def findElementsByLinkText(parent, link_text)
  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsByLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_elements),
                     "unable to find elements by link text using #{link_text.inspect}"
  end
end

#findElementsByName(parent, name) ⇒ Object



292
293
294
295
296
297
# File 'lib/selenium/webdriver/ie/bridge.rb', line 292

def findElementsByName(parent, name)
  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsByName(@driver_pointer, parent, wstring_ptr(name), raw_elements),
                     "unable to find elements by name using #{name.inspect}"
  end
end

#findElementsByPartialLinkText(parent, link_text) ⇒ Object



278
279
280
281
282
283
# File 'lib/selenium/webdriver/ie/bridge.rb', line 278

def findElementsByPartialLinkText(parent, link_text)
  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsByPartialLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_elements),
                     "unable to find elements by partial link text using #{link_text.inspect}"
  end
end

#findElementsByTagName(parent, tag_name) ⇒ Object



306
307
308
309
310
311
# File 'lib/selenium/webdriver/ie/bridge.rb', line 306

def findElementsByTagName(parent, tag_name)
  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsByTagName(@driver_pointer, parent, wstring_ptr(tag_name), raw_elements),
                     "unable to find elements by tag name using #{tag_name.inspect}"
  end
end

#findElementsByXpath(parent, xpath) ⇒ Object



321
322
323
324
325
326
327
# File 'lib/selenium/webdriver/ie/bridge.rb', line 321

def findElementsByXpath(parent, xpath)
  create_element_collection do |raw_elements|
    check_error_code Lib.wdFindElementsByXPath(@driver_pointer, parent, wstring_ptr(xpath), raw_elements),
                     "unable to find elements by xpath using #{xpath.inspect}"
    # TODO: Additional error handling
  end
end

#get(url) ⇒ Object



30
31
32
33
# File 'lib/selenium/webdriver/ie/bridge.rb', line 30

def get(url)
  check_error_code Lib.wdGet(@driver_pointer, wstring_ptr(url)),
                   "Cannot get url #{url.inspect}"
end

#getAllCookiesObject



185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/selenium/webdriver/ie/bridge.rb', line 185

def getAllCookies
  str = create_string do |wrapper|
    check_error_code Lib.wdGetCookies(@driver_pointer, wrapper), "unable to get cookies"
  end

  str.split("; ").map do |cookie_string|
    parts = cookie_string.split("=")
    next unless parts.size == 2

    {
      'name'    => parts[0],
      'value'   => parts[1],
      'domain'  => getCurrentUrl,
      'path'    => "",
      'expires' => nil,
      'secure'  => false
    }
  end.compact
end

#getBrowserVisibleObject



66
67
68
69
70
71
72
73
# File 'lib/selenium/webdriver/ie/bridge.rb', line 66

def getBrowserVisible
  int_ptr = FFI::MemoryPointer.new :int
  check_error_code Lib.wdGetVisible(@driver_pointer, int_ptr), "unable to determine if browser is visible"

  int_ptr.get_int(0) == 1
ensure
  int_ptr.free
end

#getCurrentUrlObject



35
36
37
38
39
40
# File 'lib/selenium/webdriver/ie/bridge.rb', line 35

def getCurrentUrl
  create_string do |wrapper|
    check_error_code Lib.wdGetCurrentUrl(@driver_pointer, wrapper),
                     "unable to get current URL"
  end
end

#getCurrentWindowHandleObject



139
140
141
142
143
144
# File 'lib/selenium/webdriver/ie/bridge.rb', line 139

def getCurrentWindowHandle
  create_string do |string_pointer|
    check_error_code Lib.wdGetCurrentWindowHandle(@driver_pointer, string_pointer),
                     "unable to obtain current window handle"
  end
end

#getElementAttribute(element_pointer, name) ⇒ Object



345
346
347
348
349
350
# File 'lib/selenium/webdriver/ie/bridge.rb', line 345

def getElementAttribute(element_pointer, name)
  create_string do |string_pointer|
    check_error_code Lib.wdeGetAttribute(@driver_pointer, element_pointer, wstring_ptr(name), string_pointer),
                     "unable to get attribute #{name.inspect}"
  end
end

#getElementLocation(element_pointer) ⇒ Object



464
465
466
467
468
469
470
471
472
473
474
# File 'lib/selenium/webdriver/ie/bridge.rb', line 464

def getElementLocation(element_pointer)
  x = FFI::MemoryPointer.new :long
  y = FFI::MemoryPointer.new :long

  check_error_code Lib.wdeGetLocation(element_pointer, x, y), "unable to get location of element"

  Point.new x.get_int(0), y.get_int(0)
ensure
  x.free
  y.free
end

#getElementSize(element_pointer) ⇒ Object



476
477
478
479
480
481
482
483
484
485
486
# File 'lib/selenium/webdriver/ie/bridge.rb', line 476

def getElementSize(element_pointer)
  width  = FFI::MemoryPointer.new :long
  height = FFI::MemoryPointer.new :long

  check_error_code Lib.wdeGetSize(element_pointer, width, height), "unable to get size of element"

  Dimension.new width.get_int(0), height.get_int(0)
ensure
  width.free
  height.free
end

#getElementTagName(element_pointer) ⇒ Object



338
339
340
341
342
343
# File 'lib/selenium/webdriver/ie/bridge.rb', line 338

def getElementTagName(element_pointer)
  create_string do |string_pointer|
    check_error_code Lib.wdeGetTagName(element_pointer, string_pointer),
                     "unable to get tag name"
  end
end

#getElementText(element_pointer) ⇒ Object



357
358
359
360
361
362
363
364
# File 'lib/selenium/webdriver/ie/bridge.rb', line 357

def getElementText(element_pointer)
  val = create_string do |string_pointer|
    check_error_code Lib.wdeGetText(element_pointer, string_pointer),
                     "unable to get text"
  end

  val.gsub("\r\n", "\n") if val
end

#getElementValue(element_pointer) ⇒ Object



352
353
354
355
# File 'lib/selenium/webdriver/ie/bridge.rb', line 352

def getElementValue(element_pointer)
  val = getElementAttribute(element_pointer, 'value')
  val.gsub("\r\n", "\n") if val
end

#getElementValueOfCssProperty(element_pointer, prop) ⇒ Object



429
430
431
432
433
434
# File 'lib/selenium/webdriver/ie/bridge.rb', line 429

def getElementValueOfCssProperty(element_pointer, prop)
  create_string do |string_pointer|
    check_error_code Lib.wdeGetValueOfCssProperty(element_pointer, wstring_ptr(prop), string_pointer),
                     "unable to get value of css property: #{prop.inspect}"
  end
end

#getPageSourceObject



59
60
61
62
63
64
# File 'lib/selenium/webdriver/ie/bridge.rb', line 59

def getPageSource
  create_string do |wrapper|
    check_error_code Lib.wdGetPageSource(@driver_pointer, wrapper),
                     "unable to get page source"
  end
end

#getSpeedObject



217
218
219
# File 'lib/selenium/webdriver/ie/bridge.rb', line 217

def getSpeed
  @speed
end

#getTitleObject



52
53
54
55
56
57
# File 'lib/selenium/webdriver/ie/bridge.rb', line 52

def getTitle
  create_string do |wrapper|
    check_error_code Lib.wdGetTitle(@driver_pointer, wrapper),
                     "unable to get title"
  end
end

#getWindowHandlesObject



130
131
132
133
134
135
136
137
# File 'lib/selenium/webdriver/ie/bridge.rb', line 130

def getWindowHandles
  raw_handles = FFI::MemoryPointer.new :pointer
  check_error_code Lib.wdGetAllWindowHandles(@driver_pointer, raw_handles),
                   "unable to obtain all window handles"

  string_array_from(raw_handles).uniq
  # TODO: who calls raw_handles.free if exception is raised?
end

#goBackObject



42
43
44
45
# File 'lib/selenium/webdriver/ie/bridge.rb', line 42

def goBack
  check_error_code Lib.wdGoBack(@driver_pointer),
                   "Cannot navigate back"
end

#goForwardObject



47
48
49
50
# File 'lib/selenium/webdriver/ie/bridge.rb', line 47

def goForward
  check_error_code Lib.wdGoForward(@driver_pointer),
                   "Cannot navigate back"
end

#hoverOverElement(element_pointer) ⇒ Object

Raises:

  • (NotImplementedError)


436
437
438
# File 'lib/selenium/webdriver/ie/bridge.rb', line 436

def hoverOverElement(element_pointer)
  raise NotImplementedError
end

#isElementDisplayed(element_pointer) ⇒ Object



396
397
398
399
400
401
402
403
# File 'lib/selenium/webdriver/ie/bridge.rb', line 396

def isElementDisplayed(element_pointer)
  int_ptr = FFI::MemoryPointer.new :int
  check_error_code Lib.wdeIsDisplayed(element_pointer, int_ptr), "unable to check visibilty"

  int_ptr.get_int(0) == 1;
ensure
  int_ptr.free
end

#isElementEnabled(element_pointer) ⇒ Object



376
377
378
379
380
381
382
383
384
# File 'lib/selenium/webdriver/ie/bridge.rb', line 376

def isElementEnabled(element_pointer)
  int_ptr = FFI::MemoryPointer.new(:int)
  check_error_code Lib.wdeIsEnabled(element_pointer, int_ptr),
                   "unable to get enabled state"

  int_ptr.get_int(0) == 1
ensure
  int_ptr.free
end

#isElementSelected(element_pointer) ⇒ Object



386
387
388
389
390
391
392
393
394
# File 'lib/selenium/webdriver/ie/bridge.rb', line 386

def isElementSelected(element_pointer)
  int_ptr = FFI::MemoryPointer.new(:int)
  check_error_code Lib.wdeIsSelected(element_pointer, int_ptr),
                   "unable to get selected state"

  int_ptr.get_int(0) == 1
ensure
  int_ptr.free
end

#quitObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/selenium/webdriver/ie/bridge.rb', line 106

def quit
  getWindowHandles.each do |handle|
    begin
      switchToWindow handle
      close
    rescue Error::NoSuchWindowError
    end
  end

  # hack
  ObjectSpace.each_object(WebDriver::Element) { |e| finalize e.ref if e.bridge == self }
ensure
  Lib.wdFreeDriver(@driver_pointer)
  @driver_pointer = nil
end

#refreshObject



126
127
128
# File 'lib/selenium/webdriver/ie/bridge.rb', line 126

def refresh
  check_error_code Lib.wdRefresh(@driver_pointer), "unable to refresh current page"
end

#sendKeysToElement(element_pointer, string) ⇒ Object



366
367
368
369
370
# File 'lib/selenium/webdriver/ie/bridge.rb', line 366

def sendKeysToElement(element_pointer, string)
  check_error_code Lib.wdeSendKeys(element_pointer, wstring_ptr(string)),
                   "unable to send keys to #{self}"
  waitForLoadToComplete
end

#setBrowserVisible(bool) ⇒ Object



75
76
77
78
# File 'lib/selenium/webdriver/ie/bridge.rb', line 75

def setBrowserVisible(bool)
  check_error_code Lib.wdSetVisible(@driver_pointer, bool ? 1 : 0),
                   "unable to change the visibility of the browser"
end

#setElementSelected(element_pointer) ⇒ Object



425
426
427
# File 'lib/selenium/webdriver/ie/bridge.rb', line 425

def setElementSelected(element_pointer)
  check_error_code Lib.wdeSetSelected(element_pointer), "unable to select element"
end

#setImplicitWaitTimeout(milliseconds) ⇒ Object



80
81
82
83
# File 'lib/selenium/webdriver/ie/bridge.rb', line 80

def setImplicitWaitTimeout(milliseconds)
  check_error_code Lib.wdSetImplicitWaitTimeout(@driver_pointer, milliseconds),
                   "unable to set implicit wait timeout"
end

#setSpeed(speed) ⇒ Object



213
214
215
# File 'lib/selenium/webdriver/ie/bridge.rb', line 213

def setSpeed(speed)
  @speed = speed
end

#submitElement(element_pointer) ⇒ Object



405
406
407
# File 'lib/selenium/webdriver/ie/bridge.rb', line 405

def submitElement(element_pointer)
  check_error_code Lib.wdeSubmit(element_pointer), "unable to submit element"
end

#switchToActiveElementObject



95
96
97
98
99
100
# File 'lib/selenium/webdriver/ie/bridge.rb', line 95

def switchToActiveElement
  create_element do |ptr|
    check_error_code Lib.wdSwitchToActiveElement(@driver_pointer, ptr),
                     "unable to switch to active element"
  end
end

#switchToDefaultContentObject



102
103
104
# File 'lib/selenium/webdriver/ie/bridge.rb', line 102

def switchToDefaultContent
  switchToFrame ""
end

#switchToFrame(id) ⇒ Object



90
91
92
93
# File 'lib/selenium/webdriver/ie/bridge.rb', line 90

def switchToFrame(id)
  check_error_code Lib.wdSwitchToFrame(@driver_pointer, wstring_ptr(id)),
                   "unable to locate frame #{id.inspect}"
end

#switchToWindow(id) ⇒ Object



85
86
87
88
# File 'lib/selenium/webdriver/ie/bridge.rb', line 85

def switchToWindow(id)
  check_error_code Lib.wdSwitchToWindow(@driver_pointer, wstring_ptr(id)),
                   "unable to locate window #{id.inspect}"
end

#toggleElement(element_pointer) ⇒ Object



409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
# File 'lib/selenium/webdriver/ie/bridge.rb', line 409

def toggleElement(element_pointer)
  int_ptr = FFI::MemoryPointer.new :int
  result = Lib.wdeToggle(element_pointer, int_ptr)

  if result == 9
    raise WebDriver::UnsupportedOperationError,
      "You may not toggle this element: #{get_element_tag_name(element_pointer)}"
  end

  check_error_code result, "unable to toggle element"

  int_ptr.get_int(0) == 1
ensure
  int_ptr.free
end

#waitForLoadToCompleteObject



168
169
170
# File 'lib/selenium/webdriver/ie/bridge.rb', line 168

def waitForLoadToComplete
  Lib.wdWaitForLoadToComplete(@driver_pointer)
end