panther icon indicating copy to clipboard operation
panther copied to clipboard

ChromeOptions

Open Ne-Lexa opened this issue 4 years ago • 3 comments

Many developers want to customize ChromeOptions, but without introducing a new class, this cannot be done.

A better option would be to be able to pass ChromeOptions to the ChromeManager class, but that would violate backward compatibility.

I suggest extending the ChromeManager class to support experimental options, features, and extensions. To do this, I propose adding the methods setCapabilities, setExperimentalOptions and setExtensions to the ChromeManager class.

#241 #214 #78 #276 #243

An example of what should happen:

<?php

$chromeArguments = [
    '--disable-popup-blocking',
    '--disable-application-cache',
    '--disable-web-security',
    '--start-maximized',
    '--ignore-certificate-errors',
    '--headless',
];

$logType = 'performance';
$loggingPrefs = new \stdClass();
$loggingPrefs->{$logType} = 'ALL';

$capabilities = [
    'goog:loggingPrefs' => $loggingPrefs,
];

$prefs = new \stdClass();
$prefs->{'intl.accept_languages'} = 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7';

$mobileEmulation = new \stdClass();
$mobileEmulation->{'deviceName'} = 'Nexus 5';

$experimentalOptions = [
    'prefs' => $prefs,
    'mobileEmulation' => $mobileEmulation,
];

$browserManager = new \Symfony\Component\Panther\ProcessManager\ChromeManager(null, $chromeArguments, ['port' => random_int(1000, 20000)]);
$browserManager->setCapabilities($capabilities);
$browserManager->setExperimentalOptions($experimentalOptions);
$browserManager->setExtensions(['/path/to/adblock.crx']);

$client = new \Symfony\Component\Panther\Client($browserManager);
$client->get('https://www.example.com/');
$logs = $client->getWebDriver()->manage()->getLog($logType);
$client->close();
$client->quit(true);

dump($logs);
Output
^ array:12 [
  0 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Network.requestWillBeSent","params":{"documentURL":"https://www.example.com/","frameId":"CDF6B66281C211B22CFD6041BB9879ED","hasUserGesture":false,"initiator":{"type":"other"},"loaderId":"9E78463595EA81B74DC07935304F6963","request":{"headers":{"Sec-Fetch-Dest":"document","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3329.0 Mobile Safari/537.36"},"initialPriority":"VeryHigh","method":"GET","mixedContentType":"none","referrerPolicy":"no-referrer-when-downgrade","url":"https://www.example.com/"},"requestId":"9E78463595EA81B74DC07935304F6963","timestamp":26210.358853,"type":"Document","wallTime":1582293819.775458}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293819775
  ]
  1 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Network.requestWillBeSentExtraInfo","params":{"blockedCookies":[],"headers":{":authority":"www.example.com",":method":"GET",":path":"/",":scheme":"https","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","accept-encoding":"gzip, deflate, br","accept-language":"en-US","sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","sec-fetch-user":"?1","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3329.0 Mobile Safari/537.36"},"requestId":"9E78463595EA81B74DC07935304F6963"}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821062
  ]
  2 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Network.responseReceivedExtraInfo","params":{"blockedCookies":[],"headers":{"accept-ranges":"bytes","age":"592180","cache-control":"max-age=604800","content-encoding":"gzip","content-length":"648","content-type":"text/html; charset=UTF-8","date":"Fri, 21 Feb 2020 14:03:41 GMT","etag":"\"3147526947\"","expires":"Fri, 28 Feb 2020 14:03:41 GMT","last-modified":"Thu, 17 Oct 2019 07:18:26 GMT","server":"ECS (nyb/1D27)","status":"200","vary":"Accept-Encoding","x-cache":"HIT"},"requestId":"9E78463595EA81B74DC07935304F6963"}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821952
  ]
  3 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Network.responseReceived","params":{"frameId":"CDF6B66281C211B22CFD6041BB9879ED","loaderId":"9E78463595EA81B74DC07935304F6963","requestId":"9E78463595EA81B74DC07935304F6963","response":{"connectionId":14,"connectionReused":false,"encodedDataLength":193,"fromDiskCache":false,"fromPrefetchCache":false,"fromServiceWorker":false,"headers":{"accept-ranges":"bytes","age":"592180","cache-control":"max-age=604800","content-encoding":"gzip","content-length":"648","content-type":"text/html; charset=UTF-8","date":"Fri, 21 Feb 2020 14:03:41 GMT","etag":"\"3147526947\"","expires":"Fri, 28 Feb 2020 14:03:41 GMT","last-modified":"Thu, 17 Oct 2019 07:18:26 GMT","server":"ECS (nyb/1D27)","status":"200","vary":"Accept-Encoding","x-cache":"HIT"},"mimeType":"text/html","protocol":"h2","remoteIPAddress":"93.184.216.34","remotePort":443,"requestHeaders":{":authority":"www.example.com",":method":"GET",":path":"/",":scheme":"https","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","accept-encoding":"gzip, deflate, br","accept-language":"en-US","sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","sec-fetch-user":"?1","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3329.0 Mobile Safari/537.36"},"securityDetails":{"certificateId":0,"certificateTransparencyCompliance":"unknown","cipher":"AES_256_GCM","issuer":"DigiCert SHA2 Secure Server CA","keyExchange":"","keyExchangeGroup":"P-256","protocol":"TLS 1.3","sanList":["www.example.org","example.com","example.edu","example.net","example.org","www.example.com","www.example.edu","www.example.net"],"signedCertificateTimestampList":[],"subjectName":"www.example.org","validFrom":1543363200,"validTo":1606910400},"securityState":"secure","status":200,"statusText":"","timing":{"connectEnd":1285.801,"connectStart":265.636,"dnsEnd":265.636,"dnsStart":265.581,"proxyEnd":-1,"proxyStart":-1,"pushEnd":0,"pushStart":0,"receiveHeadersEnd":2175.924,"requestTime":26210.359427,"sendEnd":1286.174,"sendStart":1285.967,"sslEnd":1285.777,"sslStart":987.068,"workerReady":-1,"workerStart":-1},"url":"https://www.example.com/"},"timestamp":26212.536592,"type":"Document"}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821955
  ]
  4 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Page.frameStartedLoading","params":{"frameId":"CDF6B66281C211B22CFD6041BB9879ED"}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821960
  ]
  5 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Page.frameNavigated","params":{"frame":{"id":"CDF6B66281C211B22CFD6041BB9879ED","loaderId":"9E78463595EA81B74DC07935304F6963","mimeType":"text/html","securityOrigin":"https://www.example.com","url":"https://www.example.com/"}}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821960
  ]
  6 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Network.dataReceived","params":{"dataLength":1256,"encodedDataLength":0,"requestId":"9E78463595EA81B74DC07935304F6963","timestamp":26212.543575}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821963
  ]
  7 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Network.loadingFinished","params":{"encodedDataLength":850,"requestId":"9E78463595EA81B74DC07935304F6963","shouldReportCorbBlocking":false,"timestamp":26212.53656}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821965
  ]
  8 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Page.frameResized","params":{}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821985
  ]
  9 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Page.loadEventFired","params":{"timestamp":26212.568304}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821985
  ]
  10 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Page.frameStoppedLoading","params":{"frameId":"CDF6B66281C211B22CFD6041BB9879ED"}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821985
  ]
  11 => array:3 [
    "level" => "INFO"
    "message" => "{"message":{"method":"Page.domContentEventFired","params":{"timestamp":26212.568647}},"webview":"CDF6B66281C211B22CFD6041BB9879ED"}"
    "timestamp" => 1582293821988
  ]
]

Ne-Lexa avatar Feb 21 '20 14:02 Ne-Lexa

Another option would be to expand the parameters instead of adding setters.

What do you think?

final class ChromeManager implements BrowserManagerInterface
{
...
    private function getDefaultOptions(): array
    {
        return [
            'scheme' => 'http',
            'host' => '127.0.0.1',
            'port' => 9515,
            'path' => '/status',
+            'experimentalOptions' => [],
+            'capabilities' => [],
+            'extensions' => [],
        ];
    }
}

Ne-Lexa avatar Feb 21 '20 14:02 Ne-Lexa

Any updates on this issue? 👀

Would be nice to have the ability to set experimental options since that seems to be the only way to disable a certain DevTools message I receive on the terminal. https://stackoverflow.com/a/56408800.

nkutinha avatar Jun 22 '21 07:06 nkutinha

Any news on this? I'm unable to run arguments such as '--disable-web-security'.

frxncisjoseph avatar Aug 27 '23 18:08 frxncisjoseph