11#!/usr/bin/env node
22'use strict' ;
33
4- var wd = require ( 'wd' ) ;
5- wd . configureHttp ( { timeout : 180000 } ) ; // 3 minutes
4+ const playwright = require ( 'playwright' ) ;
65
7- var selenium = require ( 'selenium-standalone' ) ;
86var querystring = require ( "querystring" ) ;
97
108var MochaSpecReporter = require ( 'mocha' ) . reporters . Spec ;
119
1210var devserver = require ( './dev-server.js' ) ;
1311
14- var testTimeout = 30 * 60 * 1000 ;
15-
16- var SELENIUM_VERSION = process . env . SELENIUM_VERSION || '3.141.0' ;
17- var CHROME_BIN = process . env . CHROME_BIN ;
18- var FIREFOX_BIN = process . env . FIREFOX_BIN ;
19-
2012// BAIL=0 to disable bailing
2113var bail = process . env . BAIL !== '0' ;
2214
23- // process.env.CLIENT is a colon separated list of
24- // selenium:browserName:browserVerion:platform
25- var tmp = ( process . env . CLIENT || 'selenium:firefox' ) . split ( ':' ) ;
26- var client = {
27- runner : tmp [ 0 ] || 'selenium' ,
28- browser : tmp [ 1 ] || 'firefox' ,
29- version : tmp [ 2 ] || null , // Latest
30- platform : tmp [ 3 ] || null
31- } ;
15+ // Playwright BrowserType whitelist.
16+ // See: https://playwright.dev/docs/api/class-playwright
17+ const SUPPORTED_BROWSERS = [ 'chromium' , 'firefox' , 'webkit' ] ;
18+ const browserName = process . env . CLIENT || 'firefox' ;
19+ if ( ! SUPPORTED_BROWSERS . includes ( browserName ) ) {
20+ console . log ( `
21+ !!! Requested browser not supported: '${ browserName } '.
22+ !!! Available browsers: ${ SUPPORTED_BROWSERS . map ( b => `'${ b } '` ) . join ( ', ' ) }
23+ ` ) ;
24+ process . exit ( 1 ) ;
25+ }
3226
3327var testRoot = 'http://127.0.0.1:8000/tests/' ;
3428var testUrl ;
@@ -46,9 +40,6 @@ if (process.env.PERF) {
4640
4741var qs = { remote : 1 } ;
4842
49- var seleniumClient ;
50- var tunnelId = process . env . TRAVIS_JOB_NUMBER || 'tunnel-' + Date . now ( ) ;
51-
5243if ( process . env . INVERT ) {
5344 qs . invert = process . env . INVERT ;
5445}
@@ -86,36 +77,6 @@ if (process.env.ITERATIONS) {
8677testUrl += '?' ;
8778testUrl += querystring . stringify ( qs ) ;
8879
89- function testError ( e ) {
90- console . error ( e ) ;
91- console . error ( 'Doh, tests failed' ) ;
92-
93- closeClient ( function ( ) {
94- process . exit ( 3 ) ;
95- } ) ;
96- }
97-
98- function startSelenium ( callback ) {
99- // Start selenium
100- var opts = { version : SELENIUM_VERSION } ;
101- selenium . install ( opts , function ( err ) {
102- if ( err ) {
103- console . error ( 'Failed to install selenium' ) ;
104- process . exit ( 1 ) ;
105- }
106- selenium . start ( opts , function ( ) {
107- seleniumClient = wd . promiseChainRemote ( ) ;
108- callback ( ) ;
109- } ) ;
110- } ) ;
111- }
112-
113- function closeClient ( callback ) {
114- seleniumClient . quit ( ) . then ( function ( ) {
115- callback ( ) ;
116- } ) ;
117- }
118-
11980class RemoteRunner {
12081 constructor ( ) {
12182 this . handlers = { } ;
@@ -181,90 +142,60 @@ function BenchmarkReporter(runner) {
181142 } ) ;
182143}
183144
184- function startTest ( ) {
145+ async function startTest ( ) {
185146
186- console . log ( 'Starting' , client , 'on' , testUrl ) ;
147+ console . log ( 'Starting' , browserName , 'on' , testUrl ) ;
187148
188- var opts = {
189- browserName : client . browser ,
190- version : client . version ,
191- platform : client . platform ,
192- tunnelTimeout : testTimeout ,
193- name : client . browser + ' - ' + tunnelId ,
194- 'max-duration' : 60 * 45 ,
195- 'command-timeout' : 599 ,
196- 'idle-timeout' : 599 ,
197- 'tunnel-identifier' : tunnelId
198- } ;
199- if ( CHROME_BIN ) {
200- opts . chromeOptions = {
201- binary : CHROME_BIN ,
202- args : [ '--headless' , '--disable-gpu' , '--no-sandbox' , '--disable-setuid-sandbox' ]
203- } ;
204- }
205- if ( FIREFOX_BIN ) {
206- opts . firefox_binary = FIREFOX_BIN ;
207- }
208-
209- var runner = new RemoteRunner ( ) ;
149+ const runner = new RemoteRunner ( ) ;
210150 new MochaSpecReporter ( runner ) ;
211151 new BenchmarkReporter ( runner ) ;
212152
213- seleniumClient . init ( opts , function ( err ) {
214- if ( err ) {
215- testError ( err ) ;
216- return ;
217- }
218- console . log ( 'Initialized' ) ;
153+ const options = {
154+ headless : true ,
155+ } ;
156+ const browser = await playwright [ browserName ] . launch ( options ) ;
157+ const page = await browser . newPage ( ) ;
158+ if ( process . env . BROWSER_CONSOLE ) {
159+ page . on ( 'console' , message => {
160+ const { url, lineNumber } = message . location ( ) ;
161+ console . log ( 'BROWSER' , message . type ( ) . toUpperCase ( ) , `${ url } :${ lineNumber } ` , message . text ( ) ) ;
162+ } ) ;
163+ }
164+ await page . goto ( testUrl ) ;
165+
166+ const userAgent = await page . evaluate ( 'navigator.userAgent' ) ;
167+ console . log ( 'Testing on:' , userAgent ) ;
168+
169+ const interval = setInterval ( async ( ) => {
170+ try {
171+ const events = await page . evaluate ( 'window.testEvents()' ) ;
172+ runner . handleEvents ( events ) ;
173+
174+ if ( runner . completed || ( runner . failed && bail ) ) {
175+ if ( ! runner . completed && runner . failed ) {
176+ try {
177+ runner . bail ( ) ;
178+ } catch ( e ) {
179+ // Temporary debugging of bailing failure
180+ console . log ( 'An error occurred while bailing:' ) ;
181+ console . log ( e ) ;
182+ }
183+ }
219184
220- seleniumClient . get ( testUrl , function ( err ) {
221- if ( err ) {
222- testError ( err ) ;
223- return ;
185+ clearInterval ( interval ) ;
186+ await browser . close ( ) ;
187+ process . exit ( ! process . env . PERF && runner . failed ? 1 : 0 ) ;
224188 }
225- console . log ( 'Successfully started' ) ;
226-
227- seleniumClient . eval ( 'navigator.userAgent' , function ( err , userAgent ) {
228- if ( err ) {
229- testError ( err ) ;
230- } else {
231- console . log ( 'Testing on:' , userAgent ) ;
232-
233- var interval = setInterval ( function ( ) {
234- seleniumClient . eval ( 'window.testEvents()' , function ( err , events ) {
235- if ( err ) {
236- clearInterval ( interval ) ;
237- testError ( err ) ;
238- } else if ( events ) {
239- runner . handleEvents ( events ) ;
240-
241- if ( runner . completed || ( runner . failed && bail ) ) {
242- if ( ! runner . completed && runner . failed ) {
243- try {
244- runner . bail ( ) ;
245- } catch ( e ) {
246- // Temporary debugging of bailing failure
247- console . log ( 'An error occurred while bailing:' ) ;
248- console . log ( e ) ;
249- }
250- }
251-
252- clearInterval ( interval ) ;
253-
254- closeClient ( function ( ) {
255- process . exit ( ! process . env . PERF && runner . failed ? 1 : 0 ) ;
256- } ) ;
257- }
258- }
259- } ) ;
260- } , 10 * 1000 ) ;
189+ } catch ( e ) {
190+ console . error ( 'Tests failed:' , e ) ;
261191
262- }
263- } ) ;
264- } ) ;
265- } ) ;
192+ clearInterval ( interval ) ;
193+ await browser . close ( ) ;
194+ process . exit ( 3 ) ;
195+ }
196+ } , 1000 ) ;
266197}
267198
268199devserver . start ( function ( ) {
269- startSelenium ( startTest ) ;
200+ startTest ( ) ;
270201} ) ;
0 commit comments