Skip to content

Commit 2dcb8a4

Browse files
authored
feat(selenium): add support for Safari Technology Preview (#25)
Usage: ``` jtr -b safari --safari-tp ```
1 parent 3b5ee7f commit 2dcb8a4

File tree

6 files changed

+56
-5
lines changed

6 files changed

+56
-5
lines changed

bin/command.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ program
5656
"If using BrowserStack, specify browsers using --browserstack. " +
5757
"Choices: " + browsers.join( ", " ) + ". Defaults to Chrome."
5858
)
59+
.option(
60+
"--safari-tp",
61+
"Use Safari Technology Preview instead of regular Safari. " +
62+
"Only works with --browser safari and cannot be used with --browserstack."
63+
)
5964
.option(
6065
"-m, --middleware <middlewares...>",
6166
"Add middleware to the test server by passing the path to a module that exports " +

browsers.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ export async function createBrowserWorker( url, browser, options, restarts = 0 )
4949
) }`
5050
);
5151
}
52-
const { browserstack, debug, headless, reportId, runId, tunnelId, verbose } = options;
52+
const {
53+
browserstack, debug, headless, reportId, runId, safariTp, tunnelId, verbose
54+
} = options;
55+
5356
while ( await maxWorkersReached( options ) ) {
5457
if ( verbose ) {
5558
console.log( "\nWaiting for available sessions..." );
@@ -90,6 +93,7 @@ export async function createBrowserWorker( url, browser, options, restarts = 0 )
9093
const driver = await createDriver( {
9194
browserName: browser.browser,
9295
headless,
96+
safariTp,
9397
url,
9498
verbose
9599
} );

lib/getBrowserString.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,19 @@ export function getBrowserString(
2525
os,
2626
os_version: osVersion
2727
},
28-
headless
28+
{
29+
headless = false,
30+
safariTp = false
31+
} = {}
2932
) {
3033
browser = browser.toLowerCase();
3134
browser = browserMap[ browser ] || browser;
35+
36+
// Handle Safari Technology Preview
37+
if ( safariTp && browser === "Safari" ) {
38+
browser = "Safari Technology Preview";
39+
}
40+
3241
let str = browser;
3342
if ( browserVersion ) {
3443
str += ` ${ browserVersion }`;

queue.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ export async function hardRetryTest( reportId, maxHardRetries ) {
7777
export function addRun( url, browser, options ) {
7878
queue.push( {
7979
browser,
80-
fullBrowser: getBrowserString( browser ),
80+
fullBrowser: getBrowserString( browser, {
81+
headless: options.headless,
82+
safariTp: options.safariTp
83+
} ),
8184
hardRetries: 0,
8285
id: options.reportId,
8386
url,

run.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export async function run( {
3434
retries = 0,
3535
run: runs = [],
3636
runId,
37+
safariTp,
3738
testUrl: testUrls = [],
3839
verbose
3940
} ) {
@@ -45,6 +46,11 @@ export async function run( {
4546
"Cannot run in headless mode and debug mode at the same time."
4647
);
4748
}
49+
if ( safariTp && browserstack ) {
50+
throw new Error(
51+
"Cannot use --safari-tp with --browserstack."
52+
);
53+
}
4854

4955
// Ensure baseUrl ends with a slash
5056
if ( !rendsWithSlash.test( baseUrl ) ) {
@@ -255,7 +261,7 @@ export async function run( {
255261
}
256262

257263
function queueRun( browser, { run, testUrl } = {} ) {
258-
const fullBrowser = getBrowserString( browser, headless );
264+
const fullBrowser = getBrowserString( browser, { headless, safariTp } );
259265
const reportId = generateHash(
260266
`${ hashValue }-${ run }-${ testUrl }-${ fullBrowser }`
261267
);
@@ -287,6 +293,7 @@ export async function run( {
287293
headless,
288294
run,
289295
reportId,
296+
safariTp,
290297
testUrl,
291298
tunnelId,
292299
verbose

selenium/createDriver.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@ import { Builder, Capabilities, logging } from "selenium-webdriver";
22
import Chrome from "selenium-webdriver/chrome.js";
33
import Edge from "selenium-webdriver/edge.js";
44
import Firefox from "selenium-webdriver/firefox.js";
5+
import Safari from "selenium-webdriver/safari.js";
56
import IE from "selenium-webdriver/ie.js";
67
import { browserSupportsHeadless } from "../lib/getBrowserString.js";
78

89
// Set script timeout to 10min
910
const DRIVER_SCRIPT_TIMEOUT = 1000 * 60 * 10;
1011

11-
export default async function createDriver( { browserName, headless, url, verbose } ) {
12+
export default async function createDriver( {
13+
browserName, url,
14+
headless = false,
15+
verbose = false,
16+
safariTp = false
17+
} ) {
18+
1219
const capabilities = Capabilities[ browserName ]();
1320

1421
// Support: IE 11+
@@ -55,6 +62,21 @@ export default async function createDriver( { browserName, headless, url, verbos
5562
edgeOptions.setEdgeChromiumBinaryPath( process.env.EDGE_BIN );
5663
}
5764

65+
const safariOptions = new Safari.Options();
66+
67+
// Use Safari Technology Preview if --safari-tp flag is provided
68+
if ( safariTp ) {
69+
if ( verbose ) {
70+
console.log( "Using Safari Technology Preview" );
71+
}
72+
safariOptions.setTechnologyPreview( true );
73+
74+
// Without it, we're getting an error:
75+
// SessionNotCreatedError: Could not create a session: Browser name does
76+
// not match (requested: safari; available: Safari Technology Preview)
77+
safariOptions.set( "browserName", "Safari Technology Preview" );
78+
}
79+
5880
const ieOptions = new IE.Options();
5981
ieOptions.setEdgeChromium( true );
6082
ieOptions.setEdgePath( "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe" );
@@ -96,6 +118,7 @@ export default async function createDriver( { browserName, headless, url, verbos
96118
.setChromeOptions( chromeOptions )
97119
.setFirefoxOptions( firefoxOptions )
98120
.setEdgeOptions( edgeOptions )
121+
.setSafariOptions( safariOptions )
99122
.setIeOptions( ieOptions );
100123

101124
if ( ieService ) {

0 commit comments

Comments
 (0)