|
|
|
Robin, � I have include a text of a perl script I have written as an example of Automating the IE web browser. � Henry Wasserman and myself were looking for a way to Automate the browser for testing since we are in the Quality Assurance group. After a lot of research we found perl was excellent at this.� � I figured this may be of interest to others. Please feel free to post this on your site if you feel that it will be useful. � Enjoy � � � Thank you Rob Marchetti � �
�
�
�
use strict;
use Win32::OLE qw(EVENTS);
#==============================================================================
# Automation Example - by Rob Marchetti/Henry Wasserman
# revised version 1.0b
#
# This is an example of how to perform automation using I.E.
# It launches I.E. goes to dice and ask for a job title to search for
# It does not actually save any jobs, this is purely to used as an example
# I have included some print statements for debugging
#
#==============================================================================
my @Documents;
my $notcomplete = 1;
my $URL = "http://www.dice.com/jobsearch/index.html";� #site you want to search
#
#
�
$Win32::OLE::Warn = 0;
# Launch IE aand Grap an instant of the I.E. browser
my $IEbrowser = Win32::OLE->new('InternetExplorer.Application'); #or die $!;
�
$IEbrowser->{left} = 0;
$IEbrowser->{top} = 0;
$IEbrowser->{height} = 725;
$IEbrowser->{width} = 650;
$IEbrowser->{menubar} = 0;
$IEbrowser->{toolbar} = 0;
$IEbrowser->{statusbar} = 1;
$IEbrowser->{visible} = 1;
$IEbrowser->navigate($URL);���� #site you want to search
#
#my $hnd = $IE->{HWND};
#print "Here's the Window handle: $hnd\n";
## Wait until IE is ready:#
� WaitForBusy();
�
#Lookey here Objects!
my $IEDocument = $IEbrowser->{Document};
# Tell someone where your going to
� print "\nConnecting to dice: " . $IEDocument->URL . "\n";
� my @Docs = ();
�
� push @Docs, $IEbrowser;
# Ask for a Job title to search on
� print "\nEnter� a Job Title to Search: ";
�
# Grab the job title from what the user types in ( no error checking yet)
� my $sname = ;
�
# Enter the Job Title into the text box on Dice
� SetEditBox(\@Docs, "query", "$sname");
�
#Click the submit button
� ClickFormButton(\@Docs,"Search");
�
�
# the the user what you are searching for!
� print "Searching Dice for $sname jobs......\n";
�
�
�
�
�
#Quit IE an Open Jobs.txt
� print "Search complete!";
�
# Wait for IE to load and get the documents
sub WaitForBusy
� while ($IEbrowser->{Busy} == 1) {
��� #print "Here's Busy: " . $IE->{Busy} . "\n";
��� sleep(0.4);
� }
� #print "Leaving WaitForBusy\n";
}
�
# Wait for a DocumentComplete
sub WaitForDocumentComplete { #$Document
�my $i;
�eval {
��print "Cleaning out \@Documents\n";
��� @Documents = ();
��#print "Shifting in new DOM\n";
�� my $IEDocument = shift @_;
��� while ($notcomplete) {
��� if (defined $IEDocument->all->length)
������� for (my $i=0; $i<$IEDocument->all->length; $i++)
�����print $IEDocument->all($i)->tagName . "\n";
������� if (defined $IEDocument->all($i))
��������� $IEDocument->all($i)->tagName;
�����
���� }
����
��}
� };
�if ($@) {
�� if ($@ =~ /undefined/) {
���print "Exception: $@ \n";
���#print "Calling WaitForDocumentComplete\n";
���� WaitForDocumentComplete($IEDocument);
��} else
���� #print "Exception: $@\n";
��}
�}
�$notcomplete = 1;
�#print "Here are the URLs:\n";
�my $counter = 0;
�for (@Documents) {
��$counter++;
��#print "Url " . $counter . ":" . $_->Document->URL . "\n";
�}
�return @Documents;
}
�
�
�
sub Event {
�my ($Obj,$Event,@Args) = @_;
�my $IEURL;
�#print "Event triggered: '$Event'\n";
�#if ($Event =~ /^StatusTextChange$/) {
��#my $Status = shift @Args;
��#print "$Status\n";
�#}
�if ($Event =~ /^DocumentComplete$/) {
�� $IEURL = $IEbrowser->Document->URL;
�
��my $ArgsURL =� @Args[0]->Document->URL;
��#print "$IEURL\n";
��#print "$ArgsURL\n";
��if ($IEbrowser->ReadyState() == 4) {
���#print "Browser is ready\n";
���#print "Setting \$notcomplete to 0\n";
���$notcomplete = 0;
��}
��#print "pushing arg " . @Args[0]->Document->URL . "\n";
��push�@Documents, shift @Args;
�}
}
�
# Find the text box on the page and enter your search text
sub SetEditBox { #\@Docs, $name, $value
�my $Documents = shift @_;
�my $name = shift @_;
�my $value = shift @_;
��my $Document;
�my $i;
�my $j;
�my $k;
�foreach $Document (@$Documents) {
��� $IEDocument = $Document->{Document};
��� #print "Here's the URL inside SetEditBox: " . $Document->Document->URL . "\n";
��� for ($i=0; $i<$IEDocument->all->length; $i++) {
��� #print "Outer for $i " . $IEDocument->all($i)->tagName . "\n";
���� if ($IEDocument->all($i)->tagName =~ /^FORM$/) {
������ my $form = $IEDocument->all($i);
�� ����� for ($j=0; $j < $form->all->length; $j++)
����������� if ($form->all($j)->getAttribute("name") =~ /^$name$/)
������������� $form->all($j)->{value} = $value;
������������� $form->all($j)->style->{backgroundColor}� = "yellow";��� # Highlight the edit box color to yellow
������������ sleep 3;
������������ return;
�
������
������ }
����
��� }
� }
}
�
�
�
# Click the Search button
sub ClickFormButton { #\@Docs, $ButtonName
�my $Documents = shift @_;
�my $ButtonName = shift @_;
�my $Document;
�my $IEDocument;
�my $i;
�my $j;
�my $k;
�foreach $Document (@$Documents) {
�� $IEDocument = $Document->{Document};
��� for ($i=0; $i<$IEDocument->all->length; $i++) {
����� if ($IEDocument->all($i)->tagName =~ /^FORM$/)
����� my $form = $IEDocument->all($i);
����� for ($j=0; $j < $form->all->length; $j++) {
����� �my $name = $form->all($j)->getAttribute("value") . "\n";
�
����������� if ($form->all($j)->getAttribute("value") =~ /^$ButtonName$/)
������� $form->all($j)->click();
��������������� $form->all($j)->style->{backgroundColor}� = "yellow";
��������������� sleep 5;
����������� return;
�
������
������ }
����
��� }
� }
}
�
�$IEbrowser->Quit();
��