[BUG]browserType.connect: WebSocket error: certificate has expired when running in pipeline
See original GitHub issueContext:
-
Playwright Version: 1.20.0
-
Operating System: [Linux Docker]
-
Browser: All
-
Extra:Only fails when running a drone.io pipeline
Code Snippet
browserType.connect: WebSocket error: certificate has expired
=========================== logs ===========================
<ws connecting> wss://cdp.browserstack.com/playwright?caps=%7B%22browser%22%3A%22chrome%22%2C%22os%22%3A%22OSX%22%2C%22os_version%22%3A%22Big%20Sur%22%2C%22name%22%3A%22Authentication%3A%20Should%20go%20to%20forgot%20password%20page%20if%20link%20clicked%22%2C%22build%22%3A%22Get%20My%20Boat%20Full%20Regression%20Test%2011%2F04%2F2022%22%2C%22project%22%3A%22Get%20My%20Boat%20Web%20Tests%22%2C%22browserstack.username%22%3A%22adambethlehem_AGClxt%22%2C%22browserstack.accessKey%22%3A%22D5mRrTaKgHPzpsvhVXAL%22%2C%22browserstack.local%22%3Afalse%2C%22client.playwrightVersion%22%3A%221.20.0%22%2C%22browserstack.networkLogs%22%3Atrue%2C%22browserstack.debug%22%3Atrue%2C%22browserstack.console%22%3A%22verbose%22%2C%22browser_version%22%3A%22latest%22%7D
<ws error> [object Object]
<ws connect error> wss://cdp.browserstack.com/playwright?caps=%7B%22browser%22%3A%22chrome%22%2C%22os%22%3A%22OSX%22%2C%22os_version%22%3A%22Big%20Sur%22%2C%22name%22%3A%22Authentication%3A%20Should%20go%20to%20forgot%20password%20page%20if%20link%20clicked%22%2C%22build%22%3A%22Get%20My%20Boat%20Full%20Regression%20Test%2011%2F04%2F2022%22%2C%22project%22%3A%22Get%20My%20Boat%20Web%20Tests%22%2C%22browserstack.username%22%3A%22000000000%22%2C%22browserstack.accessKey%22%3A%0000000000000000%22%2C%22browserstack.local%22%3Afalse%2C%22client.playwrightVersion%22%3A%221.20.0%22%2C%22browserstack.networkLogs%22%3Atrue%2C%22browserstack.debug%22%3Atrue%2C%22browserstack.console%22%3A%22verbose%22%2C%22browser_version%22%3A%22latest%22%7D certificate has expired
<ws disconnected> wss://cdp.browserstack.com/playwright?caps=%7B%22browser%22%3A%22chrome%22%2C%22os%22%3A%22OSX%22%2C%22os_version%22%3A%22Big%20Sur%22%2C%22name%22%3A%22Authentication%3A%20Should%20go%20to%20forgot%20password%20page%20if%20link%20clicked%22%2C%22build%22%3A%22Get%20My%20Boat%20Full%20Regression%20Test%2011%2F04%2F2022%22%2C%22project%22%3A%22Get%20My%20Boat%20Web%20Tests%22%2C%22browserstack.username%22%3A%22adambethlehem_AGClxt%22%2C%22browserstack.accessKey%22%3A%22D5mRrTaKgHPzpsvhVXAL%22%2C%22browserstack.local%22%3Afalse%2C%22client.playwrightVersion%22%3A%221.20.0%22%2C%22browserstack.networkLogs%22%3Atrue%2C%22browserstack.debug%22%3Atrue%2C%22browserstack.console%22%3A%22verbose%22%2C%22browser_version%22%3A%22latest%22%7D code=1006 reason=
============================================================
at Object.page [as fn] (/drone/src/fixtures.js:64:50)`
Description The test run fine when hitting browserstack from my local machine, when running in drone, I am experiencing certificate errors
fixture.js
const base = require('@playwright/test');
const cp = require('child_process');
const clientPlaywrightVersion = cp
.execSync('npx playwright --version')
.toString()
.trim()
.split(' ')[1];
const BrowserStackLocal = require('browserstack-local');
var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = dd + '/' + mm + '/' + yyyy;
// BrowserStack Specific Capabilities.
const caps = {
browser: 'chrome',
os: 'osx',
os_version: 'catalina',
name: 'My first playwright test',
build: 'Get My Boat Full Regression Test ' + today,
project: 'Get My Boat Web Tests',
'browserstack.username': process.env.BROWSERSTACK_USERNAME || 'USERNAME',
'browserstack.accessKey': process.env.BROWSERSTACK_ACCESS_KEY || 'ACCESS_KEY',
'browserstack.local': process.env.BROWSERSTACK_LOCAL || false,
'client.playwrightVersion': clientPlaywrightVersion,
'browserstack.networkLogs': true,
'browserstack.debug': true,
'browserstack.console': 'verbose'
};
exports.bsLocal = new BrowserStackLocal.Local();
// replace YOUR_ACCESS_KEY with your key. You can also set an environment variable - "BROWSERSTACK_ACCESS_KEY".
exports.BS_LOCAL_ARGS = {
key: process.env.BROWSERSTACK_ACCESS_KEY || 'YOUR_ACCESS_KEY',
};
// Patching the capabilities dynamically according to the project name.
const patchCaps = (name, title) => {
let combination = name.split(/@browserstack/)[0];
let [browserCaps, osCaps] = combination.split(/:/);
let [browser, browser_version] = browserCaps.split(/@/);
let osCapsSplit = osCaps.split(/ /);
let os = osCapsSplit.shift();
let os_version = osCapsSplit.join(' ');
caps.browser = browser ? browser : 'chrome';
caps.browser_version = browser_version ? browser_version : 'latest';
caps.os = os ? os : 'osx';
caps.os_version = os_version ? os_version : 'catalina';
caps.name = title;
};
const isHash = (entity) => Boolean(entity && typeof(entity) === "object" && !Array.isArray(entity));
const nestedKeyValue = (hash, keys) => keys.reduce((hash, key) => (isHash(hash) ? hash[key] : undefined), hash);
exports.test = base.test.extend({
page: async ({ page, playwright, context }, use, testInfo) => {
// Use BrowserStack Launched Browser according to capabilities for cross-browser testing.
if (testInfo.project.name.match(/browserstack/)) {
patchCaps(testInfo.project.name, `${testInfo.title}`);
const vBrowser = await playwright.chromium.connect({
wsEndpoint:
`wss://cdp.browserstack.com/playwright?caps=` +
`${encodeURIComponent(JSON.stringify(caps))}`,
});
context = await vBrowser.newContext({
storageState: "cookies/banner.json",
viewport: {width:1900, height: 940}
});
const vPage = await context.newPage(testInfo.project.use);
await vPage.goto('url');
await use(vPage);
const testResult = {
action: 'setSessionStatus',
arguments: {
status: testInfo.status,
reason: nestedKeyValue(testInfo, ['error', 'message'])
},
};
await vPage.evaluate(() => {},
`browserstack_executor: ${JSON.stringify(testResult)}`);
await vPage.close();
await vBrowser.close();
} else {
use(page);
}
},
});
exports.testOwner = base.test.extend({
page: async ({ page, playwright, context }, use, testInfo) => {
// Use BrowserStack Launched Browser according to capabilities for cross-browser testing.
if (testInfo.project.name.match(/browserstack/)) {
patchCaps(testInfo.project.name, `${testInfo.title}`);
const vBrowser = await playwright.chromium.connect({
wsEndpoint:
`wss://cdp.browserstack.com/playwright?caps=` +
`${encodeURIComponent(JSON.stringify(caps))}`,
});
context = await vBrowser.newContext({
storageState: "cookies/owner_cookie.json",
viewport: {width:1900, height: 940}
});
const vPage = await context.newPage(testInfo.project.use);
await vPage.goto(url);
await use(vPage);
const testResult = {
action: 'setSessionStatus',
arguments: {
status: testInfo.status,
reason: nestedKeyValue(testInfo, ['error', 'message'])
},
};
await vPage.evaluate(() => {},
`browserstack_executor: ${JSON.stringify(testResult)}`);
await vPage.close();
await vBrowser.close();
} else {
use(page);
}
},
});
exports.testRenter = base.test.extend({
page: async ({ page, playwright, context }, use, testInfo) => {
// Use BrowserStack Launched Browser according to capabilities for cross-browser testing.
if (testInfo.project.name.match(/browserstack/)) {
patchCaps(testInfo.project.name, `${testInfo.title}`);
const vBrowser = await playwright.chromium.connect({
wsEndpoint:
`wss://cdp.browserstack.com/playwright?caps=` +
`${encodeURIComponent(JSON.stringify(caps))}`,
});
context = await vBrowser.newContext({
storageState: "cookies/renter_cookie.json",
viewport: {width:1900, height: 940}
});
const vPage = await context.newPage(testInfo.project.use);
await vPage.goto(url);
await use(vPage);
const testResult = {
action: 'setSessionStatus',
arguments: {
status: testInfo.status,
reason: nestedKeyValue(testInfo, ['error', 'message'])
},
};
await vPage.evaluate(() => {},
`browserstack_executor: ${JSON.stringify(testResult)}`);
await vPage.close();
await vBrowser.close();
} else {
use(page);
}
},
});`
CONFIG
`// playwright.config.js
// @ts-check
const { devices } = require('@playwright/test');
/** @type {import('@playwright/test').PlaywrightTestConfig} */
const config = {
testDir: 'test',
testMatch: '**/*.test.ts',
timeout: 120000, //Playwright Test enforces a timeout for each testP
actionTimeout: 5000,
navigationTimeout: 5000,
expect: {timeout:5000},
workers:1,
globalSetup: require.resolve('./global-setup-staging'),
use:{
extraHTTPHeaders: {
"User-Agent": "'AGENT'"
},
baseURL: url,
ignoreHTTPSErrors: false,
httpCredentials: { username: 'username', password: 'password', }
},
projects: [
// -- BrowserStack Projects --
// name should be of the format browser@browser_version:os os_version@browserstack
{
name: 'chrome@latest:Windows 10@browserstack',
use: {
browserName: 'chromium',
channel: 'chrome',
},
},
// {
// name: 'chrome@latest:Windows 10@browserstack',
// use: {
// browserName: 'chromium',
// channel: 'chrome',
// },
// },
{
name: 'chrome@latest:OSX Big Sur@browserstack',
use: {
browserName: 'chromium',
channel: 'chrome',
},
},
};
module.exports = config;
Add any other details about the problem here.
Issue Analytics
- State:
- Created a year ago
- Comments:7 (1 by maintainers)
Top Results From Across the Web
cannot establish websocket connection using ws.js due to ...
Now it is unable to establish connection with the server. I have listened to socket.on('error') and it now says Certificate has expired ....
Read more >javascript exception: error: certificate has expired
My connection with Parseur stopped working suddenly and received the above error message when testing the zap. I go to reconnect and I...
Read more >FAQ — websocket-client 1.4.2 documentation
What about Python 2 support? Why is this library slow? How to troubleshoot an unclear callback error? How to solve the “connection is...
Read more >Websocket stopped receiving data all of a sudden - Random
Websocket has been running for months fine. ... It is connecting, it is authenticating, no error messages - and no data.
Read more >CERT_HAS_EXPIRED issue on SonarQube - Sonar Community
I am facing same issue from Azure DevOps pipeline, ##[error][SQ] API GET ... DevOps SonarQube publish step fails: certificate has expired.
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
This is resolved from Browserstack
This was an outdated cert in the playwright docker image. updating to the latest docker image fixed the issue