panther
panther copied to clipboard
ChromeOptions
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
]
]
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' => [],
];
}
}
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.
Any news on this? I'm unable to run arguments such as '--disable-web-security'.