Sunday, May 10, 2020

Tabbed Browsing mit Chrome in Perl und Selenium::Remote::Driver; Neue Browsertabs/Tabs öffnen

Auf der Suche nach einer Lösung wie in Selenium ein neuer Browsertab/Tab geöffnet wird und darin Tests ausgeführt werden können, findet man immer nur den Ansatz, die Tastenkombination CTRL+t an das body HTML-Element zu senden. Aber irgendwie funktioniert das nicht, oder ich habe einen Fehler gemacht.

Hier mal meine Lösung, die für mich funktioniert. Später tue ich es wohl nach https://gist.github.com/1nn3.

#!/usr/bin/env perl

use diagnostics;
use strict;
use utf8;
use warnings;

use Data::Dumper;
use Selenium::Chrome;
use Selenium::Remote::Driver;
use Selenium::Waiter;

my $driver  = Selenium::Chrome->new();
my $stay    = 0;
my @urls    = ( "https://www.golem.de", "https://www.heise.de",
    "https://www.pro-linux.de" );
my ( $page_load, $script, $implicit ) = $driver->get_timeouts();

print Dumper(
    Selenium::Waiter::wait_until {
        $driver->execute_script( "

// Das JavaScript wird auf der Seite ausgeführt, daher hierfür eine leere

function sleep(milliseconds) {
	return new Promise(resolve => setTimeout(resolve, milliseconds));
}

var tabs = [];
for (var i = 0; i < arguments.length; i++) {
	tabs.push(window.open(arguments[i]));
}

//await sleep($stay * 1000);

//for (var i = 0; i < tabs.length; i++) {
//	tabs[i].close();
//}

return tabs.length;
", @urls ) > -1
    },
    timeout  => $stay * 1000 + $script,
    interval => 0,
);

#sleep $stay;

my $handles = $driver->get_window_handles();
for ( my $i = 1 ; $i < scalar(@$handles) ; $i++ ) {

    #print Dumper($handles->[$i]);
    $driver->switch_to_window( $handles->[$i] );
    print Dumper( $driver->get_title() );
    $driver->close();
}

$driver->switch_to_window( $handles->[0] );
print Dumper( $driver->get_title() );

END {
    $driver->shutdown_binary();
}