Jump to content

Functions for Navigating in Firefox


fsquirrelgpr
 Share

Recommended Posts

I saw the posting with some code for navigating in Internet Explorer so thought I would post the functions I have been using for navigating in Firefox (entering information, navigating tables, activating windows, etc). These were cleaned up as not to be specific to the web-pages I use them with, but I might have missed a couple of references or broken a couple of functions by renaming variables and eliminating window names/usernames/passwords.

I am sure there are better ways of doing many of these tasks but thought this might be useful for some, also remember I was (and still am) learning the language as I wrote these functions:

#include-once

;This is an include file
;
; AutoIt Version: 3.0
; Language:    English
; Platform:    Win9x/NT (Mozilla Firefox) (Windows Server 2003)
; Author:        Gregory Roby
; It assumes that Mozilla Firefox will be used (or Deer Park Alpha 2)
; Created originally 4/20/2005 by Gregory Roby, last modified 8/8/2005

;Put the following line in any program that needs access to this file (assuming it has not moved)

#include <file.au3>

Global $standard_delay = 40
Global $short_delay = 1000
Global $medium_delay = 6000
Global $long_delay = 9000
global $win_activate_timeout = 75000; 75 seconds to activate a window
global $current_position[2]
global $run_function_on_exit_program = "none"

;$purple_button is the color of Buttons (dark purple)  It varies a bit on different computers, use spread to find it
global $purple_button = 132
global $purple_button_spread = 25
;$firefox_green is the color of highlighted text when searched for using firefox
global $firefox_green = 3725432
global $firefox_green_spread = 25

; $blue_link is the blue color when a link is highlighted 
global $blue_link = 255
global $blue_link_spread = 15

; $Deer_Park_Green is the green color of a the active link in Deer Park Alpha 2 (at least on my computer, not even sure what setting I changed to get it)
global $deer_park_green = 1144610
global $deer_park_green_spread = 5

;These are the names of  Windows
Global $win_mozilla = "Mozilla Firefox"
Global $win_security = "Security Error"
global $win_report = "IIPdfReport"
global $win_print = "print"
global $win_command = "c:\windows\system32\command.com"
global $win_deer = "deer"

Global $progress_file_path = "p:\networ~1\progress\"
global $progress_file_name = "default.txt"

global $mozilla_directory = "c:\program files\mozilla firefox\"
;$pixels_to_check is the number of pixels to scan on a line after moving right to reposition the mouse cursor to the
;same position, $pixel_row is the array that stores the color values of the pixels
global $pixels_to_check = 225
global $pixel_row[1000]

;Color of Button When Mouse Overed (with our billing system)
global $blue_button_mouseover = 3355545
global $blue_button_mouseover_spread = 25

;these variables is set by calling max_coords()
global $max_x
global $max_y

;is the color of the dividing lines for the tables in Exception Manager
global $grey_table = 9276813
global $grey_table_spread = 25

; assumes the window needing the info entered is active, 
;It attempts to search for the pixel color of the search string highlighed using Mozilla
;and enters the_info in the very next field
func enter_info($the_info, $the_search_string, $optional_delay = 40)
    opt("sendkeydelay", $optional_delay)
    local $the_position[2]
    send("^f")
    send($the_search_string)
    $the_position = pixelsearch(0, 25,1280,1024,$firefox_green, $firefox_green_spread,3)
    mousemove($the_position[0], $the_position[1])
    sleep($short_delay / 4)
    mouseclick("left")
    sleep($short_delay / 4)
    send("{tab}")
    opt("sendkeydelay", $optional_delay / 2)
    send ($the_info)
    opt("sendkeydelay", $standard_delay)
EndFunc

func open_command()
    run("c:\windows\system32\command.com", "")
    my_activate_window($win_command, "Could not open a command prompt.")
EndFunc

func run_command($the_command)  
    Opt("SendKeyDelay", 10) 
    send($the_command, 1)
    send("{enter}") 
    sleep($short_delay / 4)
    Opt("SendKeyDelay", $standard_delay) 
EndFunc

func close_command()
    send("exit{enter}")
    wait_for_window_to_close($win_command)  
EndFunc

;***************************************************************************************************

*********************
;***********The following functions deal with navigating through tables (including scrolling right)***********
;***************************************************************************************************

*********************

    func next_box_right($boxes_right = 1)
    local $boxes_moved = 0  

    for $boxes_moved = 1 to $boxes_right
        local $reference_x = 0
        local $had_to_move_right = 0
        Do
        ;Always want to have a box to the right of the current box
        ;so First, go right until a line is found (will always happen unless there is something unaccounted for wrong)
            $current_position[0] = $current_position[0] + 1
            mousemove($current_position[0], $current_position[1], 0)
            if($current_position[0] = $max_x) Then
                exit_program("When searching for the next_box_right, could not find the right hand side of the current box.")
            EndIf
        until(pixelgetcolor($current_position[0], $current_position[1]) = $grey_table)
        
        $reference_x = $current_position[0]
    ;Now you are at the next box to the right, but not sure if the right side of that box is on the screen yet, so 
    ;do these steps to make sure:
        local $loop_problem = 0
        $current_position[0] = $current_position[0] + 2
        while(another_box_to_the_right($current_position[0], $current_position[1]) = 0) 
        ;being here in the loop statement means there is not a right edge to the current box on the screen
            ;move mouse pointer left to the last grey line
                Do
                    $current_position[0] = $current_position[0] - 1
                until(pixelgetcolor($current_position[0], $current_position[1]) = $grey_table)
            
            ;now get some pixels to the left of this line so we can find where we were
                get_pixels_to_left($current_position[0], $current_position[1], $pixels_to_check)    
            ;get_pixels_to_left are stored in the global array $pixel_row
            ;now actually move over to the right (hit right arrow key a few times)
                move_right()
                $loop_problem = $loop_problem + 1
                if($loop_problem = 50) Then
                    exit_program("Got stuck in the loop trying to find another box to the right (could not find one after 50 moves to the right).")
                EndIf
                sleep($short_delay)
            ;now set the x coordinate to be where it was before we cold not find another_box_to_the_right
                $current_position[0] = find_end_of_pixels($pixels_to_check)
            WEnd
    ;then move off the dividing line
        $current_position[0] = $current_position[0] + 3
    Next
EndFunc


func find_end_of_pixels($number_of_pixels)
    local $temp_x = 0
    local $current_x = 0
    local $found_match = 1
    Do
        $found_match = 1
        for $temp_x = $current_x to $current_x + $pixels_to_check
            if not (pixelgetcolor($temp_x, $current_position[1]) = $pixel_row[$temp_x - $current_x]) Then
                $temp_x = $current_x + $pixels_to_check
                $found_match = 0
            EndIf
            $temp_x = $temp_x + 1
        Next
        $current_x = $current_x + 1
        if($current_x = $max_x) Then
            exit_program("Could not find the pixel row after scrolling to the right")
        EndIf
    until $found_match = 1
    $current_x = $temp_x + 4
    return $current_x
EndFunc

func another_box_to_the_right($x_start, $y_position)
    Do
        $x_start = $x_start + 1
        if($x_start = $max_x) Then
            return 0
        EndIf
    until(pixelgetcolor($x_start, $y_position) = $grey_table)
    return 1    
EndFunc

func get_pixels_to_left($x_start, $y_position, $number_of_pixels)
    local $i
    local $temp_x = $x_start
    $temp_x = $x_start - $number_of_pixels
    
    for $i = 0 to $number_of_pixels - 1
        $pixel_row[$i] = pixelgetcolor($temp_x, $y_position)
        $temp_x = $temp_x + 1
    Next    
EndFunc

func move_right()
    send("{right}")
    sleep($short_delay)
EndFunc

;This function copies the contents of the current box.  It also moves the mouse position to the beginning of the next box.
;Contents will be on the clipboard
func copy_current_box()
    next_box_right()
    local $copy_temp_x = $current_position[0]
    Do  
        $copy_temp_x = $copy_temp_x - 1
    until(pixelgetcolor($copy_temp_x, $current_position[1]) = $grey_table)
    $copy_temp_x = $copy_temp_x - 3
    mousemove($copy_temp_x, $current_position[1], 0)
    sleep($short_delay / 2)
    mousedown("left")
    Do
        $copy_temp_x = $copy_temp_x - 1
    Until(pixelgetcolor($copy_temp_x, $current_position[1]) = $grey_table)
    $copy_temp_x = $copy_temp_x - 3
    mousemove($copy_temp_x, $current_position[1], 0)
    sleep($short_delay / 2)
    mouseup("left")
    sleep($short_delay / 2)
    send("^c")
    sleep($short_delay / 2)
    mousemove($current_position[0], $current_position[1], 0)
EndFunc

;***************************************************************************************************

*********************
;***********The preceding functions deal with navigating through tables (including scrolling right)***********
;***************************************************************************************************

*********************

;This function waits until the hourglass goes away
func wait_until_done($max_wait = 120000)
    local $counter = 0
    while(mousegetcursor() = 1)
        $counter = $counter + $short_delay
        sleep($short_delay)     
        if($counter > $max_wait) Then
            exit_program("Stuck in wait until done loop, exited after " & string($counter) & "ms, mousegetcursor is: " & string(mousegetcursor()))
        EndIf
    WEnd
    sleep($short_delay / 4)
endfunc

;This function will close all opened mozilla windows (used by this include file)
func cleanup()
    winclose($win_command)
    winclose($win_deer)
EndFunc

; This function attempts to activate a window.  It will exit the script if the window cannot be activated.
; It keeps trying until $win_activate_timeout is reached
func my_activate_window($win_name, $fail_reason, $maximize = "yes")
    local $seconds = 0
;try to activate the window for up to $win_activate_timeout then fail
    Do
        winactivate($win_name)
        
        if(winactive($win_name)) then
                $seconds = $win_activate_timeout
                if($maximize = "yes") Then
                    winsetstate($win_name, "", @SW_MAXIMIZE)
                EndIf
        EndIf
        sleep($short_delay / 2)
        $seconds = $seconds + ($short_delay / 2)
    until $seconds > $win_activate_timeout
    if(not winactive($win_name)) then
            exit_program($fail_reason)
    EndIf
    wait_until_done()   
EndFunc

func max_coords()
    local $temp_pos[2]
    local $max_pos[2]
    $temp_pos = mousegetpos()
    mousemove(5000, 5000, 0)
    $max_pos = mousegetpos()
    mousemove($temp_pos[0], $temp_pos[1], 0)
    $max_x = $max_pos[0]
    $max_y = $max_pos[1]
EndFunc

func wait_for_window_to_close($window_name)
    winactivate($window_name)
    Do
        sleep($short_delay)
    until(not winactive($window_name))
EndFunc

func reset_current_position()
    $current_position[0] = 0
    $current_position[1] = 0
endfunc

;Exit program uses a string variable
;It gives a slightly more user friendly exit then otherwise might occur.
;The goal is to exit if it is detected that a script is not working rather then have it do random stuff on the
;screen for extended periods of time
;It also checks the global variable $run_function_on_exit_program, if it is set it will call the selected function instead of exiting
;This is used for a script to continue working even when an error is encountered (set to none by default)
func exit_program($exit_reason) 
    if($run_function_on_exit_program = "none") Then
        cleanup()
        if(not ($exit_reason = "exit")) Then
            $exit_reason = "The problem was related to: " & $exit_reason
            msgbox(1,"Script Aborted", $exit_reason)
            exit 0
        EndIf
    EndIf
    call($run_function_on_exit_program)
    exit 0
EndFunc

;between_commas will return the the information between which_comma and which_comma + 1
;for example, if which_comma = 0, it will return everything before the first comma
;it needs a string and which comma (integer) as arguments
func between_commas($the_string, $which_comma)
    Local $current_comma = 0
    Local $left_bound = 0
    Local $temp_string
    local $right_bound = stringlen($the_string)
    local $character_position
    local $separator = ","
    local $quote_character = '"'
    local $in_quotes = 0
;This section finds the left bounds that we actually want
    $character_position = 0
    while($current_comma < $which_comma)
        if(stringmid($the_string, $character_position, 1) = $quote_character) then
            if($in_quotes = 0) Then
                $in_quotes = 1
            Else
                $in_quotes = 0
            EndIf
        EndIf
            
        if($in_quotes = 0) Then
            if(stringmid($the_string,$character_position,1) = $separator) then
                $current_comma = $current_comma + 1
            EndIf
        EndIf
            
        $character_position = $character_position + 1
        if($character_position > $right_bound) Then
            exit_program("function betwen_commas is trying to find comma: " & $which_comma & " but only found: " & $current_comma & " commas.  Exceeded length of array which was " & $right_bound & "The string is " & $the_string)
        EndIf
    WEnd
    $temp_string = ""
    $in_quotes = 0
    while($character_position < $right_bound + 1)
        if(stringmid($the_string, $character_position, 1) = $quote_character) Then
            $character_position = $character_position + 1
            if($in_quotes = 0) Then
                $in_quotes = 1
            Else
                $in_quotes = 0
            EndIf
        EndIf
        if($in_quotes = 0) Then
            if(stringmid($the_string, $character_position, 1) = $separator) Then
                $character_position = $right_bound + 1
            Else
                $temp_string = $temp_string & stringmid($the_string, $character_position, 1)
                $character_position = $character_position + 1
            EndIf
        Else
            $temp_string = $temp_string & stringmid($the_string, $character_position, 1)
            $character_position = $character_position + 1
        EndIf
    WEnd
    return $temp_string
EndFunc

;This function will convert any "year" numbers for 1990-2090 to a 2 digit year by stripping off the left two characters
;it uses a brute force approach
func convert_date($the_date)
    local $date_conversion_counter
    local $temp_date = $the_date
    for $date_conversion_counter = 1990 to 2090
        $temp_date = stringreplace(stringstripws(" " & $temp_date,8), stringstripws(" " & $date_conversion_counter, 8), stringright($date_conversion_counter, 2))
    Next
    return $temp_date
EndFunc
    
;This function makes sure that the specified folder exists, if not, it creates it
;only looks one folder deep so check each level
func make_sure_exists($specified_folder)
    if(not fileexists($specified_folder)) Then
        open_command()
        run_command('md "' & $specified_folder & '"')
        close_command()
    EndIf
EndFunc

;click on Found assumes the window needing the info entered is active, 
;It attempts to search for the pixed color of the search string highlighed using Mozilla
;and clicks on whatever is highlighted
;flag is what flag (if any) to use for sending the search string
func click_on_found($the_search_string, $x_offset = 0, $y_offset = 0, $flag = 0)
    opt("sendkeydelay", $standard_delay)
    local $the_position[2]
    send("^f")
    send($the_search_string, $flag)
    $the_position = pixelsearch(0, 25,1280,1024,$firefox_green, $firefox_green_spread,3)
    mousemove($the_position[0] + $x_offset, $the_position[1] + $y_offset)
    sleep($short_delay / 2)
    mouseclick("left")
    wait_until_done()
    sleep($short_delay / 2)
EndFunc

;This function replaces the special "send" characters in a string with those characters in brackets
;and returns the result
func string_simple($input_string)
    local $the_string = $input_string
    $the_string = stringreplace($the_string, "{", "{{}")
    $the_string = stringreplace($the_string, "}", "{}}")
    $the_string = stringreplace($the_string, "+", "{+}")
    $the_string = stringreplace($the_string, "^", "{^}")
    $the_string = stringreplace($the_String, "!", "{!}")
    $the_string = stringreplace($the_string, "#", "{#}")
    return $the_string
EndFunc

;This function sets alternate window names for Deer Park (Mozilla Alpha)
func alternate_deer_windows()
    Opt("SendKeyDelay", $standard_delay)         ;5 milliseconds
    Opt("WinTitleMatchMode", 2) ;1=start, 2=subStr, 3=exact, 4=...
    $win_mozilla = "Deer Park"
    $mozilla_directory = "c:\program files\Deer Park Alpha 2\"
EndFunc

;This function does only some of the cleanup tasks so that windows which can be reused are reused to speed things up a bit
func partial_cleanup()
    winclose($win_command)
EndFunc

;This function adds a tick to the progress file (number 1) so its size can be checked to make sure progress is continuing without
;have to make complicated functions to see what a script is actually doing
func add_tick_to_progress_file()
    $progress_file = fileopen($progress_file_path & $progress_file_name, 1)
    filewrite($progress_file, "1")
    fileclose($progress_file)
EndFunc

func get_progress_file_size()
    return(filegetsize($progress_file_path & $progress_file_name))
EndFunc

;This function removes the first entry from a file and puts it into the 2nd file
func remove_first_entry($file_one_name, $file_two_name)
    local $single_line = ""
    local $counter
    local $error_file_as_array[25000]
    
    local $the_original_file
    _filereadtoarray($file_one_name, $error_file_as_array)
;This section writes everything back to the error file except for the 1st line
    sleep($short_delay / 2)
    $the_original_file = fileopen($file_one_name, 2)
    for $counter = 2 to $error_file_as_array[0]
        if(stringlen($error_file_as_array[$counter]) > 5) Then
            $error_file_as_array[$counter] = stringstripcr($error_file_as_array[$counter])
            $error_file_as_array[$counter] = stringreplace($error_file_as_array[$counter], @LF, "")
            FileWriteline($the_original_file, $error_file_as_array[$counter])
        EndIf
    Next
    fileclose($the_original_file)
    
;This section appends the log file with the first line from the other file (gets name from global variable $current_error_file)
    local $log_file
    $log_file = fileopen($file_two_name, 1)
    if(stringlen($error_file_as_array[1]) > 5) then
        $error_file_as_array[1] = stringstripcr($error_file_as_array[1])
        $error_file_as_array[1] = stringreplace($error_file_as_array[1], @LF, "")
        FileWriteline($log_file, $error_file_as_array[1])
    EndIf
    fileclose($log_file)
EndFunc

;This function finds the left and right side of the $text_to_find
;and sets $left and $right = to them ($right is optional)
func location_of_text_horizontal($text_to_find, $left, $right = 0)
    send("^f")
    send($text_to_find)
    local $temp_position[2]
    $temp_position = pixelsearch(0, 25,1600,1200,$firefox_green, $firefox_green_spread,3)
    $left = $temp_position[0]
    $right = $left + 250
    Do
        $right[0] = $right[0] - 1
    Until (pixelgetcolor($right, $temp_position[1]) = pixelgetcolor($left, $temp_position[1]))
EndFunc

;This function finds the top and bottom of selected text and sets top and bottom to that location
func location_of_text_vertical($text_to_find, $top, $bottom = 0)
    send("^f")
    send($text_to_find)
    local $temp_position[2]
    $temp_position = pixelsearch(0, 25,1600,1200,$firefox_green, $firefox_green_spread,3)
    $top = $temp_position[1]
    $bottom = $top + 250
    Do
        $bottom = $bottom - 1
    Until (pixelgetcolor($temp_position[0], $bottom) = pixelgetcolor($temp_position[0], $top))
EndFunc

;This function removes both @LF's and @CR's from a string, returning the result
func no_lf_or_cr($the_string)
    local $new_string
    $new_string = stringstripcr($the_string)
    $new_string = stringreplace($new_string, @LF, "")
    return $new_string
EndFunc
Link to comment
Share on other sites

  • 2 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...