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
[email protected]
http://rubyforge.org/mailman/listinfo/wtr-general