puppeteer-extra-plugin-stealth
Version:
Stealth mode: Applies various techniques to make detection of headless puppeteer harder.
106 lines (92 loc) • 2.82 kB
JavaScript
/* global Notification */
const test = require('ava')
const {
getVanillaFingerPrint,
getStealthFingerPrint
} = require('../../test/util')
const { vanillaPuppeteer, addExtra } = require('../../test/util')
const Plugin = require('.')
test('vanilla: is prompt', async t => {
const { permissions } = await getVanillaFingerPrint()
t.deepEqual(permissions, {
permission: 'denied',
state: 'prompt' // this is WRONG behavior, it's "denied" in headful!
})
})
test('stealth: is denied', async t => {
const { permissions } = await getStealthFingerPrint(Plugin)
t.deepEqual(permissions, {
permission: 'denied',
state: 'denied' // this is FIXED behavior, it's "denied" in headful!
})
})
async function getNotificationPermission() {
const { state, onchange } = await navigator.permissions.query({
name: 'notifications'
})
return {
state,
onchange,
permission: Notification.permission
}
}
test('vanilla headful: as expected', async t => {
const puppeteer = addExtra(vanillaPuppeteer)
const browser = await puppeteer.launch({ headless: false })
const page = await browser.newPage()
const result = await page.evaluate(getNotificationPermission)
t.deepEqual(result, {
state: 'denied',
onchange: null,
permission: 'denied'
})
await page.goto('https://example.com', {
waitUntil: 'domcontentloaded'
})
const result2 = await page.evaluate(getNotificationPermission)
t.deepEqual(result2, {
state: 'prompt',
onchange: null,
permission: 'default'
})
})
test('vanilla headless: as expected', async t => {
const puppeteer = addExtra(vanillaPuppeteer)
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
const result = await page.evaluate(getNotificationPermission)
t.deepEqual(result, {
state: 'prompt', // should be denied
onchange: null,
permission: 'denied'
})
await page.goto('https://example.com', {
waitUntil: 'domcontentloaded'
})
const result2 = await page.evaluate(getNotificationPermission)
t.deepEqual(result2, {
state: 'prompt',
onchange: null,
permission: 'denied' // should be default
})
})
test('stealth headless: as vanilla headful', async t => {
const puppeteer = addExtra(vanillaPuppeteer).use(Plugin())
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
const result = await page.evaluate(getNotificationPermission)
t.deepEqual(result, {
state: 'denied',
onchange: null,
permission: 'denied'
})
await page.goto('https://example.com', {
waitUntil: 'domcontentloaded'
})
const result2 = await page.evaluate(getNotificationPermission)
t.deepEqual(result2, {
state: 'prompt',
onchange: null,
permission: 'default'
})
})