autoie05.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:22 2010 from autoie05.pl 2006/06/15 4 KB.

#!/Perl
#
# from : http://www.nntp.perl.org/group/perl.libwin32/61
# In attempting to add popup support to IE automation I've encountered what
# may be a bug in Win32::OLE.  The following code exhibits the problem.
# *********** CRASHES ON POPUPS ************
use strict;
use Data::Dumper;
use Win32::OLE qw( EVENTS );            # we need Win32::OLE with events
use Time::HiRes qw(gettimeofday);       # provide more accurate timings
use IO::Handle;
$|=1;       # do not buffer
my $URL1 = 'http://www.google.com/';
my $URL2 = 'http://www.gozer.org/mozilla/popup_tester/';
my $self = {};
my $donew = 0; # try to turn off offending code, BUT STILL CRASHES!!!
# LOG FILE STUFF
my $write_log = 0;
my $outfile = "temp.$0.txt";
#my $LOG = new FileHandle ">$outfile"; 
my ($LOG); 
if ( open( $LOG, ">$outfile" ) ) {
###if ($LOG) {
    $write_log = 1;
   ###select $LOG;
} else {
    $write_log = 0;
    prt( "WARNING: Unable to open $outfile LOG ...\n" );
}
my $ie = Win32::OLE->new( 'InternetExplorer.Application' ) or 
    mydie( "error: failed to get internet explorer ...\n" );
$ie->{visible} = 1;
Win32::OLE->WithEvents( $ie, \&ie_events, 'DWebBrowserEvents2' );
$self->{ie} = $ie;
prt( "self after initialization\n" . Dumper( $self ) );
$self->{popups} = [];
$self->{ts} = $self->{tle} = gettimeofday;
prt( "navigate to google - $URL1 \n" . Dumper($self) );
$ie->navigate( $URL1 ); # = 'http://www.google.com/'
while(gettimeofday - $self->{ts} < 60){
    Win32::OLE->SpinMessageLoop;   # check for events
    last if( gettimeofday - $self->{tle} > 10 );
}
prt( "done google\n" . Dumper( $self ) );
prt( "\n" );
$self->{popups} = [];
$self->{ts} = $self->{tle} = gettimeofday;
prt( "navigate to popup_tester - $URL2 -\n" . Dumper($self) );
$ie->navigate( $URL2 ); # = 'http://www.gozer.org/mozilla/popup_tester/'
while(gettimeofday - $self->{ts} < 60){
    # check for events
    Win32::OLE->SpinMessageLoop;
    # if no events in 10 seconds, declare navigation done
    last if( gettimeofday - $self->{tle} > 10 );
}
prt( "done popup_tester\n" . Dumper( $self ) );
sub ie_events() {
    my( $ie, $event, @args ) = @_;
    my $tn = gettimeofday();
    $self->{tle} = $tn;
    my $te = sprintf '%6.2f', $tn - $self->{ts};
    ###prt( "$self $ie $te [$event]\n" );
    prt( "$te [$event] $self $ie \n" );
    if ( $donew && ( $event eq 'NewWindow2' )) {
            prt( "self before new window handling\n" );
         prt( Dumper($self) );
            my $popupself = {};
            my $ie2 = Win32::OLE->new( 'InternetExplorer.Application' ) or
                mydie( 'could not start IE on allowed NewWindow2' );
            prt( "self after new IE application\n" );
         prt( Dumper($self) );
            $popupself->{ie} = $ie2;      # remember ie application
            my $xx = $self->{popups};
            # push @{$xx}, $popupself;     # save new IE object
# Curiously the code crashes on the 2nd popup window at
# http://www.gozer.org/mozilla/popup_tester/, not the first.  Somewhat
# surprisingly, commenting out the push that attempts to save $popupself
# allows the code to run to completion.  I'm uncertain why any of this occurs.
# Richard Bell
# rbell01824[at]earthlink.net
            prt( "self after push\n" );
         prt( Dumper($self) );
            #$args[0]->Put( $ie->{application});
            $args[0]->Put( $ie );
            $args[1]->Put( 0 );
    }
}
################################
### output and log file
sub wlog {
   my $ml = shift;
   print $LOG $ml;
   $LOG->flush;
}
sub prt {
   my $m = shift;
   if ($write_log) {
      wlog($m);
   }
   print STDOUT $m;
}
sub mydie {
   my $msg = shift;
   if ($write_log) {
      wlog($msg);
   }
   die $msg;
}
sub close_log {
   if ($write_log) {
      prt( "Closing LOG file, and passing to 'system($outfile)'\nMay need to CLOSE notepad to continue ...\n" );
      close( $LOG );
      system( $outfile );
   }
}
# eof - autoie05.pl

index -|- top

checked by tidy  Valid HTML 4.01 Transitional