Skip to content

Commit e62cbd9

Browse files
committed
Getting the next driver before the current is done
1 parent 3b1b13c commit e62cbd9

File tree

1 file changed

+153
-122
lines changed

1 file changed

+153
-122
lines changed

test/index.js

Lines changed: 153 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,22 @@ const getSupportsClientHints = ({ browser, browser_version }) => {
9696
);
9797
};
9898

99-
// 300000 ms = 5 minutes
100-
const getDriverWithTimeout = (capabilitiesRaw, { timeout = 300000 } = {}) =>
99+
const getDriverOptions = (browser) => {
100+
const driverOptions = { ...BS_CAPABILITIES, ...browser };
101+
102+
const timezoneSupport = setTimezoneSupport(browser);
103+
if (timezoneSupport) {
104+
driverOptions["browserstack.timezone"] = "Amsterdam";
105+
}
106+
107+
return driverOptions;
108+
};
109+
110+
// 180000 ms = 3 minutes
111+
const getDriverWithTimeout = (capabilitiesRaw, { timeout = 180000 } = {}) =>
101112
new Promise((resolve) => {
102113
// Clean up capabilities
103-
const capabilities = { ...capabilitiesRaw };
114+
const capabilities = getDriverOptions(capabilitiesRaw);
104115
delete capabilities.supportsSendBeacon;
105116
delete capabilities.supportsPushState;
106117
delete capabilities.supportsClientHints;
@@ -109,7 +120,14 @@ const getDriverWithTimeout = (capabilitiesRaw, { timeout = 300000 } = {}) =>
109120
const start = Date.now();
110121
let responded = false;
111122

123+
log(`getDriverWithTimeout start: ${capabilities.name} ${new Date()}`);
124+
112125
const response = (message) => {
126+
log(
127+
`getDriverWithTimeout response: ${
128+
capabilities.name
129+
} (${message}) ${new Date()}`
130+
);
113131
if (message instanceof Error) {
114132
log(message);
115133
return resolve(message);
@@ -177,6 +195,7 @@ const getDeviceName = ({
177195
.slice(0, testLimit);
178196

179197
log("Testing", browsers.length, "browsers:");
198+
180199
browsers.map((browser) => {
181200
const name = getDeviceName(browser);
182201
const seleniumVersion = getSeleniumVersion(browser);
@@ -223,149 +242,161 @@ const getDeviceName = ({
223242
})
224243
);
225244

226-
for (const [index, browser] of browsers.entries()) {
227-
const total = browsers.length;
228-
const testName = `Testing ${browser.name} (${index + 1}/${total})`;
245+
const appendBrowserData = (browser) => {
246+
const selenium = getSeleniumVersion(browser);
247+
if (selenium) browser["browserstack.selenium_version"] = selenium;
229248

230-
const test = async function () {
231-
const seleniumVersion = getSeleniumVersion(browser);
232-
if (seleniumVersion) {
233-
browser["browserstack.selenium_version"] = seleniumVersion;
234-
}
249+
const appium = getAppiumVersion(browser);
250+
if (appium) browser["browserstack.appium_version"] = appium;
235251

236-
const appiumVersion = getAppiumVersion(browser);
237-
if (appiumVersion) {
238-
browser["browserstack.appium_version"] = appiumVersion;
239-
}
252+
browser.supportsSendBeacon = getSupportsSendBeacon(browser);
253+
browser.supportsPushState = getSupportsPushState(browser);
254+
browser.supportsClientHints = getSupportsClientHints(browser);
255+
browser.useLocalIp = browser.os === "ios";
240256

241-
browser.supportsSendBeacon = getSupportsSendBeacon(browser);
242-
browser.supportsPushState = getSupportsPushState(browser);
243-
browser.supportsClientHints = getSupportsClientHints(browser);
244-
browser.useLocalIp = browser.os === "ios";
257+
return browser;
258+
};
245259

246-
log(`Waiting to get ${browser.name}...`);
260+
let nextDriver = null;
247261

248-
const driverOptions = { ...BS_CAPABILITIES, ...browser };
262+
const test = async function (browser, nextBrowser) {
263+
browser = appendBrowserData(browser);
249264

250-
const timezoneSupport = setTimezoneSupport(browser);
251-
if (timezoneSupport) {
252-
driverOptions["browserstack.timezone"] = "Amsterdam";
253-
}
265+
let driver, backgroundDriver;
254266

255-
let driver = await getDriverWithTimeout(driverOptions, {
256-
timeout: 180000,
257-
});
267+
if (nextBrowser) {
268+
log(`Getting in background: ${nextBrowser.name}...`);
269+
nextBrowser = appendBrowserData(nextBrowser);
270+
backgroundDriver = getDriverWithTimeout(nextBrowser);
271+
}
258272

259-
// Try again with new device when driver is not available
260-
if (typeof driver?.get !== "function") {
261-
log(`Trying again`);
262-
driver = await getDriverWithTimeout(driverOptions, { timeout: 300000 });
273+
if (nextDriver) {
274+
log(`Reusing next driver...`);
275+
driver = await nextDriver;
276+
nextDriver = null;
277+
} else {
278+
log(`Waiting to get ${browser.name}...`);
279+
driver = await getDriverWithTimeout(browser);
280+
}
263281

264-
// Device seems unavailable so this test will fail
265-
if (typeof driver?.get !== "function") {
266-
expect(true, `Getting driver for ${browser.name}`).to.be.false;
267-
return;
268-
}
269-
}
282+
nextDriver = backgroundDriver;
283+
284+
// Try again with new device when driver is not available
285+
if (typeof driver?.get !== "function") {
286+
log(`Trying again`);
287+
driver = await getDriverWithTimeout(browser, { timeout: 300000 });
270288

271-
let commands = [];
272-
273-
if (browser.supportsSendBeacon) {
274-
commands = [
275-
{
276-
script: "/latest/latest.js",
277-
push: browser.supportsPushState,
278-
beacon: browser.supportsSendBeacon,
279-
allowparams: "project",
280-
},
281-
{ wait: "/script.js", amount: 1 },
282-
{ visit: "/empty" }, // Trigger sendBeacon
283-
{ wait: "/simple.gif", amount: 3 },
284-
{ wait: "/append" },
285-
];
286-
} else if (browser.supportsPushState) {
287-
commands = [
288-
{
289-
script: "/latest/latest.js",
290-
push: browser.supportsPushState,
291-
allowparams: "project",
292-
},
293-
{ wait: "/script.js", amount: 1 },
294-
{ wait: "/simple.gif", amount: 3 },
295-
];
296-
} else {
297-
commands = [
298-
{ script: "/latest/latest.js", allowparams: "project" },
299-
{ wait: "/script.js", amount: 2 },
300-
{
301-
wait: "/simple.gif",
302-
amount: 2,
303-
params: { body: { type: "pageview" } },
304-
timeout: browser.browser === "ie" ? 10000 : null,
305-
},
306-
];
289+
// Device seems unavailable so this test will fail
290+
if (typeof driver?.get !== "function") {
291+
expect(true, `Getting driver for ${browser.name}`).to.be.false;
292+
return;
307293
}
294+
}
308295

309-
// Empty global REQUESTS
310-
global.REQUESTS = [];
296+
let commands = [];
311297

312-
await navigate({
313-
...browser,
314-
commands,
315-
driver,
316-
});
298+
if (browser.supportsSendBeacon) {
299+
commands = [
300+
{
301+
script: "/latest/latest.js",
302+
push: browser.supportsPushState,
303+
beacon: browser.supportsSendBeacon,
304+
allowparams: "project",
305+
},
306+
{ wait: "/script.js", amount: 1 },
307+
{ visit: "/empty" }, // Trigger sendBeacon
308+
{ wait: "/simple.gif", amount: 3 },
309+
{ wait: "/append" },
310+
];
311+
} else if (browser.supportsPushState) {
312+
commands = [
313+
{
314+
script: "/latest/latest.js",
315+
push: browser.supportsPushState,
316+
allowparams: "project",
317+
},
318+
{ wait: "/script.js", amount: 1 },
319+
{ wait: "/simple.gif", amount: 3 },
320+
];
321+
} else {
322+
commands = [
323+
{ script: "/latest/latest.js", allowparams: "project" },
324+
{ wait: "/script.js", amount: 2 },
325+
{
326+
wait: "/simple.gif",
327+
amount: 2,
328+
params: { body: { type: "pageview" } },
329+
timeout: browser.browser === "ie" ? 10000 : null,
330+
},
331+
];
332+
}
317333

318-
// console.log(JSON.stringify(global.REQUESTS, null, 2));
334+
// Empty global REQUESTS
335+
global.REQUESTS = [];
319336

320-
if (browser.supportsSendBeacon) {
321-
log("Testing beacon");
322-
await require("./test-beacon")(browser);
323-
} else if (browser.supportsPushState) {
324-
log("Testing one beacon");
325-
await require("./test-one-beacon")(browser);
326-
}
337+
await navigate({
338+
...browser,
339+
commands,
340+
driver,
341+
});
327342

328-
if (browser.supportsPushState) {
329-
log("Testing push state");
330-
await require("./test-pushstate")(browser);
331-
} else {
332-
log("Testing no push state");
333-
await require("./test-no-pushstate")(browser);
334-
}
343+
// console.log(JSON.stringify(global.REQUESTS, null, 2));
335344

336-
if (browser.supportsClientHints) {
337-
log("We can't test client hints because they only work on https");
338-
}
345+
if (browser.supportsSendBeacon) {
346+
log("Testing beacon");
347+
await require("./test-beacon")(browser);
348+
} else if (browser.supportsPushState) {
349+
log("Testing one beacon");
350+
await require("./test-one-beacon")(browser);
351+
}
352+
353+
if (browser.supportsPushState) {
354+
log("Testing push state");
355+
await require("./test-pushstate")(browser);
356+
} else {
357+
log("Testing no push state");
358+
await require("./test-no-pushstate")(browser);
359+
}
339360

340-
log("Testing events");
361+
if (browser.supportsClientHints) {
362+
log("We can't test client hints because they only work on https");
363+
}
341364

342-
// Empty global REQUESTS
343-
global.REQUESTS = [];
365+
log("Testing events");
344366

345-
commands = [
346-
{ script: "/latest/hello.js", event: "-- event 123 &&" },
347-
{ wait: "/simple.gif", params: { body: { type: "event" } } },
348-
{ script: "/latest/hello.js", event: "function" },
349-
{ script: "/latest/hello.js", event: "metadata" },
350-
{
351-
wait: "/simple.gif",
352-
params: { body: { type: "event" } },
353-
amount: 3,
354-
},
355-
];
367+
// Empty global REQUESTS
368+
global.REQUESTS = [];
356369

357-
await navigate({
358-
...browser,
359-
commands,
360-
driver,
361-
});
370+
commands = [
371+
{ script: "/latest/hello.js", event: "-- event 123 &&" },
372+
{ wait: "/simple.gif", params: { body: { type: "event" } } },
373+
{ script: "/latest/hello.js", event: "function" },
374+
{ script: "/latest/hello.js", event: "metadata" },
375+
{
376+
wait: "/simple.gif",
377+
params: { body: { type: "event" } },
378+
amount: 3,
379+
},
380+
];
362381

363-
await require("./test-events")(browser);
382+
await navigate({
383+
...browser,
384+
commands,
385+
driver,
386+
});
364387

365-
await driver.quit();
366-
};
388+
await require("./test-events")(browser);
389+
390+
if (driver) await driver.quit();
391+
};
367392

368-
suiteInstance.addTest(new Mocha.Test(testName, test));
393+
for (const [index, browser] of browsers.entries()) {
394+
const total = browsers.length;
395+
const testName = `Testing ${browser.name} (${index + 1}/${total})`;
396+
const nextBrowser = browsers[index + 1];
397+
suiteInstance.addTest(
398+
new Mocha.Test(testName, () => test(browser, nextBrowser))
399+
);
369400
}
370401

371402
mochaInstance.run(async (amountFailures) => {

0 commit comments

Comments
 (0)