diff --git a/src/Client.php b/src/Client.php index 6b25cef6..53ea675f 100644 --- a/src/Client.php +++ b/src/Client.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Panther; +use Facebook\WebDriver\Exception\InvalidArgumentException; use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\Exception\TimeoutException; use Facebook\WebDriver\JavaScriptExecutor; @@ -35,6 +36,7 @@ use Symfony\Component\DomCrawler\Crawler; use Symfony\Component\DomCrawler\Form; use Symfony\Component\DomCrawler\Link; +use Symfony\Component\HttpFoundation\Response as HttpFoundationResponse; use Symfony\Component\Panther\Cookie\CookieJar; use Symfony\Component\Panther\DomCrawler\Crawler as PantherCrawler; use Symfony\Component\Panther\DomCrawler\Form as PantherForm; @@ -143,7 +145,7 @@ public function getRequest(): object public function getResponse(): object { - throw new \LogicException('HttpFoundation Response object is not available when using WebDriver.'); + return $this->response ?? throw new \LogicException('HttpFoundation Response object is not available when using WebDriver.'); } public function followRedirects($followRedirects = true): void @@ -527,8 +529,35 @@ public function get($url): self $this->internalRequest = new Request($url, 'GET'); $this->webDriver->get($url); + + if ($this->webDriver instanceof JavaScriptExecutor) { + $this->executeScript('window.localStorage.setItem("symfony/profiler/toolbar/displayState", "none");'); + } + $this->internalResponse = new Response($this->webDriver->getPageSource()); + if ($this->browserManager instanceof ChromeManager) { + try { + $events = $this->webDriver->manage()->getLog('performance'); + } catch (InvalidArgumentException) { + $events = []; + } + + foreach ($events as $event) { + $event = json_decode($event['message'], true)['message']; + + if ('Network.responseReceived' !== ($event['method'] ?? '')) { + continue; + } + $response = $event['params']['response']; + + if ($response['url'] === $url) { + $this->response = new HttpFoundationResponse($this->internalResponse->getContent(), $response['status'], $response['headers']); + break; + } + } + } + $this->crawler = $this->createCrawler(); return $this; diff --git a/src/ProcessManager/ChromeManager.php b/src/ProcessManager/ChromeManager.php index 50f90565..734b4edc 100644 --- a/src/ProcessManager/ChromeManager.php +++ b/src/ProcessManager/ChromeManager.php @@ -135,13 +135,23 @@ private function createProcess(string $chromeDriverBinary): Process private function getDefaultOptions(): array { + $chromeOptions = new ChromeOptions(); + $chromeOptions->setExperimentalOption('perfLoggingPrefs', [ + 'enableNetwork' => true, + ]); + return [ 'scheme' => 'http', 'host' => '127.0.0.1', 'port' => 9515, 'path' => '/status', 'chromedriver_arguments' => [], - 'capabilities' => [], + 'capabilities' => [ + 'goog:loggingPrefs' => [ + 'performance' => 'ALL', + ], + ChromeOptions::CAPABILITY => $chromeOptions, + ], ]; } } diff --git a/src/ProcessManager/FirefoxManager.php b/src/ProcessManager/FirefoxManager.php index d9e31788..c47b6c2a 100644 --- a/src/ProcessManager/FirefoxManager.php +++ b/src/ProcessManager/FirefoxManager.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Panther\ProcessManager; +use Facebook\WebDriver\Firefox\FirefoxOptions; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\WebDriver; @@ -52,20 +53,17 @@ public function start(): WebDriver $this->waitUntilReady($this->process, $url.$this->options['path'], 'firefox'); } - $firefoxOptions = []; - if (isset($_SERVER['PANTHER_FIREFOX_BINARY'])) { - $firefoxOptions['binary'] = $_SERVER['PANTHER_FIREFOX_BINARY']; - } - if ($this->arguments) { - $firefoxOptions['args'] = $this->arguments; - } - $capabilities = DesiredCapabilities::firefox(); - $capabilities->setCapability('moz:firefoxOptions', $firefoxOptions); foreach ($this->options['capabilities'] as $capability => $value) { $capabilities->setCapability($capability, $value); } + $firefoxOptions = $capabilities->getCapability(FirefoxOptions::CAPABILITY); + + // if (isset($_SERVER['PANTHER_FIREFOX_BINARY'])) { + // $firefoxOptions['binary'] = $_SERVER['PANTHER_FIREFOX_BINARY']; + // } + $firefoxOptions->addArguments($this->arguments); return RemoteWebDriver::create($url, $capabilities, $this->options['connection_timeout_in_ms'] ?? null, $this->options['request_timeout_in_ms'] ?? null); } @@ -113,12 +111,24 @@ private function getDefaultArguments(): array private function getDefaultOptions(): array { + $firefoxOptions = new FirefoxOptions(); + + // TODO: make this work - not sure why it doesn't :) + $firefoxOptions->setPreference('devtools.netmonitor.enabled', true); + $firefoxOptions->setPreference('devtools.netmonitor.har.enableAutoExportToFile', true); + $firefoxOptions->setPreference('devtools.netmonitor.har.forceExport', true); + $firefoxOptions->setPreference('devtools.netmonitor.har.defaultLogDir', '/tmp/panther-firefox/'); + return [ 'scheme' => 'http', 'host' => '127.0.0.1', 'port' => 4444, 'path' => '/status', 'capabilities' => [], + 'capabilities' => [ + 'acceptInsecureCerts' => true, + FirefoxOptions::CAPABILITY => $firefoxOptions, + ], ]; } }