From ed8452843ab90052e666733309bf35127cf843da Mon Sep 17 00:00:00 2001 From: "George S. Baugh" Date: Tue, 5 Jun 2018 21:04:58 -0500 Subject: [PATCH] Fix #385: Add Selenium::Edge to satisfy the need for direct connections --- at/edge.test | 12 ++++ at/sanity-edge.test | 5 +- lib/Selenium/Edge.pm | 133 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 at/edge.test create mode 100644 lib/Selenium/Edge.pm diff --git a/at/edge.test b/at/edge.test new file mode 100644 index 00000000..11a97cb6 --- /dev/null +++ b/at/edge.test @@ -0,0 +1,12 @@ +use strict; +use warnings; + +use Test::More; +use Selenium::Edge; + +my $driver = Selenium::Edge->new(); +$driver->get('http://www.perlmonks.org'); +like( $driver->get_title(),qr/monastery gates/i,"Can load perlmonks"); +$driver->quit(); + +done_testing(); diff --git a/at/sanity-edge.test b/at/sanity-edge.test index 6c2a320b..5c1a6121 100644 --- a/at/sanity-edge.test +++ b/at/sanity-edge.test @@ -241,7 +241,10 @@ is($driver->get_cookie_named('foo')->{value},'bar',"can get cookie by name (WD3 TODO: { local $TODO= 'delete_cookie_named seems bork'; $driver->delete_cookie_named('foo'); - is(scalar(@{$driver->get_all_cookies()}),0,"can delete named cookies (WD3)"); + SKIP: { + skip(1,"sigh, so is get all cookies"); + is(scalar(@{$driver->get_all_cookies()}),0,"can delete named cookies (WD3)"); + } } is(exception { $driver->quit() }, undef, "Can quit (WD3)"); diff --git a/lib/Selenium/Edge.pm b/lib/Selenium/Edge.pm new file mode 100644 index 00000000..9092d913 --- /dev/null +++ b/lib/Selenium/Edge.pm @@ -0,0 +1,133 @@ +package Selenium::Edge; + +use strict; +use warnings; + +# ABSTRACT: Use EdgeDriver without a Selenium server +use Moo; +use Selenium::CanStartBinary::FindBinary qw/coerce_simple_binary/; +extends 'Selenium::Remote::Driver'; + +=head1 SYNOPSIS + + my $driver = Selenium::Edge->new; + # when you're done + $driver->shutdown_binary; + +=for Pod::Coverage has_binary + +=head1 DESCRIPTION + +This class allows you to use the EdgeDriver without needing the JRE +or a selenium server running. When you refrain from passing the +C and C arguments, we will search for the +edgedriver 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 MicrosoftWebDriver 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::Edge instance is using a +separate MicrosoftWebDriver binary, or through the selenium server, you can +check the C attr after instantiation. + +=cut + +has '+browser_name' => ( + is => 'ro', + default => sub { 'MicrosoftEdge' } +); + +=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 { 'MicrosoftWebDriver.exe' }, + 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 { 17556 } +); + +has '_binary_args' => ( + is => 'lazy', + builder => sub { + my ($self) = @_; + + my $context = $self->wd_context_prefix; + $context =~ s{^/}{}; + + return ' --port=' . $self->port . ' --url-base=' . $context . ' '; + } +); + +with 'Selenium::CanStartBinary'; + +=attr custom_args + +Optional: specify any additional command line arguments you'd like +invoked during the binary startup. See +L for more information. + +=attr startup_timeout + +Optional: specify how long to wait for the binary to start itself and +listen on its port. The default duration is arbitrarily 10 seconds. It +accepts an integer number of seconds to wait: the following will wait +up to 20 seconds: + + Selenium::Edge->new( startup_timeout => 20 ); + +See L for more information. + +=method shutdown_binary + +Call this method instead of L to ensure +that the binary executable is also closed, instead of simply closing +the browser itself. If the browser is still around, it will call +C for you. After that, it will try to shutdown the browser +binary by making a GET to /shutdown and on Windows, it will attempt to +do a C on the binary CMD window. + + $self->shutdown_binary; + +It doesn't take any arguments, and it doesn't return anything. + +We do our best to call this when the C<$driver> option goes out of +scope, but if that happens during global destruction, there's nothing +we can do. + +=attr fixed_ports + +Optional: Throw instead of searching for additional ports; see +L for more info. + +=cut + +1;