Completed
Push — develop ( 7c60a0...5a505b )
by Carlo
8s
created

Spinner::spinAndPress()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 7
rs 9.4285
nc 1
cc 1
eloc 5
nop 2
1
<?php
2
3
namespace Magefix\Plugin;
4
5
/**
6
 * Class Spinner
7
 *
8
 * Provide "waiting" functionality to contexts
9
 *
10
 * @package Magefix\Plugin
11
 * @author  Carlo Tasca <[email protected]>
12
 */
13
trait Spinner
14
{
15
    /**
16
     * @param $lambda
17
     * @param int $wait
18
     * @return bool
19
     * @throws \Exception
20
     */
21
    public function spin($lambda, $wait = 60)
22
    {
23
        for ($i = 0; $i < $wait; $i++) {
24
            try {
25
                if ($lambda($this)) {
26
                    return true;
27
                }
28
            } catch (\Exception $e) {
29
                // do nothing
30
            }
31
32
            sleep(1);
33
        }
34
35
        $this->_throwBacktraceException();
36
    }
37
38
    /**
39
     * Spin until element is visible. Default timeout is 60 seconds.
40
     *
41
     * @param string $element
42
     * @param int $wait
43
     */
44
    public function spinUntilVisible($element, $wait = 60)
45
    {
46
        $this->spin(function($context) use ($element) {
47
            return $context->getElement($element)->isVisible();
48
        }, $wait);
49
    }
50
51
    /**
52
     * Spin until element is not visible. Default timeout is 60 seconds.
53
     *
54
     * @param string $element
55
     * @param int $wait
56
     */
57
    public function spinUntilInvisible($element, $wait = 60)
58
    {
59
        $this->spin(function($context) use ($element) {
60
            return ($context->getElement($element)->isVisible() == false);
61
        }, $wait);
62
    }
63
64
    /**
65
     * Spin and click element. Default timeout is 60 seconds.
66
     *
67
     * @param string $element
68
     * @param int $wait
69
     */
70
    public function spinAndClick($element, $wait = 60)
71
    {
72
        $this->spin(function($context) use ($element) {
73
            $context->getElement($element)->click();
74
            return true;
75
        }, $wait);
76
    }
77
78
    /**
79
     * Spin and press element. Default timeout is 60 seconds.
80
     *
81
     * @param string $element
82
     * @param int $wait
83
     */
84
    public function spinAndPress($element, $wait = 60)
85
    {
86
        $this->spin(function($context) use ($element) {
87
            $context->getElement($element)->press();
88
            return true;
89
        }, $wait);
90
    }
91
92
    /**
93
     * @throws \Exception
94
     */
95
    protected function _throwBacktraceException()
96
    {
97
        $backtrace = debug_backtrace();
98
99
        throw new \Exception(
100
            "Timeout thrown by " . $backtrace[1]['class'] . "::" . $backtrace[1]['function'] . "()\n" .
101
            $backtrace[1]['file'] . ", line " . $backtrace[1]['line']
102
        );
103
    }
104
}
105