lib/watir-webdriver/elements/iframe.rb in watir-webdriver-0.6.11 vs lib/watir-webdriver/elements/iframe.rb in watir-webdriver-0.7.0
- old
+ new
@@ -3,75 +3,83 @@
class IFrame < HTMLElement
def locate
@parent.assert_exists
- locator = locator_class.new(@parent.wd, @selector.merge(:tag_name => tag_name), self.class.attribute_list)
+ locator = locator_class.new(@parent.wd, @selector.merge(:tag_name => frame_tag), self.class.attribute_list)
element = locator.locate
element or raise UnknownFrameException, "unable to locate #{@selector[:tag_name]} using #{selector_string}"
- @parent.reset!
-
FramedDriver.new(element, driver)
end
+ def switch_to!
+ locate.send :switch!
+ end
+
def assert_exists
if @selector.has_key? :element
raise UnknownFrameException, "wrapping a WebDriver element as a Frame is not currently supported"
end
- if @element && !Watir.always_locate?
- begin
- @element.tag_name # rpc
- return @element
- rescue Selenium::WebDriver::Error::ObsoleteElementError
- @element = nil # re-locate
- end
- end
-
super
end
def html
assert_exists
# this will actually give us the innerHTML instead of the outerHTML of the <frame>,
# but given the choice this seems more useful
- execute_atom(:getOuterHtml, @element.find_element(:tag_name => "html")).strip
+ element_call { execute_atom(:getOuterHtml, @element.find_element(:tag_name => "html")).strip }
end
def execute_script(*args)
browser.execute_script(*args)
end
private
- def tag_name
+ def frame_tag
'iframe'
end
end # IFrame
class IFrameCollection < ElementCollection
def to_a
- (0...elements.size).map { |idx| element_class.new @parent, :index => idx }
+ # In case `#all_elements` returns empty array, but `#elements`
+ # returns non-empty array (i.e. any frame has loaded between these two calls),
+ # index will return nil. That's why `#all_elements` should always
+ # be called after `#elements.`
+ element_indexes = elements.map { |el| all_elements.index(el) }
+ element_indexes.map { |idx| element_class.new(@parent, tag_name: @selector[:tag_name], :index => idx) }
end
def element_class
IFrame
end
+ private
+
+ def all_elements
+ locator_class.new(
+ @parent.wd,
+ { tag_name: @selector[:tag_name] },
+ element_class.attribute_list
+ ).locate_all
+ end
+
end # IFrameCollection
class Frame < IFrame
private
- def tag_name
+ def frame_tag
'frame'
end
end # Frame
@@ -108,10 +116,10 @@
@element = element
@driver = driver
end
def ==(other)
- @element == other.wd
+ wd == other.wd
end
alias_method :eql?, :==
def send_keys(*args)
switch!