module Watir
class IFrame < HTMLElement
def locate
return if @selector.empty?
@query_scope.ensure_context
selector = @selector.merge(tag_name: frame_tag)
element_validator = element_validator_class.new
selector_builder = selector_builder_class.new(@query_scope, selector, self.class.attribute_list)
locator = locator_class.new(@query_scope, selector, selector_builder, element_validator)
element = locator.locate
element or raise unknown_exception, "unable to locate #{@selector[:tag_name]} using #{selector_string}"
@element = FramedDriver.new(element, browser)
end
def ==(other)
return false unless other.is_a?(self.class)
wd == other.wd.is_a?(FramedDriver) ? other.wd.send(:wd) : other.wd
end
def switch_to!
locate.send :switch!
end
def assert_exists
if @element && @selector.empty?
raise UnknownFrameException, "wrapping a Selenium element as a Frame is not currently supported"
end
super
end
#
# Returns text of iframe body.
#
# @return [String]
#
def text
body.text
end
#
# Returns HTML code of iframe.
#
# @return [String]
#
def html
wait_for_exists
@element.page_source
end
#
# Executes JavaScript snippet in context of frame.
#
# @see Watir::Browser#execute_script
#
def execute_script(script, *args)
args.map! { |e| e.kind_of?(Watir::Element) ? e.wd : e }
returned = driver.execute_script(script, *args)
browser.send(:wrap_elements_in, self, returned)
end
def ensure_context
switch_to!
end
private
def frame_tag
'iframe'
end
def unknown_exception
Watir::Exception::UnknownFrameException
end
end # IFrame
class IFrameCollection < ElementCollection
end # IFrameCollection
class Frame < IFrame
private
def frame_tag
'frame'
end
end # Frame
class FrameCollection < IFrameCollection
end # FrameCollection
module Container
def frame(*args)
Frame.new(self, extract_selector(args).merge(tag_name: "frame"))
end
def frames(*args)
FrameCollection.new(self, extract_selector(args).merge(tag_name: "frame"))
end
end # Container
# @api private
#
# another hack..
#
class FramedDriver
def initialize(element, browser)
@element = element
@browser = browser
@driver = browser.driver
end
def ==(other)
wd == other.wd
end
alias_method :eql?, :==
def send_keys(*args)
switch!
@driver.switch_to.active_element.send_keys(*args)
end
protected
def wd
@element
end
private
def method_missing(meth, *args, &blk)
if @driver.respond_to?(meth)
switch!
@driver.send(meth, *args, &blk)
else
@element.send(meth, *args, &blk)
end
end
def switch!
@driver.switch_to.frame @element
@browser.default_context = false
rescue Selenium::WebDriver::Error::NoSuchFrameError => e
raise Exception::UnknownFrameException, e.message
end
end # FramedDriver
end # Watir