Tuesday, May 3, 2011

Screenshots

Watir has some built in functions for taking screenshots, but they are not very good. The best way to take screenshots is by using SnagIt.

Here is an example function for taking screenshots by using SnagIt. This function is also capable of taking screenshots of invisible windows:

def screencapture fname
        snagit = WIN32OLE.new('Snagit.ImageCapture')
        visibilityState=$ie.getIE.Visible
        $ie.getIE.Visible = true
        $ie.bring_to_front
        $ie.maximize 
        snagit.Input = 1 #window
        snagit.Output = 2 #file
        snagit.InputWindowOptions.XPos = 350  
        # select XPosition for window ID
        snagit.InputWindowOptions.YPos = 350  
        # select YPosition for window ID
        snagit.InputWindowOptions.SelectionMethod = 3  
        # capture window under the X, Y point specified above.
        snagit.AutoScrollOptions.StartingPosition = 3  
        # set scroll to top and left
        snagit.OutputImageFile.FileType = 5 #:png
        snagit.OutputImageFile.FileNamingMethod = 1 # fixed
        tempStoragePath="c:\\screenshot\\"
        if (! File::exists?( tempStoragePath )) 
            tempStoragePath=Dir.pwd+"//screenshot//"
            if (! File::exists?( tempStoragePath )) 
                Dir.mkdir tempStoragePath
            end     
        end
        snagit.OutputImageFile.Directory = tempStoragePath
        snagit.OutputImageFile.Filename = fname
        snagit.AutoScrollOptions.AutoScrollMethod = 0
        snagit.Capture
        # wait for capture to complete
        until snagit.IsCaptureDone do
            sleep 0.5
        end
        $ie.getIE.Visible = visibilityState
end

If you don't have SnagIt installed, then another easy way to take screenshots is by using PHP.
For example, create following PHP file:

<?php

if(!isset($argv[1]))
{
    echo "Image not specified!";
    exit;
}
else
    $image = $argv[1];

$imagefile = "c://".$image.".png";
$im = imagegrabscreen();
imagepng($im, $imagefile);
imagedestroy($im);

?>

... and then, for example, following Ruby function:

def screencapture fname
    cmd = 'PHP.exe C:\\screenshot.php ' + fname
    puts %x{#{cmd}}
    sleep 8
end

No comments:

Post a Comment