xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/Chrome/ChromeDriver.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver\Chrome;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\Local\LocalWebDriver;
6*04fd306cSNickeauuse Facebook\WebDriver\Remote\DesiredCapabilities;
7*04fd306cSNickeauuse Facebook\WebDriver\Remote\Service\DriverCommandExecutor;
8*04fd306cSNickeauuse Facebook\WebDriver\Remote\WebDriverCommand;
9*04fd306cSNickeau
10*04fd306cSNickeauclass ChromeDriver extends LocalWebDriver
11*04fd306cSNickeau{
12*04fd306cSNickeau    /** @var ChromeDevToolsDriver */
13*04fd306cSNickeau    private $devTools;
14*04fd306cSNickeau
15*04fd306cSNickeau    /**
16*04fd306cSNickeau     * Creates a new ChromeDriver using default configuration.
17*04fd306cSNickeau     * This includes starting a new chromedriver process each time this method is called. However this may be
18*04fd306cSNickeau     * unnecessary overhead - instead, you can start the process once using ChromeDriverService and pass
19*04fd306cSNickeau     * this instance to startUsingDriverService() method.
20*04fd306cSNickeau     *
21*04fd306cSNickeau     * @todo Remove $service parameter. Use `ChromeDriver::startUsingDriverService` to pass custom $service instance.
22*04fd306cSNickeau     * @return static
23*04fd306cSNickeau     */
24*04fd306cSNickeau    public static function start(DesiredCapabilities $desired_capabilities = null, ChromeDriverService $service = null)
25*04fd306cSNickeau    {
26*04fd306cSNickeau        if ($service === null) { // TODO: Remove the condition (always create default service)
27*04fd306cSNickeau            $service = ChromeDriverService::createDefaultService();
28*04fd306cSNickeau        }
29*04fd306cSNickeau
30*04fd306cSNickeau        return static::startUsingDriverService($service, $desired_capabilities);
31*04fd306cSNickeau    }
32*04fd306cSNickeau
33*04fd306cSNickeau    /**
34*04fd306cSNickeau     * Creates a new ChromeDriver using given ChromeDriverService.
35*04fd306cSNickeau     * This is usable when you for example don't want to start new chromedriver process for each individual test
36*04fd306cSNickeau     * and want to reuse the already started chromedriver, which will lower the overhead associated with spinning up
37*04fd306cSNickeau     * a new process.
38*04fd306cSNickeau
39*04fd306cSNickeau     * @return static
40*04fd306cSNickeau     */
41*04fd306cSNickeau    public static function startUsingDriverService(
42*04fd306cSNickeau        ChromeDriverService $service,
43*04fd306cSNickeau        DesiredCapabilities $capabilities = null
44*04fd306cSNickeau    ) {
45*04fd306cSNickeau        if ($capabilities === null) {
46*04fd306cSNickeau            $capabilities = DesiredCapabilities::chrome();
47*04fd306cSNickeau        }
48*04fd306cSNickeau
49*04fd306cSNickeau        $executor = new DriverCommandExecutor($service);
50*04fd306cSNickeau        $newSessionCommand = WebDriverCommand::newSession(
51*04fd306cSNickeau            [
52*04fd306cSNickeau                'capabilities' => [
53*04fd306cSNickeau                    'firstMatch' => [(object) $capabilities->toW3cCompatibleArray()],
54*04fd306cSNickeau                ],
55*04fd306cSNickeau                'desiredCapabilities' => (object) $capabilities->toArray(),
56*04fd306cSNickeau            ]
57*04fd306cSNickeau        );
58*04fd306cSNickeau
59*04fd306cSNickeau        $response = $executor->execute($newSessionCommand);
60*04fd306cSNickeau
61*04fd306cSNickeau        /*
62*04fd306cSNickeau         * TODO: in next major version we may not need to use this method, because without OSS compatibility the
63*04fd306cSNickeau         * driver creation is straightforward.
64*04fd306cSNickeau         */
65*04fd306cSNickeau        return static::createFromResponse($response, $executor);
66*04fd306cSNickeau    }
67*04fd306cSNickeau
68*04fd306cSNickeau    /**
69*04fd306cSNickeau     * @todo Remove in next major version. The class is internally no longer used and is kept only to keep BC.
70*04fd306cSNickeau     * @deprecated Use start or startUsingDriverService method instead.
71*04fd306cSNickeau     * @codeCoverageIgnore
72*04fd306cSNickeau     * @internal
73*04fd306cSNickeau     */
74*04fd306cSNickeau    public function startSession(DesiredCapabilities $desired_capabilities)
75*04fd306cSNickeau    {
76*04fd306cSNickeau        $command = WebDriverCommand::newSession(
77*04fd306cSNickeau            [
78*04fd306cSNickeau                'capabilities' => [
79*04fd306cSNickeau                    'firstMatch' => [(object) $desired_capabilities->toW3cCompatibleArray()],
80*04fd306cSNickeau                ],
81*04fd306cSNickeau                'desiredCapabilities' => (object) $desired_capabilities->toArray(),
82*04fd306cSNickeau            ]
83*04fd306cSNickeau        );
84*04fd306cSNickeau        $response = $this->executor->execute($command);
85*04fd306cSNickeau        $value = $response->getValue();
86*04fd306cSNickeau
87*04fd306cSNickeau        if (!$this->isW3cCompliant = isset($value['capabilities'])) {
88*04fd306cSNickeau            $this->executor->disableW3cCompliance();
89*04fd306cSNickeau        }
90*04fd306cSNickeau
91*04fd306cSNickeau        $this->sessionID = $response->getSessionID();
92*04fd306cSNickeau    }
93*04fd306cSNickeau
94*04fd306cSNickeau    /**
95*04fd306cSNickeau     * @return ChromeDevToolsDriver
96*04fd306cSNickeau     */
97*04fd306cSNickeau    public function getDevTools()
98*04fd306cSNickeau    {
99*04fd306cSNickeau        if ($this->devTools === null) {
100*04fd306cSNickeau            $this->devTools = new ChromeDevToolsDriver($this);
101*04fd306cSNickeau        }
102*04fd306cSNickeau
103*04fd306cSNickeau        return $this->devTools;
104*04fd306cSNickeau    }
105*04fd306cSNickeau}
106