package Selenium::PhantomJS; # ABSTRACT: Use GhostDriver without a Selenium server use Moo; use Selenium::CanStartBinary::FindBinary qw/coerce_simple_binary/; extends 'Selenium::Remote::Driver'; =head1 SYNOPSIS my $driver = Selenium::PhantomJS->new; =head1 DESCRIPTION This class allows you to use PhantomJS via Ghostdriver without needing the JRE or a selenium server running. When you refrain from passing the C and C arguments, we will search for the phantomjs executable binary in your $PATH. We'll try to start the binary connect to it, shutting it down at the end of the test. If the binary is not found, we'll fall back to the default L behavior of assuming defaults of 127.0.0.1:4444 after waiting a few seconds. If you specify a remote server address, or a port, we'll assume you know what you're doing and take no additional behavior. If you're curious whether your Selenium::PhantomJS instance is using a separate PhantomJS binary, or through the selenium server, you can check the C attr after instantiation. N.B. If you're on Windows, we're probably going to fail at closing the command window that runs the PhantomJS binary. Feel free to bug us over at L and/or tell us how to fix it if it's a blocking issue for you. Thanks! =cut has '+browser_name' => ( is => 'ro', default => sub { 'phantomjs' } ); =attr binary Optional: specify the path to your binary. If you don't specify anything, we'll try to find it on our own via L. =cut has 'binary' => ( is => 'lazy', coerce => \&coerce_simple_binary, default => sub { 'phantomjs' }, predicate => 1 ); =attr binary_port Optional: specify the port that we should bind to. If you don't specify anything, we'll default to the driver's default port. Since there's no a priori guarantee that this will be an open port, this is _not_ necessarily the port that we end up using - if the port here is already bound, we'll search above it until we find an open one. See L for more details, and L after instantiation to see what the actual port turned out to be. =cut has 'binary_port' => ( is => 'lazy', default => sub { 8910 } ); has '_binary_args' => ( is => 'lazy', builder => sub { my ($self) = @_; return ' --webdriver=127.0.0.1:' . $self->port; } ); with 'Selenium::CanStartBinary'; 1;