module Watir # This class is the means of accessing an image on a page. # Normally a user would not need to create this object as it is returned by the Watir::Container#image method # # many of the methods available to this object are inherited from the Element class # class Image < Element def initialize(container, how, what) set_container container @how = how @what = what super nil end def locate if @how == :xpath @o = @container.element_by_xpath(@what) elsif @how == :css @o = @container.element_by_css(@what) else @o = @container.locate_tagged_element('IMG', @how, @what) end end # this method produces the properties for an image as an array def image_string_creator n = [] n << "src:".ljust(TO_S_SIZE) + self.src.to_s n << "file date:".ljust(TO_S_SIZE) + self.fileCreatedDate.to_s n << "file size:".ljust(TO_S_SIZE) + self.fileSize.to_s n << "width:".ljust(TO_S_SIZE) + self.width.to_s n << "height:".ljust(TO_S_SIZE) + self.height.to_s n << "alt:".ljust(TO_S_SIZE) + self.alt.to_s return n end private :image_string_creator # returns a string representation of the object def to_s assert_exists r = string_creator r += image_string_creator return r.join("\n") end # this method returns the file created date of the image def file_created_date assert_exists return @o.invoke("fileCreatedDate") end # this method returns the filesize of the image def file_size assert_exists return @o.invoke("fileSize").to_s end # returns the width in pixels of the image, as a string def width assert_exists return @o.invoke("width").to_s end # returns the height in pixels of the image, as a string def height assert_exists return @o.invoke("height").to_s end # This method attempts to find out if the image was actually loaded by the web browser. # If the image was not loaded, the browser is unable to determine some of the properties. # We look for these missing properties to see if the image is really there or not. # If the Disk cache is full (tools menu -> Internet options -> Temporary Internet Files), it may produce incorrect responses. def loaded? locate raise UnknownObjectException, "Unable to locate image using #{@how} and #{@what}" if @o == nil return false if @o.fileCreatedDate == "" and @o.fileSize.to_i == -1 return true end # this method highlights the image (in fact it adds or removes a border around the image) # * set_or_clear - symbol - :set to set the border, :clear to remove it def highlight(set_or_clear) if set_or_clear == :set begin @original_border = @o.border @o.border = 1 rescue @original_border = nil end else begin @o.border = @original_border @original_border = nil rescue # we could be here for a number of reasons... ensure @original_border = nil end end end private :highlight # This method saves the image to the file path that is given. The # path must be in windows format (c:\\dirname\\somename.gif). This method # will not overwrite a previously existing image. If an image already # exists at the given path then a dialog will be displayed prompting # for overwrite. # path - directory path and file name of where image should be saved def save(path) @container.goto(src) begin thrd = fill_save_image_dialog(path) @container.document.execCommand("SaveAs") thrd.join(5) ensure @container.back end end def fill_save_image_dialog(path) command = "require 'rautomation';" << "window=::RAutomation::Window.new(:title => 'Save Picture');" << "window.text_field(:class => 'Edit', :index => 0).set('#{path}');" << "window.button(:value => '&Save').click" Thread.new do system("ruby -e \"#{command}\"") end end private :fill_save_image_dialog end end