@@ -22,43 +22,83 @@ export interface Driver {
2222
2323 isActiveElement ( selector : string ) : Promise < boolean > ;
2424 getElements ( selector : string ) : Promise < APIElement [ ] > ;
25+ selectorExecute < P > ( selector : string , script : ( elements : HTMLElement [ ] , ...args : any [ ] ) => P , ...args : any [ ] ) : Promise < P > ;
2526}
2627
2728export class SpectronDriver implements Driver {
2829
29- constructor ( private spectronClient : SpectronClient ) { }
30+ constructor (
31+ private spectronClient : SpectronClient ,
32+ private verbose : boolean
33+ ) { }
3034
3135 keys ( keys : string [ ] ) : Promise < void > {
36+ if ( this . verbose ) {
37+ console . log ( '- keys:' , keys ) ;
38+ }
39+
3240 this . spectronClient . keys ( keys ) ;
3341 return Promise . resolve ( ) ;
3442 }
3543
3644 async click ( selector : string , xoffset ?: number | undefined , yoffset ?: number | undefined ) : Promise < void > {
45+ if ( this . verbose ) {
46+ console . log ( '- click:' , selector , xoffset , yoffset ) ;
47+ }
48+
3749 await this . spectronClient . leftClick ( selector , xoffset , yoffset ) ;
50+
51+ if ( this . verbose ) {
52+ console . log ( '- click DONE' ) ;
53+ }
3854 }
3955
4056 async doubleClick ( selector : string ) : Promise < void > {
57+ if ( this . verbose ) {
58+ console . log ( '- doubleClick:' , selector ) ;
59+ }
60+
4161 await this . spectronClient . doubleClick ( selector ) ;
4262 }
4363
4464 async move ( selector : string ) : Promise < void > {
65+ if ( this . verbose ) {
66+ console . log ( '- move:' , selector ) ;
67+ }
68+
4569 await this . spectronClient . moveToObject ( selector ) ;
4670 }
4771
4872 async setValue ( selector : string , text : string ) : Promise < void > {
73+ if ( this . verbose ) {
74+ console . log ( '- setValue:' , selector , text ) ;
75+ }
76+
4977 await this . spectronClient . setValue ( selector , text ) ;
5078 }
5179
5280 async getTitle ( ) : Promise < string > {
81+ if ( this . verbose ) {
82+ console . log ( '- getTitle' ) ;
83+ }
84+
5385 return await this . spectronClient . getTitle ( ) ;
5486 }
5587
5688 async isActiveElement ( selector : string ) : Promise < boolean > {
89+ if ( this . verbose ) {
90+ console . log ( '- isActiveElement:' , selector ) ;
91+ }
92+
5793 const result = await ( this . spectronClient . execute ( s => document . activeElement . matches ( s ) , selector ) as any as Promise < { value : boolean ; } > ) ;
5894 return result . value ;
5995 }
6096
6197 async getElements ( selector : string ) : Promise < APIElement [ ] > {
98+ if ( this . verbose ) {
99+ console . log ( '- getElements:' , selector ) ;
100+ }
101+
62102 const result = await ( this . spectronClient . execute ( selector => {
63103 const query = document . querySelectorAll ( selector ) ;
64104 const result : APIElement [ ] = [ ] ;
@@ -78,6 +118,15 @@ export class SpectronDriver implements Driver {
78118
79119 return result . value ;
80120 }
121+
122+ async selectorExecute < P > ( selector : string , script : ( elements : HTMLElement [ ] , ...args : any [ ] ) => P , ...args : any [ ] ) : Promise < P > {
123+ if ( this . verbose ) {
124+ console . log ( '- selectorExecute:' , selector ) ;
125+ }
126+
127+ let _script = ( element , script , ...args ) => script ( Array . isArray ( element ) ? element : [ element ] , ...args ) ;
128+ return this . spectronClient . selectorExecute ( selector , _script , script , ...args ) ;
129+ }
81130}
82131
83132export class API {
@@ -89,37 +138,42 @@ export class API {
89138 private driver : Driver ;
90139
91140 constructor (
92- private spectronClient : SpectronClient ,
141+ spectronClient : SpectronClient ,
93142 private screenCapturer : ScreenCapturer ,
94- waitTime : number
143+ waitTime : number ,
144+ verbose : boolean
95145 ) {
96- this . driver = new SpectronDriver ( spectronClient ) ;
146+ this . driver = new SpectronDriver ( spectronClient , verbose ) ;
97147 this . retryCount = ( waitTime * 1000 ) / this . retryDuration ;
98148 }
99149
100150 keys ( keys : string [ ] ) : Promise < void > {
101151 return this . driver . keys ( keys ) ;
102152 }
103153
104- async waitForTextContent ( selector : string , textContent ?: string , accept ?: ( result : string ) => boolean ) : Promise < string > {
154+ waitForTextContent ( selector : string , textContent ?: string , accept ?: ( result : string ) => boolean ) : Promise < string > {
105155 accept = accept ? accept : ( result => textContent !== void 0 ? textContent === result : ! ! result ) ;
106156 return this . waitFor ( ( ) => this . driver . getElements ( selector ) . then ( els => els [ 0 ] . textContent ) , s => accept ! ( typeof s === 'string' ? s : '' ) , `getTextContent with selector ${ selector } ` ) ;
107157 }
108158
109159 async waitAndClick ( selector : string , xoffset ?: number , yoffset ?: number ) : Promise < any > {
110- return this . waitFor ( ( ) => this . driver . click ( selector , xoffset , yoffset ) , ( ) => true , `click with selector ${ selector } ` ) ;
160+ await this . waitForElement ( selector ) ;
161+ return await this . driver . click ( selector , xoffset , yoffset ) ;
111162 }
112163
113- async waitAndDoubleClick ( selector : string , capture : boolean = true ) : Promise < any > {
114- return this . waitFor ( ( ) => this . driver . doubleClick ( selector ) , ( ) => true , `doubleClick with selector ${ selector } ` ) ;
164+ async waitAndDoubleClick ( selector : string ) : Promise < any > {
165+ await this . waitForElement ( selector ) ;
166+ return await this . driver . doubleClick ( selector ) ;
115167 }
116168
117169 async waitAndMove ( selector : string ) : Promise < any > {
118- return this . waitFor ( ( ) => this . driver . move ( selector ) , ( ) => true , `move to object with selector ${ selector } ` ) ;
170+ await this . waitForElement ( selector ) ;
171+ return await this . driver . move ( selector ) ;
119172 }
120173
121- async setValue ( selector : string , text : string , capture : boolean = true ) : Promise < any > {
122- return this . driver . setValue ( selector , text ) ;
174+ async setValue ( selector : string , text : string ) : Promise < any > {
175+ await this . waitForElement ( selector ) ;
176+ return await this . driver . setValue ( selector , text ) ;
123177 }
124178
125179 async doesElementExist ( selector : string ) : Promise < boolean > {
@@ -132,28 +186,24 @@ export class API {
132186 return elements . length ;
133187 }
134188
135- async waitForElements ( selector : string , accept : ( result : APIElement [ ] ) => boolean = result => result . length > 0 ) : Promise < APIElement [ ] > {
189+ waitForElements ( selector : string , accept : ( result : APIElement [ ] ) => boolean = result => result . length > 0 ) : Promise < APIElement [ ] > {
136190 return this . waitFor ( ( ) => this . driver . getElements ( selector ) , accept , `elements with selector ${ selector } ` ) as Promise < any > ;
137191 }
138192
139- async waitForElement ( selector : string , accept : ( result : APIElement | undefined ) => boolean = result => ! ! result ) : Promise < void > {
193+ waitForElement ( selector : string , accept : ( result : APIElement | undefined ) => boolean = result => ! ! result ) : Promise < void > {
140194 return this . waitFor ( ( ) => this . driver . getElements ( selector ) . then ( els => els [ 0 ] ) , accept , `element with selector ${ selector } ` ) as Promise < any > ;
141195 }
142196
143- async waitForActiveElement ( selector : string ) : Promise < any > {
197+ waitForActiveElement ( selector : string ) : Promise < any > {
144198 return this . waitFor ( ( ) => this . driver . isActiveElement ( selector ) , undefined , `wait for active element: ${ selector } ` ) ;
145199 }
146200
147- async getTitle ( ) : Promise < string > {
201+ getTitle ( ) : Promise < string > {
148202 return this . driver . getTitle ( ) ;
149203 }
150204
151- selectorExecute < P > (
152- selectors : string | string [ ] ,
153- script : ( elements : HTMLElement | HTMLElement [ ] , ...args : any [ ] ) => P ,
154- ...args : any [ ]
155- ) : Promise < P > {
156- return this . spectronClient . selectorExecute ( selectors , script , ...args ) ;
205+ selectorExecute < P > ( selector : string , script : ( elements : HTMLElement [ ] , ...args : any [ ] ) => P , ...args : any [ ] ) : Promise < P > {
206+ return this . driver . selectorExecute ( selector , script , ...args ) ;
157207 }
158208
159209 private running = false ;
0 commit comments