We've also had a need to start up multiple instances of IE, each in 
their own process.  (This allows us to run multiple scraping sessions to 
the same site and not have the session cookies over-ride each other, as 
long as the cookies don't have an expiration date which writes them to 
the file system.)

Try this function in your app to start up each IE in it's own process:

  # This function starts each window as a unique IE process.
  # This allows the session cookies set for each IE scrape and
  # not overwrite session cookies set in other scraper sessions.
  def start_ie
    tf = Tempfile.new("scraper")
    basename = tf.path.sub(/^.*[\/\\]([^\/\\]*$)/, '\1')  # get base 
filename
    html = sprintf("<html><head><title>%s</title></head></html>", basename)
    tf.puts(html)
    tf.close
    system("start iexplore #{tf.path}")
    ie = nil
    Watir::until_with_timeout(5) do
      begin
        ie = Watir::IE.attach(:url, /#{basename}/)
      rescue Watir::Exception::NoMatchingWindowFoundException
        false
      end
    end
    return ie
  end

This does bring up a problem that we've had, however.

If you try to start each IE as a different user then this method doesn't 
work, and click_no_wait doesn't work either.  Apparently a process 
spawned from that IE running as a different user doesn't have the same 
permissions as a process running under as the logged in user.  The call 
to find a window using Windows "Shell.Application" cannot see *any* IE 
windows if the spawning process is running as a different user.  In 
addition, the logged in user cannot see any IE window created by another 
user.

We haven't come up with a solution for this problem as it appears to be 
a problem in User32.dll used by Shell.Application.

David

Bret Pettichord wrote:
> Lonny Eachus wrote:
>   
>> Wow. Seems like an awful lot of work. Why not just use shell to start 
>> IE as any user you want using the Windows "RunAs" command, then attach 
>> to the window?
>> Two short lines of code.
>>     
> In my case i needed to start up several browsers concurrently and in 
> this scenario, the only way to attach to them reliably and cleanly is to 
> know the process id of each browser. I stole most of the code from Alex 
> Verk, so it wasn't really a lot of coding on my part.
>
> If you know of an easier way ("Two short lines of code") to help Marco, 
> i'm sure he and others would appreciate seeing it.
>
> Bret
>
> _______________________________________________
> Wtr-general mailing list
> Wtr-general@rubyforge.org
> http://rubyforge.org/mailman/listinfo/wtr-general
>   

_______________________________________________
Wtr-general mailing list
Wtr-general@rubyforge.org
http://rubyforge.org/mailman/listinfo/wtr-general

Reply via email to