puppeteer-extra-plugin-stealth
Version:
Stealth mode: Applies various techniques to make detection of headless puppeteer harder.
72 lines (64 loc) • 1.92 kB
JavaScript
const test = require('ava')
const { vanillaPuppeteer, addExtra } = require('../../test/util')
const Plugin = require('.')
/* global chrome */
test('stealth: will add convincing chrome.app object', async t => {
const puppeteer = addExtra(vanillaPuppeteer).use(Plugin({}))
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
const results = await page.evaluate(() => {
const catchErr = (fn, ...args) => {
try {
return fn.apply(this, args)
} catch ({ name, message, stack }) {
return { name, message, stack }
}
}
return {
app: {
exists: window.chrome && 'app' in window.chrome,
toString: chrome.app.toString(),
deepToString: chrome.app.runningState.toString()
},
data: {
getIsInstalled: chrome.app.getIsInstalled(),
runningState: chrome.app.runningState(),
getDetails: chrome.app.getDetails(),
InstallState: chrome.app.InstallState,
RunningState: chrome.app.RunningState
},
errors: {
getIsInstalled: catchErr(chrome.app.getDetails, 'foo').message,
stackOK: !catchErr(chrome.app.getDetails, 'foo').stack.includes(
'at getDetails'
)
}
}
})
t.deepEqual(results, {
app: {
exists: true,
toString: '[object Object]',
deepToString: 'function getDetails() { [native code] }'
},
data: {
InstallState: {
DISABLED: 'disabled',
INSTALLED: 'installed',
NOT_INSTALLED: 'not_installed'
},
RunningState: {
CANNOT_RUN: 'cannot_run',
READY_TO_RUN: 'ready_to_run',
RUNNING: 'running'
},
getDetails: null,
getIsInstalled: false,
runningState: 'cannot_run'
},
errors: {
getIsInstalled: 'Error in invocation of app.getDetails()',
stackOK: true
}
})
})