Skip to content

Commit 772a8be

Browse files
committed
fix: FirefoxManager should keep default capabilities when they are not explicitely set
1 parent c4ec484 commit 772a8be

File tree

2 files changed

+72
-13
lines changed

2 files changed

+72
-13
lines changed

src/ProcessManager/FirefoxManager.php

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,30 +99,37 @@ private function getDefaultArguments(): array
9999

100100
private function buildCapabilities(): DesiredCapabilities
101101
{
102-
$firefoxOptions = [];
102+
$capabilities = DesiredCapabilities::firefox();
103+
$firefoxOptions = $capabilities->getCapability(FirefoxOptions::CAPABILITY);
104+
103105
if (isset($_SERVER['PANTHER_FIREFOX_BINARY'])) {
104-
$firefoxOptions['binary'] = $_SERVER['PANTHER_FIREFOX_BINARY'];
106+
$firefoxOptions->setOption('binary', $_SERVER['PANTHER_FIREFOX_BINARY']);
105107
}
106108
if ($this->arguments) {
107-
$firefoxOptions['args'] = $this->arguments;
109+
$firefoxOptions->addArguments($this->arguments);
108110
}
109111

110-
$capabilities = DesiredCapabilities::firefox();
111-
$capabilities->setCapability('moz:firefoxOptions', $firefoxOptions);
112-
113112
// Prefer reduced motion, see https://developer.mozilla.org/fr/docs/Web/CSS/@media/prefers-reduced-motion
114-
/** @var FirefoxOptions|array $firefoxOptions */
115-
$firefoxOptions = $capabilities->getCapability('moz:firefoxOptions') ?? [];
116-
$firefoxOptions = $firefoxOptions instanceof FirefoxOptions ? $firefoxOptions->toArray() : $firefoxOptions;
117113
if (!filter_var($_SERVER['PANTHER_NO_REDUCED_MOTION'] ?? false, \FILTER_VALIDATE_BOOLEAN)) {
118-
$firefoxOptions['prefs']['ui.prefersReducedMotion'] = 1;
114+
$firefoxOptions->setPreference('ui.prefersReducedMotion', 1);
119115
} else {
120-
$firefoxOptions['prefs']['ui.prefersReducedMotion'] = 0;
116+
$firefoxOptions->setPreference('ui.prefersReducedMotion', 0);
121117
}
122-
$capabilities->setCapability('moz:firefoxOptions', $firefoxOptions);
123118

124119
foreach ($this->options['capabilities'] as $capability => $value) {
125-
$capabilities->setCapability($capability, $value);
120+
if (FirefoxOptions::CAPABILITY !== $capability) {
121+
$capabilities->setCapability($capability, $value);
122+
continue;
123+
}
124+
125+
if (isset($value[FirefoxOptions::OPTION_ARGS])) {
126+
$firefoxOptions->addArguments($value[FirefoxOptions::OPTION_ARGS]);
127+
}
128+
if (isset($value[FirefoxOptions::OPTION_PREFS])) {
129+
foreach ($value[FirefoxOptions::OPTION_PREFS] as $preference => $preferenceValue) {
130+
$firefoxOptions->setPreference($preference, $preferenceValue);
131+
}
132+
}
126133
}
127134

128135
return $capabilities;

tests/ProcessManager/FirefoxManagerTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
namespace Symfony\Component\Panther\Tests\ProcessManager;
1515

16+
use Facebook\WebDriver\Firefox\FirefoxOptions;
17+
use Facebook\WebDriver\Remote\DesiredCapabilities;
1618
use PHPUnit\Framework\TestCase;
1719
use Symfony\Component\Panther\Exception\RuntimeException;
1820
use Symfony\Component\Panther\ProcessManager\FirefoxManager;
@@ -68,4 +70,54 @@ public function testMultipleInstances(): void
6870
$driver1->quit();
6971
$driver2->quit();
7072
}
73+
74+
public function testCanOverrideOptions(): void
75+
{
76+
$manager = new FirefoxManager(null, null, [
77+
'capabilities' => [
78+
'platform' => 'LINUX',
79+
'browserName' => 'firefox-esr',
80+
'moz:firefoxOptions' => [
81+
'prefs' => [
82+
'devtools.console.stdout.content' => true,
83+
'reader.parse-on-load.enabled' => true,
84+
],
85+
'args' => [
86+
'--new-instance',
87+
],
88+
],
89+
],
90+
]);
91+
$refl = new \ReflectionMethod($manager, 'buildCapabilities');
92+
$refl->setAccessible(true);
93+
$capabilities = $refl->invoke($manager);
94+
95+
$this->assertInstanceOf(DesiredCapabilities::class, $capabilities);
96+
$this->assertEquals('LINUX', $capabilities->getCapability('platform'));
97+
$this->assertEquals('firefox-esr', $capabilities->getCapability('browserName'));
98+
99+
$this->assertInstanceOf(FirefoxOptions::class, $capabilities->getCapability('moz:firefoxOptions'));
100+
$mozFirefoxOptions = $capabilities->getCapability('moz:firefoxOptions')->toArray();
101+
$this->assertArrayHasKey('prefs', $mozFirefoxOptions);
102+
103+
// // our preferences should be set
104+
$this->assertArrayHasKey('devtools.console.stdout.content', $mozFirefoxOptions['prefs']);
105+
$this->assertTrue($mozFirefoxOptions['prefs']['devtools.console.stdout.content']);
106+
107+
// but the default one should still be there
108+
$this->assertArrayHasKey('ui.prefersReducedMotion', $mozFirefoxOptions['prefs']);
109+
$this->assertEquals('1', $mozFirefoxOptions['prefs']['ui.prefersReducedMotion']);
110+
$this->assertArrayHasKey('devtools.jsonview.enabled', $mozFirefoxOptions['prefs']);
111+
$this->assertFalse($mozFirefoxOptions['prefs']['devtools.jsonview.enabled']);
112+
113+
// except if we override then
114+
$this->assertArrayHasKey('reader.parse-on-load.enabled', $mozFirefoxOptions['prefs']);
115+
$this->assertTrue($mozFirefoxOptions['prefs']['reader.parse-on-load.enabled']);
116+
117+
// default arguments should still be there
118+
$this->assertContains('--headless', $mozFirefoxOptions['args']);
119+
120+
// but our custom one should be there too
121+
$this->assertContains('--new-instance', $mozFirefoxOptions['args']);
122+
}
71123
}

0 commit comments

Comments
 (0)