Marco wrote: > Hi > > has anyone had to come up with a way of launching an instance of ie from > within a script but run as another user context? > > I tried using cpau and I can launch a browser using a ruby script. I then run > that script using > > cpau -u <user> -p <password> -ex "cmd /K \"launchbrowser.rb <params>"" -enc > -file launchbrowser.job > > cpau -dec -file launchbrowser.job > > whilst this works fine to run the script standalone when I try to run this > script from within a testcase using > > puts("Foo1") > exec "cpau -dec -file launchbrowser.job" > puts("Foo2") > > the browser launches but the testcase dosen't run through to completition > drops out to cmd prompt as soon as the exec finishes. > > the plan was then to use ie.attach to attach to this browser window > > I'm hoping someone else has an easier / better idea to do this sort of thing? > The code below should be a step in the right direction. I have been using this and expect contribute it to the main watir code base at some point.
Bret # based on http://svn.instiki.org/instiki/trunk/test/watir/e2e.rb # and http://rubyforge.org/pipermail/wtr-general/2005-November/004108.html require 'watir' class IEProcess def self.start startup_info = [68].pack('lx64') process_info = [0, 0, 0, 0].pack('llll') # TODO: make this portable startup_command = 'C:\Program Files\Internet Explorer\IEXPLORE.EXE' result = Win32API.new('kernel32.dll', 'CreateProcess', 'pplllllppp', 'l'). call( nil, startup_command, 0, 0, 1, 0, 0, '.', startup_info, process_info) # TODO print the error code, or better yet a text message raise "Failed to start IEXPLORE." if result == 0 process_id = process_info.unpack('llll')[2] puts "Process ID: #{process_id}" self.new process_id end def initialize process_id @process_id = process_id end attr_reader :process_id def stop right_to_terminate_process = 1 handle = Win32API.new('kernel32.dll', 'OpenProcess', 'lil', 'l'). call(right_to_terminate_process, 0, @process_id) Win32API.new('kernel32.dll', 'TerminateProcess', 'll', 'l').call(handle, 0) end def window shell = WIN32OLE.new 'Shell.Application' while true do shell.windows.each do |window| process_id = Watir.process_id_from_hwnd window.hwnd # puts "Window Name: #{window.name}, Process ID: #{process_id}" return window if process_id == @process_id end end end end module Watir def self.process_id_from_hwnd hwnd pid_info = ' ' * 32 Win32API.new("user32", "GetWindowThreadProcessId", 'ip', 'i'). call(hwnd, pid_info) process_id = pid_info.unpack("L")[0] end def IE.new_process iep = IEProcess.start ie = IE.bind iep.window ie.process_id = iep.process_id ie end class IE def process_id @process_id ||= Watir.process_id_from_hwnd @ie.hwnd end attr_writer :process_id def kill iep = IEProcess.new process_id iep.stop end end end _______________________________________________ Wtr-general mailing list Wtr-general@rubyforge.org http://rubyforge.org/mailman/listinfo/wtr-general