WWW::Mechanize::Chrome::Cookbook - Getting things done with WWW::Mechanize::Chrome

Chrome versions

You can find various current Chrome builds at .

The recommended approach to automation is to save a Chrome / Chromium version and disable automatic updates so you can update at a defined point in time instead and keep the change to your automation under control.

Web Application Testing with Chrome


If you have an application with complex Javascript, you may want to do end to end tests using WWW::Mechanize::Chrome. You can run your server application and your test program in the same process if your server application can be run under PSGI, as most web frameworks do.

Having all data within one process makes it very easy to fudge configuration values or database entries at just the right time.

Initializing the web server in your test script

You will need to use a PSGI web server written in Perl that supports event loops also supported by WWW::Mechanize::Chrome. Twiggy is one such server. The setup for Twiggy is as follows:

  use Twiggy::Server;
  use File::Temp 'tempdir';

  my $port = 5099;
  my $server = Twiggy::Server->new(
      host => '',
      port => $port,

  # Dancer specific parts
  $ENV{DANCER_APPHANDLER} = 'Dancer::Handler::PSGI';
  my $handler = Dancer::Handler->get_handler();
  my $app = $handler->psgi_app();

  # Rest of Twiggy setup

  # Fudge the config as appropriate for our test
  Dancer::config()->{mykeep}->{notes_dir} = tempdir(
      CLEANUP => 1,

  my $mech = WWW::Mechanize::Chrome->new(
  my $res = $mech->get("$port");
  ok $res->is_success, "We can request the page";

Debugging Headless Sessions

If you want to watch what a headless browser automation run is doing, you can do so by sending a screencast from WWW::Mechanize::Chrome to a different browser that supports websockets by using Mojolicious::Plugin::PNGCast from within your automation session:

    use Mojolicious::Lite;
    use Mojo::Server::Daemon;
    use WWW::Mechanize::Chrome;
    plugin 'PNGCast';

    my $daemon_url = 'http://localhost:3000';

    my $ws_monitor = Mojo::Server::Daemon->new(app => app());

    my $mech = WWW::Mechanize::Chrome->new( headless => 1 );
    $mech->setScreenFrameCallback( sub {
        app->send_frame( $_[1]->{data} )}

    print "Watch progress at $daemon_url\n";
    sleep 5;

    # ... more automation

This will send the progress of your headless session to your browser so you can see the differences between what you expect and what the browser displays.


Detecting Chrome Headless

Making Chrome Headless Undetectable

Chrome Headless Detection


The public repository of this module is


The public support forum of this module is


Please report bugs in this module via the RT CPAN bug queue at or via mail to


Max Maischein


Copyright 2010-2019 by Max Maischein


This module is released under the same terms as Perl itself.