When running the attached script, while executing line 238, I would
get the following error:

1) Error:

test_300_buywizard(MT_mtaco):

WIN32OLERuntimeError: failed to get IEnum Interface

   HRESULT error code:0x80070005

     Access is denied.

   marketocracy_login2.rb:61:in `each'

   marketocracy_login2.rb:61:in `visible_menus'

   marketocracy_login2.rb:46:in `visible_child_by_text'

   marketocracy_login2.rb:37:in `nav_menu'

   marketocracy_login2.rb:239:in `test_300_buywizard'

(Line numbering is a bit off since I changed the script after the
error message was generated).

Note that I called the same function earlier in the test, but don't
get the error then.  The error appears to arise from line 61 in the
load_nav_menu method:

@marketocracy_divs.each do |d|

The first time it's called, the @marketocracy_divs variable is
uninitialized (set to nil).  However, when the bug arises, the
@marketocracy_divs variable still retains the values it had from a
previous call.  I suspected I got the "Access is denied" error message
because I was trying to access DIV objects that had been created from
an earlier page.   So I changed line 59 from this:


        load_nav_menu unless @marketocracy_divs # grab it on the first try

to this:
        load_nav_menu # unless @marketocracy_divs # grab it on the first try

This time it ran without error.

Since I was apparently able to work around the problem, this is posted
mostly in case someone else has a similar problem.  However, is my
analysis of the cause of the problem correct?  Any comments in general
on the causes of "Access is denied."  error messages?


About my system:

Watir 1.5  running under cygwin (2.510.2.2) on
Windows XP Professional (Version 2002, Service Pack 2).

Windows XP is in turn running as a virtual OS under Parallels (Build
3170 RC3) running on OS X Tiger 10.4.9 (2.16 GHz Intel Core 2 Duo)

cygwin+cygwin ruby (via cygwin setup.exe)+rubygems-0.9.2
(via tarball)+watir-1.5.1.1164 (via gem)
require 'rubygems'
require 'watir'
require 'ruby-debug'

require 'test/unit'
require 'test/unit/ui/console/testrunner'

Debugger.start
class MarketocracyNavMenuException < Watir::Exception::WatirException; end

module Watir

  # I am patching Watir with some custom code written
  # specifically for the marketocracy navigation menu.
  class IE

    # Once you've opened one of the top 4 menus
    # use this method to drill down to a specific
    # menu item by providing a variable length list
    # of Strings representing the menu items
    #
    # Raises MarketocracyNavMenuException  
    #
    # Typical usage: 
    #
    #   ie.image(:name, "Menu4i").fire_event("onmouseover")
    #   ie.nav_menu("Cash", "Benchmarks", "Alpha Contour")
    def nav_menu(*path)
      destination = path.pop # pop removes the last element from an array and 
returns it 
      path.each do |step| # each step in the path do the following
        child = visible_child_by_text(step)
        child.fireEvent("onmouseover")
        # Wait a few milliseconds for JavaScript to execute
        sleep 0.2
      end

      visible_child_by_text(destination).click
      wait
      load_nav_menu # need to reload divs on each page
    end
    
    private

    def visible_child_by_text(text)
      result = nil
      visible_menus.each do |menu|
        menu.children.each do |child|
          if child.innerText == text
            result = child
          end
        end
      end
      raise MarketocracyNavMenuException, "Menu item with #{text} was not 
visible!" unless result
      result
    end
    
    def visible_menus
      # execute the load_nav_menu method, unless the @marketocracy_divs 
variable      # has already been set
      load_nav_menu # unless @marketocracy_divs # grab it on the first try
      visible = []
      @marketocracy_divs.each do |d|
        # append each visible marketocracy div to the visible array
        # Where are the style and invoke methods defined? 
        visible << d if d.style.invoke('visibility') =~ /visible/
      end
      # return the array of visible divs
      visible
    end
    
    def load_nav_menu
      # Document is defined in watir.rb.  It returns an @ie.document object,
      # @ie is created by WIN32OLE.new('InternetExplorer.Application') 
      @marketocracy_divs = document.getElementsByTagName("DIV")
    end
  end
end

class MT_mtaco < Test::Unit::TestCase
        include Watir
        @@tb_adminPassword = "m"
        @@logins = "m100.csv"
        @@beginTime = Time.now
        @@homepageTime = 0
        @@overviewTime  = 0
        @@timeSpreadsheet = File.new(Time.now.strftime("%d-%b-%y") + ".csv", 
"a")  #Note this creates a new file every day...
        @@maxAllowedLoginTime = 30 
        @@executionEnvironment = "Test"
        
        def close_all_windows
                loop do
                        begin
                                Watir::IE.attach(:title, //).close
                        rescue Watir::Exception::NoMatchingWindowFoundException
                                break
                        rescue
                                retry
                        end
                end
        end
        
        def setup
                begin
                        close_all_windows
                        $ie = Watir::IE.new
                        test_site='http://www.marketocracy.com'
                        $ie.goto(test_site)
                        @@homepageTime = Time.now - @@beginTime
                end
        end
    
#       def test_100_homepage
#               teststring = "research"
#               begin
#                       assert($ie.contains_text("#{teststring}"))
#                               puts("PASSED. Found test string: #{teststring}")
#               rescue => e
#                               puts("FAILED. Could not find test string: 
#{teststring}.  " + e.message + "\n" + e.backtrace.join("\n"))
#               end
#       end
#       
        def login(username, password)
                
                @@homepageTime = Time.now - @@beginTime
                        
                        
                error_count = 0
                error_message = ""
        # debugger
                $ie.text_field(:name, "username").set("#{username}")
                $ie.text_field(:name, "password").set("#{@@tb_adminPassword}")
                $ie.button(:name, "Submit").click
                
                refresh_count = 0
                while $ie.contains_text("PLEASE CLICK HERE TO REFRESH") && 
refresh_count < 20
                        sleep 3
                        $ie.link(:text, /PLEASE CLICK HERE TO REFRESH/ ).click
                        refresh_count += 1
                end
                
                @@overviewTime = Time.now - @@beginTime
                
        
                if refresh_count >= 20
                        error_count += 1
                        puts error_message +=  "#{error_count}. More than 20 
refreshes.  "
                end
                
                if !$ie.contains_text("Funds Managed by")
                        error_count +=1
                        error_count +=1
                        puts error_message += "#{error_count}. Not on overview 
page.  "
                end
                
                if @@overviewTime > 60 
                        error_count +=1
                        puts error_message += "#{error_count}. Login time > max 
allowed login time.  "
                end
                puts "@@homepageTime: #{@@homepageTime}"
                puts "@@overviewTime: #{@@overviewTime}"


                @@timeSpreadsheet.puts "#{@@executionEnvironment}, 
#{@@homepageTime}, #{@@overviewTime}, #{refresh_count}, #{error_message}" 
                return error_count, error_message

        end

#     def test_menu
# 
#         ie = Watir::IE.start('http://www.marketocracy.com')
#         ie.text_field(:name, "username").set("trasch")
#         ie.text_field(:name, "password").set("m")
#         ie.button(:name, "Submit").click
# 
#         # get my funds loaded asap
#         refresh_link = ie.link(:text, /PLEASE CLICK HERE TO REFRESH/)
#         refresh_link.click if refresh_link.exists?
# 
#         ie.image(:name, "Menu4i").fire_event("onmouseover")
#         ie.nav_menu("Cash", "Benchmarks", "Alpha Contour")
# 
#         ie.image(:name, "Menu1i").fire_event("onmouseover")
#         ie.nav_menu("About Us", "Overview")
# 
#     end

                
        
#       def test_200_singlelogin
#               
#               login = "trasch"
#               
#               error_count, error_message = login("#{login}", 
"#{@@tb_adminPassword}")
# 
#               if error_count > 0 
#                       flunk
#               end
#     end

#     def test_250_makeatrade
# 
#         login = "trasch"
# 
#               error_count, error_message = login("#{login}", 
"#{@@tb_adminPassword}")
#        
#         # debugger 
#         $ie.image(:name, "Menu4i").fire_event("onmouseover")
#         $ie.nav_menu("Make a Trade")
#         $ie.text_field(:index, 2).set("MSFT")
#         $ie.button(:value, "Quote").click
#         $ie.text_field(:index, 4).set("1")
#         $ie.button(:value, "Buy").click
#         if not ($ie.contains_text(/MSFT/) and  $ie.contains_text(/Last 
Filled/))
#             error_count +=1 
#             error_message += "\nPage did not contain expected text"
#         end
# 
# 
#         if error_count > 0
#             puts error_message
#             flunk
#         end
#     end


    def test_300_buywizard

        login = "trasch"

                error_count, error_message = login("#{login}", 
"#{@@tb_adminPassword}")
       
#         debugger 
        $ie.image(:name, "Menu4i").fire_event("onmouseover")
        $ie.nav_menu("T2", "Buy Wizard")
        $ie.text_field(:index, 2).set("MSFT")
        $ie.text_field(:index, 3).set("1")
        $ie.button(:value, "Buy").click
        $ie.image(:name, "Menu4i").fire_event("onmouseover")
        $ie.nav_menu("Make a Trade")
        if not ($ie.contains_text(/MSFT/) and  $ie.contains_text(/Last Filled/))
            error_count +=1 
            error_message += "\nPage did not contain expected text"
        end


        if error_count > 0
            puts error_message
            flunk
        end
    end

#     def test_250_sell_wizard
# 
#         login = "trasch"
# 
#               error_count, error_message = login("#{login}", 
"#{@@tb_adminPassword}")
#        
# #         debugger 
#         $ie.image(:name, "Menu4i").fire_event("onmouseover")
#         $ie.nav_menu("T2", "Sell Wizard")
# #         debugger
#         $ie.text_field(:index, 2).set("MSFT")
#         $ie.text_field(:index, 3).set("1")
#         $ie.button(:value, "Buy").click
#         $ie.image(:name, "Menu4i").fire_event("onmouseover")
#         $ie.nav_menu("Make a Trade", "Open Orders")
#         if not ($ie.contains_text(/MSFT/) and  $ie.contains_text(/Last 
Filled/))
#             error_count +=1 
#             error_message += "\nPage did not contain expected text"
#         end
# 
# 
#         if error_count > 0
#             puts error_message
#             flunk
#         end
#     end

        
        # def test_300_averagelogin

        #       File.open("#{@@logins}", "r") do |file|
        #               file.each do |login|
        #                       error_count, error_message = login("#{login}", 
"#{@@tb_adminPassword}")
        #               end
        #       end
        # end
end





_______________________________________________
Wtr-general mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/wtr-general

Reply via email to