소스 검색

Implement proof of concept for Firefox binary startup

WIP: This should probably be heavily refactored.
Daniel Gempesaw 10 년 전
부모
커밋
b6f7080850
4개의 변경된 파일128개의 추가작업 그리고 2개의 파일을 삭제
  1. 58 1
      lib/Selenium/Firefox.pm
  2. BIN
      lib/Selenium/Firefox/webdriver.xpi
  3. 68 0
      lib/Selenium/Firefox/webdriver_prefs.json
  4. 2 1
      t/binary.t

+ 58 - 1
lib/Selenium/Firefox.pm

@@ -1,18 +1,75 @@
 package Selenium::Firefox;
 
 # ABSTRACT: A convenience package for creating a Firefox instance
+use Selenium::Binary qw/_find_open_port_above _probe_port/;
+use Selenium::Firefox::Binary qw/path/;
+use Selenium::Firefox::Profile;
+use Selenium::Waiter qw/wait_until/;
 use Moo;
+use namespace::clean;
 extends 'Selenium::Remote::Driver';
 
 =head1 SYNOPSIS
 
-    my $driver = Selenium::Firefox->new;
+my $driver = Selenium::Firefox->new;
 
 =cut
 
+use constant FIREFOX_PORT => 9090;
+
 has '+browser_name' => (
     is => 'ro',
     default => sub { 'firefox' }
 );
 
+# By shadowing the parent's port, we can set it in _build_binary_mode properly
+has '+port' => (
+    is => 'lazy',
+    default => sub { 4444 }
+);
+
+has '+firefox_profile' => (
+    is => 'ro',
+    lazy => 1,
+    coerce => sub {
+        my ($profile) = @_;
+        die unless $profile->isa('Selenium::Firefox::Profile');
+        my $port = _find_open_port_above(FIREFOX_PORT);
+        $profile->add_webdriver($port);
+
+        return $profile;
+    },
+    default => sub { Selenium::Firefox::Profile->new }
+);
+
+has 'binary_mode' => (
+    is => 'ro',
+    init_arg => undef,
+    builder => sub {
+        my ($self) = @_;
+
+        my $profile = Selenium::Firefox::Profile->new;
+
+        my $port = _find_open_port_above(FIREFOX_PORT);
+        $profile->add_webdriver($port);
+
+        $ENV{'XRE_PROFILE_PATH'} = $profile->_layout_on_disk;
+        $ENV{'MOZ_NO_REMOTE'} = '1'; # able to launch multiple instances
+        $ENV{'MOZ_CRASHREPORTER_DISABLE'} = '1'; # disable breakpad
+        $ENV{'NO_EM_RESTART'} = '1'; # prevent the binary from detaching from the console.log
+
+        my $binary = path();
+        system( $binary . ' -no-remote > /dev/null 2>&1 & ');
+
+        my $success = wait_until { _probe_port($port) } timeout => 10;
+        if ($success) {
+            $self->port($port);
+            return 1
+        }
+        else {
+            return 0;
+        }
+    }
+);
+
 1;

BIN
lib/Selenium/Firefox/webdriver.xpi


+ 68 - 0
lib/Selenium/Firefox/webdriver_prefs.json

@@ -0,0 +1,68 @@
+{
+  "frozen": {
+    "app.update.auto": false,
+    "app.update.enabled": false,
+    "browser.download.manager.showWhenStarting": false,
+    "browser.EULA.override": true,
+    "browser.EULA.3.accepted": true,
+    "browser.link.open_external": 2,
+    "browser.link.open_newwindow": 2,
+    "browser.offline": false,
+    "browser.safebrowsing.enabled": false,
+    "browser.safebrowsing.malware.enabled": false,
+    "browser.search.update": false,
+    "browser.sessionstore.resume_from_crash": false,
+    "browser.shell.checkDefaultBrowser": false,
+    "browser.tabs.warnOnClose": false,
+    "browser.tabs.warnOnOpen": false,
+    "datareporting.healthreport.service.enabled": false,
+    "datareporting.healthreport.uploadEnabled": false,
+    "datareporting.healthreport.service.firstRun": false,
+    "datareporting.healthreport.logging.consoleEnabled": false,
+    "datareporting.policy.dataSubmissionEnabled": false,
+    "datareporting.policy.dataSubmissionPolicyAccepted": false,
+    "devtools.errorconsole.enabled": true,
+    "dom.disable_open_during_load": false,
+    "extensions.autoDisableScopes": 10,
+    "extensions.blocklist.enabled": false,
+    "extensions.logging.enabled": true,
+    "extensions.update.enabled": false,
+    "extensions.update.notifyUser": false,
+    "network.manage-offline-status": false,
+    "network.http.phishy-userpass-length": 255,
+    "offline-apps.allow_by_default": true,
+    "prompts.tab_modal.enabled": false,
+    "security.csp.enable": false,
+    "security.fileuri.origin_policy": 3,
+    "security.fileuri.strict_origin_policy": false,
+    "security.warn_entering_secure": false,
+    "security.warn_entering_secure.show_once": false,
+    "security.warn_entering_weak": false,
+    "security.warn_entering_weak.show_once": false,
+    "security.warn_leaving_secure": false,
+    "security.warn_leaving_secure.show_once": false,
+    "security.warn_submit_insecure": false,
+    "security.warn_viewing_mixed": false,
+    "security.warn_viewing_mixed.show_once": false,
+    "signon.rememberSignons": false,
+    "toolkit.networkmanager.disable": true,
+    "toolkit.telemetry.prompted": 2,
+    "toolkit.telemetry.enabled": false,
+    "toolkit.telemetry.rejected": true
+  },
+  "mutable": {
+    "browser.dom.window.dump.enabled": true,
+    "browser.newtab.url": "about:blank",
+    "browser.newtabpage.enabled": false,
+    "browser.startup.page": 0,
+    "browser.startup.homepage": "about:blank",
+    "dom.max_chrome_script_run_time": 30,
+    "dom.max_script_run_time": 30,
+    "dom.report_all_js_exceptions": true,
+    "javascript.options.showInConsole": true,
+    "network.http.max-connections-per-server": 10,
+    "startup.homepage_welcome_url": "about:blank",
+    "webdriver_accept_untrusted_certs": true,
+    "webdriver_assume_untrusted_issuer": true
+  }
+}

+ 2 - 1
t/binary.t

@@ -36,7 +36,8 @@ CHROME: {
 FIREFOX: {
     my $binary = Selenium::Firefox::Binary::path();
     ok(-x $binary, 'we can find some sort of firefox');
-
+    my $firefox = Selenium::Firefox->new;
+    isnt( $firefox->port, 4444, 'firefox can start up its own binary');
 }
 
 done_testing;