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!