diff --git a/src/WebdriverClassicDriver.php b/src/WebdriverClassicDriver.php index 438abd5..5c8e221 100644 --- a/src/WebdriverClassicDriver.php +++ b/src/WebdriverClassicDriver.php @@ -762,7 +762,7 @@ protected function createWebDriver(): void throw new DriverException('Base driver has already been created'); } - $this->webDriver = RemoteWebDriver::create($this->webDriverHost, $this->desiredCapabilities); + $this->webDriver = RemoteWebDriver::create($this->webDriverHost, $this->getDesiredCapabilities()); } /** @@ -777,6 +777,11 @@ protected function getWebDriver(): RemoteWebDriver throw new DriverException('Base driver has not been created'); } + protected function getDesiredCapabilities(): array + { + return $this->desiredCapabilities->toArray(); + } + private function getNormalisedBrowserName(): string { return self::BROWSER_NAME_ALIAS_MAP[$this->browserName] ?? $this->browserName; @@ -789,29 +794,22 @@ private function getNormalisedBrowserName(): string */ private function initCapabilities(array $desiredCapabilities): DesiredCapabilities { - // Build base capabilities - $caps = $this->getBrowserSpecificCapabilities() ?? new DesiredCapabilities(); - - // Set defaults - $defaults = array_merge( - self::DEFAULT_CAPABILITIES['default'], - self::DEFAULT_CAPABILITIES[$this->getNormalisedBrowserName()] ?? [] - ); - foreach ($defaults as $key => $value) { - if ($caps->getCapability($key) === null) { - $caps->setCapability($key, $value); - } - } - - // Merge in other requested types - foreach ($desiredCapabilities as $key => $value) { - $caps->setCapability($key, $value); + $capabilities = $this->createBrowserSpecificCapabilities(); + + foreach ( + array_merge( + self::DEFAULT_CAPABILITIES['default'], + self::DEFAULT_CAPABILITIES[$this->getNormalisedBrowserName()] ?? [], + $desiredCapabilities, + ) as $capabilityKey => $capabilityValue + ) { + $capabilities->setCapability($capabilityKey, $capabilityValue); } - return $caps; + return $capabilities; } - private function getBrowserSpecificCapabilities(): ?DesiredCapabilities + private function createBrowserSpecificCapabilities(): DesiredCapabilities { switch ($this->getNormalisedBrowserName()) { case WebDriverBrowserType::FIREFOX: @@ -855,7 +853,7 @@ private function getBrowserSpecificCapabilities(): ?DesiredCapabilities case WebDriverBrowserType::MOCK: case WebDriverBrowserType::IE_HTA: default: - return null; + return new DesiredCapabilities(); } } diff --git a/tests/Custom/CapabilityTest.php b/tests/Custom/CapabilityTest.php new file mode 100644 index 0000000..4d5f096 --- /dev/null +++ b/tests/Custom/CapabilityTest.php @@ -0,0 +1,103 @@ + $desiredCapabilities + * @param array $expectedCapabilities + * + * @dataProvider capabilitiesDataProvider + */ + public function testThatCapabilitiesAreAsExpected(string $browserName, array $desiredCapabilities, array $expectedCapabilities): void + { + $driver = $this->createDriverExposingCapabilities($browserName, $desiredCapabilities); + + $this->assertSame($expectedCapabilities, $driver->capabilities); + } + + public static function capabilitiesDataProvider(): iterable + { + yield 'unknown browser starts with default driver capabilities' => [ + 'browserName' => 'fake browser', + 'desiredCapabilities' => [], + 'expectedCapabilities' => [ + 'platform' => 'ANY', + 'name' => 'Behat Test', + 'deviceOrientation' => 'landscape', + 'deviceType' => 'desktop', + ], + ]; + + yield 'default capabilities can be customised' => [ + 'browserName' => 'fake browser', + 'desiredCapabilities' => [ + 'something' => 'custom', + 'name' => 'Custom Test', + ], + 'expectedCapabilities' => [ + 'platform' => 'ANY', + 'name' => 'Custom Test', + 'deviceOrientation' => 'landscape', + 'deviceType' => 'desktop', + 'something' => 'custom', + ], + ]; + + yield 'browser-specific default capabilities are added' => [ + 'browserName' => 'chrome', + 'desiredCapabilities' => [], + 'expectedCapabilities' => [ + 'browserName' => 'chrome', + 'platform' => 'ANY', + 'name' => 'Behat Test', + 'deviceOrientation' => 'landscape', + 'deviceType' => 'desktop', + 'goog:chromeOptions' => [ + 'excludeSwitches' => ['enable-automation'], + ], + ], + ]; + + yield 'browser-specific default capabilities can be customised' => [ + 'browserName' => 'chrome', + 'desiredCapabilities' => [ + 'name' => 'Custom Test', + 'goog:chromeOptions' => ['args' => ['a', 'b', 'c']], + ], + 'expectedCapabilities' => [ + 'browserName' => 'chrome', + 'platform' => 'ANY', + 'name' => 'Custom Test', + 'deviceOrientation' => 'landscape', + 'deviceType' => 'desktop', + 'goog:chromeOptions' => ['args' => ['a', 'b', 'c']], + ], + ]; + } + + /** + * @param string $browserName + * @param array $desiredCapabilities + * @return WebdriverClassicDriver&object{capabilities: null|array} + */ + private function createDriverExposingCapabilities(string $browserName, array $desiredCapabilities = []): WebdriverClassicDriver + { + return new class($browserName, $desiredCapabilities) extends WebdriverClassicDriver { + /** + * @var null|array + */ + public ?array $capabilities = null; + + public function __construct(string $browserName, array $desiredCapabilities) + { + parent::__construct($browserName, $desiredCapabilities); + + $this->capabilities = $this->getDesiredCapabilities(); + } + }; + } +}