# IE Control Library Ver.0.1.0 2003/11/30 # Copyright (C) 2003 Oka Yasushi # # You may redistribute it and/or modify it under the same license terms as Ruby. require 'win32ole' class IE_Wrapper def initialize(raw_object, ie_obj=nil) @ie = ie_obj @raw_object = raw_object end def raw @raw_object end private def method_missing(m_id, *params) missing_method_name = m_id.to_s # downcase method name if methods.include?(m_id.to_s.downcase) send(m_id.to_s.downcase.intern, *params) else begin @raw_object.send(m_id, *params) rescue raise $!,$!.message, caller end end end def inspect() self.type end def set_ie(ie_obj) @ie = ie_obj end COMPLETE_STATE = 4 def wait_until_stable(ie) return unless ie while ie.busy == true sleep 0.5 end loop do break if ie.readyState == COMPLETE_STATE sleep 0.5 end end end # ======================== # IE # ======================== class IE < IE_Wrapper def initialize(visible_flag = true) @raw_object = WIN32OLE.new("InternetExplorer.Application") @ie = @raw_object if visible_flag @ie.visible = true end end def document() doc = Document.new(@ie.document, @ie) end def navigate(url) @ie.navigate(url) wait_until_stable(@ie) end def wait_stable() wait_until_stable(@ie) end # ======================== # IE.Document # ======================== class Document < IE_Wrapper def frames(index=nil) if index return(nil) if index >= @raw_object.frames.length Frames.new(@raw_object.frames, @ie)[index] else Frames.new(@raw_object.frames, @ie) end end def all() TagElementCollection.new(@raw_object.all, @ie) end def tags(tag_name) TagElementCollection.new(@raw_object.all.tags(tag_name), @ie) end def head() TagElementCollection.new(@raw_object.all.tags("HEAD"), @ie)[0] end def body() TagElementCollection.new(@raw_object.all.tags("BODY"), @ie)[0] end end # ======================== # TAG Element Collection # ======================== class TagElementCollection < IE_Wrapper def [](index) if index.type == Fixnum return(nil) if index >= @raw_object.length TagElement.new(@raw_object.item(index), @ie) elsif index.type == Range raise "Range Not Support for TagElementCollection#[]" end end def size @raw_object.length end def each @raw_object.each {|tag_element| yield TagElement.new(tag_element, @ie) } end def get_tag_by_title(target_str) get_tag_by_key(target_str, "VALUE") end def get_tag_by_value(target_str) get_tag_by_key(target_str, "VALUE") end def get_tag_by_text(target_str) get_tag_by_key(target_str, "INNERTEXT") end def get_tag_by_name(target_str) get_tag_by_key(target_str, "NAME") end def get_tag_by_option(target_str) get_tag_by_key(target_str, "INNERHTML") end def inspect() element_inspect_list = [] self.each {|tag_element| element_inspect_list.push tag_element.inspect } "#{self.type},#{element_inspect_list.join('/')}" end private def get_tag_by_key(target_str, key_type) tag_list = [] @raw_object.each {|tag_element| case key_type when "INNERTEXT" key_string = tag_element.innerText.gsub(/\s/, "") when "VALUE" key_string = tag_element.value.gsub(/\s/, "") when "NAME" key_string = tag_element.name when "INNERHTML" key_string = tag_element.innerHTML.gsub(/\s/, "") else return nil end if key_string =~ /#{target_str}/ tag_list.push TagElement.new(tag_element, @ie) end } case tag_list.size when 0 return nil when 1 return tag_list[0] else return tag_list end end end # ======================== # TAG Element # ======================== class TagElement < IE_Wrapper def tagname @raw_object.tagName end def text=(set_text) case tagName when "SELECT" option_list = tags("OPTION") option_list.each {|option_element| if option_element.innerText == set_text option_element.selected = true break end } else @raw_object.value = set_text end end def inspect() case tagName when "SELECT" innerHTML = replace_cr_code(self.innerHTML) "#{self.type}:<#{tagName}>:[#{self.innerHTML}]" when "INPUT", "IMG", "A" outerHTML = replace_cr_code(self.outerHTML) "#{self.type}:<#{tagName}>:[#{self.outerHTML}]" when "TR", "TD" innerText = replace_cr_code(self.innerText) "#{self.type}:<#{tagName}>:[#{innerText}]" else "#{self.type}:<#{tagName}>" end end def to_s @raw_object.value end def click @raw_object.click wait_until_stable(@ie) end def tags(tag_name) TagElementCollection.new(@raw_object.all.tags(tag_name), @ie) end def all TagElementCollection.new(@raw_object.all, @ie) end private def replace_cr_code(text) replcae_text = text.gsub(/\r/, '\r') replcae_text.gsub!(/\n/, '\n') return replcae_text end end # ======================== # IE.Document.Frames # ======================== class Frames < IE_Wrapper def [](index) return(nil) if index >= @raw_object.length Frame.new(@raw_object.item(index), @ie) end def size @raw_object.length end def each index = 0 while index < @raw_object.length raw_frame = @raw_object.item(index) ie_frame = Frame.new(raw_frame, @ie) yield(ie_frame) index += 1 end end end # ======================== # IE.Document.Frames.item(n) # ======================== class Frame < IE_Wrapper def document Document.new(@raw_object.document, @ie) end end end