xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/WebDriverOptions.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\Exception\NoSuchCookieException;
6*04fd306cSNickeauuse Facebook\WebDriver\Remote\DriverCommand;
7*04fd306cSNickeauuse Facebook\WebDriver\Remote\ExecuteMethod;
8*04fd306cSNickeauuse InvalidArgumentException;
9*04fd306cSNickeau
10*04fd306cSNickeau/**
11*04fd306cSNickeau * Managing stuff you would do in a browser.
12*04fd306cSNickeau */
13*04fd306cSNickeauclass WebDriverOptions
14*04fd306cSNickeau{
15*04fd306cSNickeau    /**
16*04fd306cSNickeau     * @var ExecuteMethod
17*04fd306cSNickeau     */
18*04fd306cSNickeau    protected $executor;
19*04fd306cSNickeau    /**
20*04fd306cSNickeau     * @var bool
21*04fd306cSNickeau     */
22*04fd306cSNickeau    protected $isW3cCompliant;
23*04fd306cSNickeau
24*04fd306cSNickeau    public function __construct(ExecuteMethod $executor, $isW3cCompliant = false)
25*04fd306cSNickeau    {
26*04fd306cSNickeau        $this->executor = $executor;
27*04fd306cSNickeau        $this->isW3cCompliant = $isW3cCompliant;
28*04fd306cSNickeau    }
29*04fd306cSNickeau
30*04fd306cSNickeau    /**
31*04fd306cSNickeau     * Add a specific cookie.
32*04fd306cSNickeau     *
33*04fd306cSNickeau     * @see Cookie for description of possible cookie properties
34*04fd306cSNickeau     * @param Cookie|array $cookie Cookie object. May be also created from array for compatibility reasons.
35*04fd306cSNickeau     * @return WebDriverOptions The current instance.
36*04fd306cSNickeau     */
37*04fd306cSNickeau    public function addCookie($cookie)
38*04fd306cSNickeau    {
39*04fd306cSNickeau        if (is_array($cookie)) { // @todo @deprecated remove in 2.0
40*04fd306cSNickeau            $cookie = Cookie::createFromArray($cookie);
41*04fd306cSNickeau        }
42*04fd306cSNickeau        if (!$cookie instanceof Cookie) {
43*04fd306cSNickeau            throw new InvalidArgumentException('Cookie must be set from instance of Cookie class or from array.');
44*04fd306cSNickeau        }
45*04fd306cSNickeau
46*04fd306cSNickeau        $this->executor->execute(
47*04fd306cSNickeau            DriverCommand::ADD_COOKIE,
48*04fd306cSNickeau            ['cookie' => $cookie->toArray()]
49*04fd306cSNickeau        );
50*04fd306cSNickeau
51*04fd306cSNickeau        return $this;
52*04fd306cSNickeau    }
53*04fd306cSNickeau
54*04fd306cSNickeau    /**
55*04fd306cSNickeau     * Delete all the cookies that are currently visible.
56*04fd306cSNickeau     *
57*04fd306cSNickeau     * @return WebDriverOptions The current instance.
58*04fd306cSNickeau     */
59*04fd306cSNickeau    public function deleteAllCookies()
60*04fd306cSNickeau    {
61*04fd306cSNickeau        $this->executor->execute(DriverCommand::DELETE_ALL_COOKIES);
62*04fd306cSNickeau
63*04fd306cSNickeau        return $this;
64*04fd306cSNickeau    }
65*04fd306cSNickeau
66*04fd306cSNickeau    /**
67*04fd306cSNickeau     * Delete the cookie with the given name.
68*04fd306cSNickeau     *
69*04fd306cSNickeau     * @param string $name
70*04fd306cSNickeau     * @return WebDriverOptions The current instance.
71*04fd306cSNickeau     */
72*04fd306cSNickeau    public function deleteCookieNamed($name)
73*04fd306cSNickeau    {
74*04fd306cSNickeau        $this->executor->execute(
75*04fd306cSNickeau            DriverCommand::DELETE_COOKIE,
76*04fd306cSNickeau            [':name' => $name]
77*04fd306cSNickeau        );
78*04fd306cSNickeau
79*04fd306cSNickeau        return $this;
80*04fd306cSNickeau    }
81*04fd306cSNickeau
82*04fd306cSNickeau    /**
83*04fd306cSNickeau     * Get the cookie with a given name.
84*04fd306cSNickeau     *
85*04fd306cSNickeau     * @param string $name
86*04fd306cSNickeau     * @throws NoSuchCookieException In W3C compliant mode if no cookie with the given name is present
87*04fd306cSNickeau     * @return Cookie|null The cookie, or null in JsonWire mode if no cookie with the given name is present
88*04fd306cSNickeau     */
89*04fd306cSNickeau    public function getCookieNamed($name)
90*04fd306cSNickeau    {
91*04fd306cSNickeau        if ($this->isW3cCompliant) {
92*04fd306cSNickeau            $cookieArray = $this->executor->execute(
93*04fd306cSNickeau                DriverCommand::GET_NAMED_COOKIE,
94*04fd306cSNickeau                [':name' => $name]
95*04fd306cSNickeau            );
96*04fd306cSNickeau
97*04fd306cSNickeau            if (!is_array($cookieArray)) { // Microsoft Edge returns null even in W3C mode => emulate proper behavior
98*04fd306cSNickeau                throw new NoSuchCookieException('no such cookie');
99*04fd306cSNickeau            }
100*04fd306cSNickeau
101*04fd306cSNickeau            return Cookie::createFromArray($cookieArray);
102*04fd306cSNickeau        }
103*04fd306cSNickeau
104*04fd306cSNickeau        $cookies = $this->getCookies();
105*04fd306cSNickeau        foreach ($cookies as $cookie) {
106*04fd306cSNickeau            if ($cookie['name'] === $name) {
107*04fd306cSNickeau                return $cookie;
108*04fd306cSNickeau            }
109*04fd306cSNickeau        }
110*04fd306cSNickeau
111*04fd306cSNickeau        return null;
112*04fd306cSNickeau    }
113*04fd306cSNickeau
114*04fd306cSNickeau    /**
115*04fd306cSNickeau     * Get all the cookies for the current domain.
116*04fd306cSNickeau     *
117*04fd306cSNickeau     * @return Cookie[] The array of cookies presented.
118*04fd306cSNickeau     */
119*04fd306cSNickeau    public function getCookies()
120*04fd306cSNickeau    {
121*04fd306cSNickeau        $cookieArrays = $this->executor->execute(DriverCommand::GET_ALL_COOKIES);
122*04fd306cSNickeau        if (!is_array($cookieArrays)) { // Microsoft Edge returns null if there are no cookies...
123*04fd306cSNickeau            return [];
124*04fd306cSNickeau        }
125*04fd306cSNickeau
126*04fd306cSNickeau        $cookies = [];
127*04fd306cSNickeau        foreach ($cookieArrays as $cookieArray) {
128*04fd306cSNickeau            $cookies[] = Cookie::createFromArray($cookieArray);
129*04fd306cSNickeau        }
130*04fd306cSNickeau
131*04fd306cSNickeau        return $cookies;
132*04fd306cSNickeau    }
133*04fd306cSNickeau
134*04fd306cSNickeau    /**
135*04fd306cSNickeau     * Return the interface for managing driver timeouts.
136*04fd306cSNickeau     *
137*04fd306cSNickeau     * @return WebDriverTimeouts
138*04fd306cSNickeau     */
139*04fd306cSNickeau    public function timeouts()
140*04fd306cSNickeau    {
141*04fd306cSNickeau        return new WebDriverTimeouts($this->executor, $this->isW3cCompliant);
142*04fd306cSNickeau    }
143*04fd306cSNickeau
144*04fd306cSNickeau    /**
145*04fd306cSNickeau     * An abstraction allowing the driver to manipulate the browser's window
146*04fd306cSNickeau     *
147*04fd306cSNickeau     * @return WebDriverWindow
148*04fd306cSNickeau     * @see WebDriverWindow
149*04fd306cSNickeau     */
150*04fd306cSNickeau    public function window()
151*04fd306cSNickeau    {
152*04fd306cSNickeau        return new WebDriverWindow($this->executor, $this->isW3cCompliant);
153*04fd306cSNickeau    }
154*04fd306cSNickeau
155*04fd306cSNickeau    /**
156*04fd306cSNickeau     * Get the log for a given log type. Log buffer is reset after each request.
157*04fd306cSNickeau     *
158*04fd306cSNickeau     * @param string $log_type The log type.
159*04fd306cSNickeau     * @return array The list of log entries.
160*04fd306cSNickeau     * @see https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#log-type
161*04fd306cSNickeau     */
162*04fd306cSNickeau    public function getLog($log_type)
163*04fd306cSNickeau    {
164*04fd306cSNickeau        return $this->executor->execute(
165*04fd306cSNickeau            DriverCommand::GET_LOG,
166*04fd306cSNickeau            ['type' => $log_type]
167*04fd306cSNickeau        );
168*04fd306cSNickeau    }
169*04fd306cSNickeau
170*04fd306cSNickeau    /**
171*04fd306cSNickeau     * Get available log types.
172*04fd306cSNickeau     *
173*04fd306cSNickeau     * @return array The list of available log types.
174*04fd306cSNickeau     * @see https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#log-type
175*04fd306cSNickeau     */
176*04fd306cSNickeau    public function getAvailableLogTypes()
177*04fd306cSNickeau    {
178*04fd306cSNickeau        return $this->executor->execute(DriverCommand::GET_AVAILABLE_LOG_TYPES);
179*04fd306cSNickeau    }
180*04fd306cSNickeau}
181