<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Brian Medley</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/brian_medley/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/brian_medley/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/brian_medley//1660</id>
    <updated>2013-02-22T04:15:29Z</updated>
    <subtitle>A blog about the Perl programming language</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.38</generator>

<entry>
    <title>Headless Selenium testing with PhantomJS</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/brian_medley/2013/02/headless-selenium-testing-with-phantomjs.html" />
    <id>tag:blogs.perl.org,2013:/users/brian_medley//1660.4363</id>

    <published>2013-02-22T04:05:33Z</published>
    <updated>2013-02-22T04:15:29Z</updated>

    <summary>As you know, Selenium is a marvelous library for automating a browser. It can be combined with Test::More and PhantomJS to provide a headless test suite. An example script looks like: #!/opt/perl use Selenium::Remote::Driver; use Selenium::Remote::WDKeys; use Test::More; use MIME::Base64;...</summary>
    <author>
        <name>Brian Medley</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/brian_medley/">
        <![CDATA[<p>As you know, Selenium is a marvelous library for automating a browser.  It can be combined with Test::More and PhantomJS to provide a headless test suite.</p>

<p>An example script looks like:</p>

<pre><code>
#!/opt/perl

use Selenium::Remote::Driver;
use Selenium::Remote::WDKeys;

use Test::More;
use MIME::Base64;

my $driver = Selenium::Remote::Driver->new();

$driver->set_implicit_wait_timeout(3000);

$driver->get('http://www.google.com');
like($driver->get_title(), qr/^Google$/, "Arrived at Google homepage");

my $elem = $driver->find_element("input[name=q]", "css");
$elem->send_keys("Mojolicious");

open(my $fh,'>','mojoText.png');
binmode($fh);
my $png_base64 = $driver->screenshot();
print($fh MIME::Base64::decode_base64($png_base64));
close($fh);

$elem->send_keys(KEYS->{'enter'});

$elem = $driver->find_element("#resultStats", "css");
like($elem->get_text(), qr/About.*results/, "Got some results");

open($fh,'>','mojoResults.png');
binmode($fh);
my $png_base64 = $driver->screenshot();
print($fh MIME::Base64::decode_base64($png_base64));
close($fh);

$driver->quit();

done_testing();
</code></pre>

<p>This works under the assumption that PhantomJS is running like so:</p>

<pre>
[bpm@s001] c:~>./phantomjs --webdriver=4444
PhantomJS is launching GhostDriver...
Ghost Driver running on port 4444
</pre>

<p>The output looks like:</p>

<pre>
[bpm@s001] c:~/playground>/opt/perl google.pl 
ok 1 - Arrived at Google homepage
ok 2 - Got some results
1..2
[bpm@s001] c:~/playground>
</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Selenium WebDriver with automated Basic Auth credentials</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/brian_medley/2012/11/selenium-webdriver-with-automated-basic-auth-credentials.html" />
    <id>tag:blogs.perl.org,2012:/users/brian_medley//1660.4071</id>

    <published>2012-11-27T03:17:44Z</published>
    <updated>2012-11-27T03:53:42Z</updated>

    <summary><![CDATA[Selenium is a marvelous library for automating browsers. Perl has an interface via Selenium::Remote::Driver. A short script looks like: use Selenium::Remote::Driver; my $driver = new Selenium::Remote::Driver; $driver-&gt;get(‘http://www.google.com’); print $driver-&gt;get_title(); $driver-&gt;quit(); Under the assumption that a selenium server is found, this...]]></summary>
    <author>
        <name>Brian Medley</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/brian_medley/">
        <![CDATA[<p>Selenium is a marvelous library for automating browsers.  Perl has an interface via Selenium::Remote::Driver.  A short script looks like:</p>

<pre><code>
use Selenium::Remote::Driver;

my $driver = new Selenium::Remote::Driver;
$driver-&gt;get(‘http://www.google.com’);
print $driver-&gt;get_title();

$driver-&gt;quit();
</code></pre>

<p>Under the assumption that a selenium server is found, this will launch google and print the title.  It works very well for a lot of scenarios.  One scenario where it has trouble is with Basic Auth and credentials.  The browser usually outputs a popup requiring user-input.</p>

<p>This user-input can be automated via OS specific libraries.  Under Windows and ActiveState the PerlScript (one word) interface can be utilized to realize a credential entry system.</p>

<p>The code below will launch a browser and then input the credentials for http://test.webdav.org/auth-basic.  It has been tested on Windows 7, Firefox, Selenium WebDriver 2.0.25, and ActiveState 5.14.2.</p>

<pre><code>
use Selenium::Remote::Driver;
use Win32::Process;
use Win32;

$WshArgs = $WScript-&gt;{Arguments};
my $password = $WshArgs-&gt;Item(0);

if ($password) {
    $WshShell = $WScript-&gt;CreateObject(“WScript.Shell”);

    while (1) {
        if ($WshShell-&gt;AppActivate(“Authentication Required”)) {
            $WshShell-&gt;SendKeys(“user1”);
            $WshShell-&gt;SendKeys(“{TAB}”);
            $WScript-&gt;Sleep(100);

            $WshShell-&gt;SendKeys(“user1”);
            $WScript-&gt;Sleep(100);

            $WshShell-&gt;SendKeys(“{ENTER}”);

            exit;
        }

        select(undef, undef, undef, 0.3);
    }

    exit;
}

sub ErrorReport{
    $WScript-&gt;Echo(Win32::FormatMessage( Win32::GetLastError() ));
}

my $driver = Selenium::Remote::Driver-&gt;new();

my $ProcessObj;
Win32::Process::Create($ProcessObj,
                “c:\windows\system32\cmd.exe”,
                “start cmd /k cscript keystrokes.pls -password”,
                0,
                NORMAL_PRIORITY_CLASS | DETACHED_PROCESS,
                “.”) || die ErrorReport();

$driver-&gt;get(‘http://test.webdav.org/auth-basic’);

$ProcessObj-&gt;Kill(0);

$WScript-&gt;Echo($driver-&gt;get_title());
$driver-&gt;quit();

</code></pre>
]]>
        

    </content>
</entry>

</feed>
