xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/Support/Events/EventFiringWebElement.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver\Support\Events;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\Exception\WebDriverException;
6*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverCoordinates;
7*04fd306cSNickeauuse Facebook\WebDriver\Internal\WebDriverLocatable;
8*04fd306cSNickeauuse Facebook\WebDriver\WebDriverBy;
9*04fd306cSNickeauuse Facebook\WebDriver\WebDriverDimension;
10*04fd306cSNickeauuse Facebook\WebDriver\WebDriverDispatcher;
11*04fd306cSNickeauuse Facebook\WebDriver\WebDriverElement;
12*04fd306cSNickeauuse Facebook\WebDriver\WebDriverPoint;
13*04fd306cSNickeau
14*04fd306cSNickeauclass EventFiringWebElement implements WebDriverElement, WebDriverLocatable
15*04fd306cSNickeau{
16*04fd306cSNickeau    /**
17*04fd306cSNickeau     * @var WebDriverElement
18*04fd306cSNickeau     */
19*04fd306cSNickeau    protected $element;
20*04fd306cSNickeau    /**
21*04fd306cSNickeau     * @var WebDriverDispatcher
22*04fd306cSNickeau     */
23*04fd306cSNickeau    protected $dispatcher;
24*04fd306cSNickeau
25*04fd306cSNickeau    /**
26*04fd306cSNickeau     * @param WebDriverElement $element
27*04fd306cSNickeau     * @param WebDriverDispatcher $dispatcher
28*04fd306cSNickeau     */
29*04fd306cSNickeau    public function __construct(WebDriverElement $element, WebDriverDispatcher $dispatcher)
30*04fd306cSNickeau    {
31*04fd306cSNickeau        $this->element = $element;
32*04fd306cSNickeau        $this->dispatcher = $dispatcher;
33*04fd306cSNickeau    }
34*04fd306cSNickeau
35*04fd306cSNickeau    /**
36*04fd306cSNickeau     * @return WebDriverDispatcher
37*04fd306cSNickeau     */
38*04fd306cSNickeau    public function getDispatcher()
39*04fd306cSNickeau    {
40*04fd306cSNickeau        return $this->dispatcher;
41*04fd306cSNickeau    }
42*04fd306cSNickeau
43*04fd306cSNickeau    /**
44*04fd306cSNickeau     * @return WebDriverElement
45*04fd306cSNickeau     */
46*04fd306cSNickeau    public function getElement()
47*04fd306cSNickeau    {
48*04fd306cSNickeau        return $this->element;
49*04fd306cSNickeau    }
50*04fd306cSNickeau
51*04fd306cSNickeau    /**
52*04fd306cSNickeau     * @param mixed $value
53*04fd306cSNickeau     * @throws WebDriverException
54*04fd306cSNickeau     * @return $this
55*04fd306cSNickeau     */
56*04fd306cSNickeau    public function sendKeys($value)
57*04fd306cSNickeau    {
58*04fd306cSNickeau        $this->dispatch('beforeChangeValueOf', $this);
59*04fd306cSNickeau
60*04fd306cSNickeau        try {
61*04fd306cSNickeau            $this->element->sendKeys($value);
62*04fd306cSNickeau        } catch (WebDriverException $exception) {
63*04fd306cSNickeau            $this->dispatchOnException($exception);
64*04fd306cSNickeau            throw $exception;
65*04fd306cSNickeau        }
66*04fd306cSNickeau        $this->dispatch('afterChangeValueOf', $this);
67*04fd306cSNickeau
68*04fd306cSNickeau        return $this;
69*04fd306cSNickeau    }
70*04fd306cSNickeau
71*04fd306cSNickeau    /**
72*04fd306cSNickeau     * @throws WebDriverException
73*04fd306cSNickeau     * @return $this
74*04fd306cSNickeau     */
75*04fd306cSNickeau    public function click()
76*04fd306cSNickeau    {
77*04fd306cSNickeau        $this->dispatch('beforeClickOn', $this);
78*04fd306cSNickeau
79*04fd306cSNickeau        try {
80*04fd306cSNickeau            $this->element->click();
81*04fd306cSNickeau        } catch (WebDriverException $exception) {
82*04fd306cSNickeau            $this->dispatchOnException($exception);
83*04fd306cSNickeau            throw $exception;
84*04fd306cSNickeau        }
85*04fd306cSNickeau        $this->dispatch('afterClickOn', $this);
86*04fd306cSNickeau
87*04fd306cSNickeau        return $this;
88*04fd306cSNickeau    }
89*04fd306cSNickeau
90*04fd306cSNickeau    /**
91*04fd306cSNickeau     * @param WebDriverBy $by
92*04fd306cSNickeau     * @throws WebDriverException
93*04fd306cSNickeau     * @return EventFiringWebElement
94*04fd306cSNickeau     */
95*04fd306cSNickeau    public function findElement(WebDriverBy $by)
96*04fd306cSNickeau    {
97*04fd306cSNickeau        $this->dispatch(
98*04fd306cSNickeau            'beforeFindBy',
99*04fd306cSNickeau            $by,
100*04fd306cSNickeau            $this,
101*04fd306cSNickeau            $this->dispatcher->getDefaultDriver()
102*04fd306cSNickeau        );
103*04fd306cSNickeau
104*04fd306cSNickeau        try {
105*04fd306cSNickeau            $element = $this->newElement($this->element->findElement($by));
106*04fd306cSNickeau        } catch (WebDriverException $exception) {
107*04fd306cSNickeau            $this->dispatchOnException($exception);
108*04fd306cSNickeau            throw $exception;
109*04fd306cSNickeau        }
110*04fd306cSNickeau
111*04fd306cSNickeau        $this->dispatch(
112*04fd306cSNickeau            'afterFindBy',
113*04fd306cSNickeau            $by,
114*04fd306cSNickeau            $this,
115*04fd306cSNickeau            $this->dispatcher->getDefaultDriver()
116*04fd306cSNickeau        );
117*04fd306cSNickeau
118*04fd306cSNickeau        return $element;
119*04fd306cSNickeau    }
120*04fd306cSNickeau
121*04fd306cSNickeau    /**
122*04fd306cSNickeau     * @param WebDriverBy $by
123*04fd306cSNickeau     * @throws WebDriverException
124*04fd306cSNickeau     * @return array
125*04fd306cSNickeau     */
126*04fd306cSNickeau    public function findElements(WebDriverBy $by)
127*04fd306cSNickeau    {
128*04fd306cSNickeau        $this->dispatch(
129*04fd306cSNickeau            'beforeFindBy',
130*04fd306cSNickeau            $by,
131*04fd306cSNickeau            $this,
132*04fd306cSNickeau            $this->dispatcher->getDefaultDriver()
133*04fd306cSNickeau        );
134*04fd306cSNickeau
135*04fd306cSNickeau        try {
136*04fd306cSNickeau            $elements = [];
137*04fd306cSNickeau            foreach ($this->element->findElements($by) as $element) {
138*04fd306cSNickeau                $elements[] = $this->newElement($element);
139*04fd306cSNickeau            }
140*04fd306cSNickeau        } catch (WebDriverException $exception) {
141*04fd306cSNickeau            $this->dispatchOnException($exception);
142*04fd306cSNickeau            throw $exception;
143*04fd306cSNickeau        }
144*04fd306cSNickeau        $this->dispatch(
145*04fd306cSNickeau            'afterFindBy',
146*04fd306cSNickeau            $by,
147*04fd306cSNickeau            $this,
148*04fd306cSNickeau            $this->dispatcher->getDefaultDriver()
149*04fd306cSNickeau        );
150*04fd306cSNickeau
151*04fd306cSNickeau        return $elements;
152*04fd306cSNickeau    }
153*04fd306cSNickeau
154*04fd306cSNickeau    /**
155*04fd306cSNickeau     * @throws WebDriverException
156*04fd306cSNickeau     * @return $this
157*04fd306cSNickeau     */
158*04fd306cSNickeau    public function clear()
159*04fd306cSNickeau    {
160*04fd306cSNickeau        try {
161*04fd306cSNickeau            $this->element->clear();
162*04fd306cSNickeau
163*04fd306cSNickeau            return $this;
164*04fd306cSNickeau        } catch (WebDriverException $exception) {
165*04fd306cSNickeau            $this->dispatchOnException($exception);
166*04fd306cSNickeau            throw $exception;
167*04fd306cSNickeau        }
168*04fd306cSNickeau    }
169*04fd306cSNickeau
170*04fd306cSNickeau    /**
171*04fd306cSNickeau     * @param string $attribute_name
172*04fd306cSNickeau     * @throws WebDriverException
173*04fd306cSNickeau     * @return string
174*04fd306cSNickeau     */
175*04fd306cSNickeau    public function getAttribute($attribute_name)
176*04fd306cSNickeau    {
177*04fd306cSNickeau        try {
178*04fd306cSNickeau            return $this->element->getAttribute($attribute_name);
179*04fd306cSNickeau        } catch (WebDriverException $exception) {
180*04fd306cSNickeau            $this->dispatchOnException($exception);
181*04fd306cSNickeau            throw $exception;
182*04fd306cSNickeau        }
183*04fd306cSNickeau    }
184*04fd306cSNickeau
185*04fd306cSNickeau    /**
186*04fd306cSNickeau     * @param string $css_property_name
187*04fd306cSNickeau     * @throws WebDriverException
188*04fd306cSNickeau     * @return string
189*04fd306cSNickeau     */
190*04fd306cSNickeau    public function getCSSValue($css_property_name)
191*04fd306cSNickeau    {
192*04fd306cSNickeau        try {
193*04fd306cSNickeau            return $this->element->getCSSValue($css_property_name);
194*04fd306cSNickeau        } catch (WebDriverException $exception) {
195*04fd306cSNickeau            $this->dispatchOnException($exception);
196*04fd306cSNickeau            throw $exception;
197*04fd306cSNickeau        }
198*04fd306cSNickeau    }
199*04fd306cSNickeau
200*04fd306cSNickeau    /**
201*04fd306cSNickeau     * @throws WebDriverException
202*04fd306cSNickeau     * @return WebDriverPoint
203*04fd306cSNickeau     */
204*04fd306cSNickeau    public function getLocation()
205*04fd306cSNickeau    {
206*04fd306cSNickeau        try {
207*04fd306cSNickeau            return $this->element->getLocation();
208*04fd306cSNickeau        } catch (WebDriverException $exception) {
209*04fd306cSNickeau            $this->dispatchOnException($exception);
210*04fd306cSNickeau            throw $exception;
211*04fd306cSNickeau        }
212*04fd306cSNickeau    }
213*04fd306cSNickeau
214*04fd306cSNickeau    /**
215*04fd306cSNickeau     * @throws WebDriverException
216*04fd306cSNickeau     * @return WebDriverPoint
217*04fd306cSNickeau     */
218*04fd306cSNickeau    public function getLocationOnScreenOnceScrolledIntoView()
219*04fd306cSNickeau    {
220*04fd306cSNickeau        try {
221*04fd306cSNickeau            return $this->element->getLocationOnScreenOnceScrolledIntoView();
222*04fd306cSNickeau        } catch (WebDriverException $exception) {
223*04fd306cSNickeau            $this->dispatchOnException($exception);
224*04fd306cSNickeau            throw $exception;
225*04fd306cSNickeau        }
226*04fd306cSNickeau    }
227*04fd306cSNickeau
228*04fd306cSNickeau    /**
229*04fd306cSNickeau     * @return WebDriverCoordinates
230*04fd306cSNickeau     */
231*04fd306cSNickeau    public function getCoordinates()
232*04fd306cSNickeau    {
233*04fd306cSNickeau        try {
234*04fd306cSNickeau            return $this->element->getCoordinates();
235*04fd306cSNickeau        } catch (WebDriverException $exception) {
236*04fd306cSNickeau            $this->dispatchOnException($exception);
237*04fd306cSNickeau            throw $exception;
238*04fd306cSNickeau        }
239*04fd306cSNickeau    }
240*04fd306cSNickeau
241*04fd306cSNickeau    /**
242*04fd306cSNickeau     * @throws WebDriverException
243*04fd306cSNickeau     * @return WebDriverDimension
244*04fd306cSNickeau     */
245*04fd306cSNickeau    public function getSize()
246*04fd306cSNickeau    {
247*04fd306cSNickeau        try {
248*04fd306cSNickeau            return $this->element->getSize();
249*04fd306cSNickeau        } catch (WebDriverException $exception) {
250*04fd306cSNickeau            $this->dispatchOnException($exception);
251*04fd306cSNickeau            throw $exception;
252*04fd306cSNickeau        }
253*04fd306cSNickeau    }
254*04fd306cSNickeau
255*04fd306cSNickeau    /**
256*04fd306cSNickeau     * @throws WebDriverException
257*04fd306cSNickeau     * @return string
258*04fd306cSNickeau     */
259*04fd306cSNickeau    public function getTagName()
260*04fd306cSNickeau    {
261*04fd306cSNickeau        try {
262*04fd306cSNickeau            return $this->element->getTagName();
263*04fd306cSNickeau        } catch (WebDriverException $exception) {
264*04fd306cSNickeau            $this->dispatchOnException($exception);
265*04fd306cSNickeau            throw $exception;
266*04fd306cSNickeau        }
267*04fd306cSNickeau    }
268*04fd306cSNickeau
269*04fd306cSNickeau    /**
270*04fd306cSNickeau     * @throws WebDriverException
271*04fd306cSNickeau     * @return string
272*04fd306cSNickeau     */
273*04fd306cSNickeau    public function getText()
274*04fd306cSNickeau    {
275*04fd306cSNickeau        try {
276*04fd306cSNickeau            return $this->element->getText();
277*04fd306cSNickeau        } catch (WebDriverException $exception) {
278*04fd306cSNickeau            $this->dispatchOnException($exception);
279*04fd306cSNickeau            throw $exception;
280*04fd306cSNickeau        }
281*04fd306cSNickeau    }
282*04fd306cSNickeau
283*04fd306cSNickeau    /**
284*04fd306cSNickeau     * @throws WebDriverException
285*04fd306cSNickeau     * @return bool
286*04fd306cSNickeau     */
287*04fd306cSNickeau    public function isDisplayed()
288*04fd306cSNickeau    {
289*04fd306cSNickeau        try {
290*04fd306cSNickeau            return $this->element->isDisplayed();
291*04fd306cSNickeau        } catch (WebDriverException $exception) {
292*04fd306cSNickeau            $this->dispatchOnException($exception);
293*04fd306cSNickeau            throw $exception;
294*04fd306cSNickeau        }
295*04fd306cSNickeau    }
296*04fd306cSNickeau
297*04fd306cSNickeau    /**
298*04fd306cSNickeau     * @throws WebDriverException
299*04fd306cSNickeau     * @return bool
300*04fd306cSNickeau     */
301*04fd306cSNickeau    public function isEnabled()
302*04fd306cSNickeau    {
303*04fd306cSNickeau        try {
304*04fd306cSNickeau            return $this->element->isEnabled();
305*04fd306cSNickeau        } catch (WebDriverException $exception) {
306*04fd306cSNickeau            $this->dispatchOnException($exception);
307*04fd306cSNickeau            throw $exception;
308*04fd306cSNickeau        }
309*04fd306cSNickeau    }
310*04fd306cSNickeau
311*04fd306cSNickeau    /**
312*04fd306cSNickeau     * @throws WebDriverException
313*04fd306cSNickeau     * @return bool
314*04fd306cSNickeau     */
315*04fd306cSNickeau    public function isSelected()
316*04fd306cSNickeau    {
317*04fd306cSNickeau        try {
318*04fd306cSNickeau            return $this->element->isSelected();
319*04fd306cSNickeau        } catch (WebDriverException $exception) {
320*04fd306cSNickeau            $this->dispatchOnException($exception);
321*04fd306cSNickeau            throw $exception;
322*04fd306cSNickeau        }
323*04fd306cSNickeau    }
324*04fd306cSNickeau
325*04fd306cSNickeau    /**
326*04fd306cSNickeau     * @throws WebDriverException
327*04fd306cSNickeau     * @return $this
328*04fd306cSNickeau     */
329*04fd306cSNickeau    public function submit()
330*04fd306cSNickeau    {
331*04fd306cSNickeau        try {
332*04fd306cSNickeau            $this->element->submit();
333*04fd306cSNickeau
334*04fd306cSNickeau            return $this;
335*04fd306cSNickeau        } catch (WebDriverException $exception) {
336*04fd306cSNickeau            $this->dispatchOnException($exception);
337*04fd306cSNickeau            throw $exception;
338*04fd306cSNickeau        }
339*04fd306cSNickeau    }
340*04fd306cSNickeau
341*04fd306cSNickeau    /**
342*04fd306cSNickeau     * @throws WebDriverException
343*04fd306cSNickeau     * @return string
344*04fd306cSNickeau     */
345*04fd306cSNickeau    public function getID()
346*04fd306cSNickeau    {
347*04fd306cSNickeau        try {
348*04fd306cSNickeau            return $this->element->getID();
349*04fd306cSNickeau        } catch (WebDriverException $exception) {
350*04fd306cSNickeau            $this->dispatchOnException($exception);
351*04fd306cSNickeau            throw $exception;
352*04fd306cSNickeau        }
353*04fd306cSNickeau    }
354*04fd306cSNickeau
355*04fd306cSNickeau    /**
356*04fd306cSNickeau     * Test if two element IDs refer to the same DOM element.
357*04fd306cSNickeau     *
358*04fd306cSNickeau     * @param WebDriverElement $other
359*04fd306cSNickeau     * @return bool
360*04fd306cSNickeau     */
361*04fd306cSNickeau    public function equals(WebDriverElement $other)
362*04fd306cSNickeau    {
363*04fd306cSNickeau        try {
364*04fd306cSNickeau            return $this->element->equals($other);
365*04fd306cSNickeau        } catch (WebDriverException $exception) {
366*04fd306cSNickeau            $this->dispatchOnException($exception);
367*04fd306cSNickeau            throw $exception;
368*04fd306cSNickeau        }
369*04fd306cSNickeau    }
370*04fd306cSNickeau
371*04fd306cSNickeau    /**
372*04fd306cSNickeau     * @param WebDriverException $exception
373*04fd306cSNickeau     */
374*04fd306cSNickeau    protected function dispatchOnException(WebDriverException $exception)
375*04fd306cSNickeau    {
376*04fd306cSNickeau        $this->dispatch(
377*04fd306cSNickeau            'onException',
378*04fd306cSNickeau            $exception,
379*04fd306cSNickeau            $this->dispatcher->getDefaultDriver()
380*04fd306cSNickeau        );
381*04fd306cSNickeau    }
382*04fd306cSNickeau
383*04fd306cSNickeau    /**
384*04fd306cSNickeau     * @param mixed $method
385*04fd306cSNickeau     * @param mixed ...$arguments
386*04fd306cSNickeau     */
387*04fd306cSNickeau    protected function dispatch($method, ...$arguments)
388*04fd306cSNickeau    {
389*04fd306cSNickeau        if (!$this->dispatcher) {
390*04fd306cSNickeau            return;
391*04fd306cSNickeau        }
392*04fd306cSNickeau
393*04fd306cSNickeau        $this->dispatcher->dispatch($method, $arguments);
394*04fd306cSNickeau    }
395*04fd306cSNickeau
396*04fd306cSNickeau    /**
397*04fd306cSNickeau     * @param WebDriverElement $element
398*04fd306cSNickeau     * @return static
399*04fd306cSNickeau     */
400*04fd306cSNickeau    protected function newElement(WebDriverElement $element)
401*04fd306cSNickeau    {
402*04fd306cSNickeau        return new static($element, $this->getDispatcher());
403*04fd306cSNickeau    }
404*04fd306cSNickeau}
405