@@ -3,49 +3,151 @@ import EventEmitter from 'events'
3
3
4
4
class switchEnvironment extends EventEmitter {
5
5
command ( this : NightwatchBrowser , provider : string , returnWhenInitialized ?: boolean ) : NightwatchBrowser {
6
- this . api . useCss ( ) . waitForElementVisible ( '[data-id="settingsSelectEnvOptions"]' )
7
- . perform ( ( done ) => {
8
- this . api . isPresent ( { selector : `[data-id="selected-provider-${ provider } "]` , suppressNotFoundErrors : true , timeout : 5000 } , ( result ) => {
9
- if ( result . value ) {
6
+ const submenuLabels = [ 'Remix VM' , 'Browser extension' , 'Dev' ]
7
+
8
+ const clickAndMaybeWait = (
9
+ browser : NightwatchBrowser ,
10
+ cssSelector : string ,
11
+ providerName : string ,
12
+ shouldWait ?: boolean
13
+ ) => {
14
+ browser
15
+ . waitForElementVisible ( cssSelector , 10000 )
16
+ . click ( cssSelector )
17
+ . perform ( ( done ) => {
18
+ if ( shouldWait ) {
19
+ browser
20
+ . waitForElementVisible ( `[data-id="selected-provider-${ providerName } "]` , 15000 )
21
+ . perform ( ( ) => done ( ) )
22
+ } else {
10
23
done ( )
24
+ }
25
+ } )
26
+ }
27
+
28
+ const ensureDropdownClosed = ( browser : NightwatchBrowser ) => {
29
+ browser
30
+ . isVisible ( 'body .dropdown-menu.show' , ( open ) => {
31
+ if ( open . value ) browser . click ( '[data-id="settingsSelectEnvOptions"] button' )
32
+ } )
33
+ }
34
+
35
+ const waitForSelectedOrModal = (
36
+ browser : NightwatchBrowser ,
37
+ providerName : string ,
38
+ timeoutMs = 10000 ,
39
+ cb ?: ( ok : boolean ) => void
40
+ ) => {
41
+ const start = Date . now ( )
42
+ const poll = ( ) => {
43
+ browser . isPresent ( { selector : `[data-id="selected-provider-${ providerName } "]` , suppressNotFoundErrors : true , timeout : 0 } , ( selRes ) => {
44
+ if ( selRes . value ) return cb && cb ( true )
45
+ browser . isPresent ( { selector : `*[data-id="${ providerName } ModalDialogModalBody-react"]` , suppressNotFoundErrors : true , timeout : 0 } , ( modalBody ) => {
46
+ if ( modalBody . value ) return cb && cb ( true )
47
+ browser . isPresent ( { selector : `*[data-id="${ providerName } ModalDialogContainer-react"]` , suppressNotFoundErrors : true , timeout : 0 } , ( modalContainer ) => {
48
+ if ( modalContainer . value ) return cb && cb ( true )
49
+ if ( Date . now ( ) - start > timeoutMs ) return cb && cb ( false )
50
+ browser . pause ( 200 ) . perform ( poll )
51
+ } )
52
+ } )
53
+ } )
54
+ }
55
+ poll ( )
56
+ }
57
+
58
+ const tryHoverSubmenusAndClick = (
59
+ browser : NightwatchBrowser ,
60
+ labels : string [ ] ,
61
+ providerName : string ,
62
+ shouldWait : boolean ,
63
+ onDone : VoidFunction
64
+ ) => {
65
+ const tryOne = ( i : number ) => {
66
+ if ( i >= labels . length ) return onDone ( )
67
+ browser
68
+ . useXpath ( )
69
+ . isPresent ( {
70
+ selector : `//span[contains(@class,'dropdown-item') and normalize-space()='${ labels [ i ] } ']` ,
71
+ suppressNotFoundErrors : true ,
72
+ timeout : 0
73
+ } , ( present ) => {
74
+ if ( ! present . value ) {
75
+ browser . useCss ( )
76
+ return tryOne ( i + 1 )
77
+ }
78
+ browser
79
+ . moveToElement ( `//span[contains(@class,'dropdown-item') and normalize-space()='${ labels [ i ] } ']` , 5 , 5 )
80
+ . pause ( 250 )
81
+ . useCss ( )
82
+ . isPresent ( {
83
+ selector : `body .dropdown-menu.show [data-id="dropdown-item-${ providerName } "]` ,
84
+ suppressNotFoundErrors : true ,
85
+ timeout : 1000
86
+ } , ( inPortal ) => {
87
+ if ( inPortal . value ) {
88
+ clickAndMaybeWait ( browser , `body .dropdown-menu.show [data-id="dropdown-item-${ providerName } "]` , providerName , shouldWait )
89
+ onDone ( )
90
+ } else {
91
+ tryOne ( i + 1 )
92
+ }
93
+ } )
94
+ } )
95
+ }
96
+ tryOne ( 0 )
97
+ }
98
+
99
+ const attemptSelect = (
100
+ browser : NightwatchBrowser ,
101
+ providerName : string ,
102
+ shouldWait ?: boolean ,
103
+ onComplete ?: VoidFunction
104
+ ) => {
105
+ browser
106
+ . isPresent ( { selector : `[data-id="dropdown-item-${ providerName } "]` , suppressNotFoundErrors : true , timeout : 1500 } , ( topLevel ) => {
107
+ if ( topLevel . value ) {
108
+ clickAndMaybeWait ( browser , `[data-id="dropdown-item-${ providerName } "]` , providerName , shouldWait )
109
+ onComplete && browser . perform ( ( ) => onComplete ( ) )
11
110
} else {
12
- browser . perform ( ( ) => {
13
- this . api
14
- . click ( '[data-id="settingsSelectEnvOptions"] button' ) // open dropdown
15
- . isPresent ( { selector : `[data-id="dropdown-item-${ provider } "]` , suppressNotFoundErrors : true , timeout : 5000 } , ( result ) => {
16
- console . log ( result )
17
- this . api . click ( '[data-id="settingsSelectEnvOptions"] button' ) // close dropdown
18
- if ( ! result . value ) {
19
- this . api . pinGrid ( provider , true )
20
- . click ( '[data-id="settingsSelectEnvOptions"] button' )
21
- . waitForElementVisible ( `[data-id="dropdown-item-${ provider } "]` )
22
- . click ( `[data-id="dropdown-item-${ provider } "]` )
23
- . perform ( ( done ) => {
24
- if ( returnWhenInitialized ) {
25
- browser . waitForElementVisible ( `[data-id="selected-provider-${ provider } "]` ) . perform ( ( ) => done ( ) )
26
- } else {
27
- done ( )
28
- }
29
- } )
30
- . perform ( ( ) => done ( ) )
31
- } else {
32
- browser . click ( '[data-id="settingsSelectEnvOptions"] button' )
33
- . waitForElementVisible ( `[data-id="dropdown-item-${ provider } "]` )
34
- . click ( `[data-id="dropdown-item-${ provider } "]` )
35
- . perform ( ( done ) => {
36
- if ( returnWhenInitialized ) {
37
- browser . waitForElementVisible ( `[data-id="selected-provider-${ provider } "]` ) . perform ( ( ) => done ( ) )
38
- } else {
39
- done ( )
40
- }
41
- } )
42
- . perform ( ( ) => done ( ) )
43
- }
44
- } )
111
+ tryHoverSubmenusAndClick ( browser , submenuLabels , providerName , ! ! shouldWait , ( ) => {
112
+ onComplete && browser . perform ( ( ) => onComplete ( ) )
45
113
} )
46
114
}
47
115
} )
48
- } ) . perform ( ( ) => this . emit ( 'complete' ) )
116
+ }
117
+
118
+ this . api
119
+ . useCss ( )
120
+ . waitForElementVisible ( '[data-id="settingsSelectEnvOptions"]' , 10000 )
121
+ . perform ( ( done ) => {
122
+ this . api . isPresent ( { selector : `[data-id="selected-provider-${ provider } "]` , suppressNotFoundErrors : true , timeout : 1000 } , ( result ) => {
123
+ if ( result . value ) return done ( )
124
+
125
+ this . api . click ( '[data-id="settingsSelectEnvOptions"] button' )
126
+
127
+ attemptSelect ( this . api , provider , returnWhenInitialized , ( ) => {
128
+ waitForSelectedOrModal ( this . api , provider , 10000 , ( ok ) => {
129
+ if ( ok ) return done ( )
130
+
131
+ this . api . isPresent ( {
132
+ selector : `*[data-id="${ provider } ModalDialogContainer-react"]` ,
133
+ suppressNotFoundErrors : true ,
134
+ timeout : 0
135
+ } , ( hasModal ) => {
136
+ if ( ! hasModal . value ) {
137
+ ensureDropdownClosed ( this . api )
138
+ }
139
+ this . api
140
+ . pinGrid ( provider , true )
141
+ . click ( '[data-id="settingsSelectEnvOptions"] button' )
142
+ attemptSelect ( this . api , provider , returnWhenInitialized , ( ) => {
143
+ waitForSelectedOrModal ( this . api , provider , 10000 , ( ) => done ( ) )
144
+ } )
145
+ } )
146
+ } )
147
+ } )
148
+ } )
149
+ } )
150
+ . perform ( ( ) => this . emit ( 'complete' ) )
49
151
50
152
return this
51
153
}
0 commit comments