UNPKG

puppeteer-extra-plugin-stealth

Version:

Stealth mode: Applies various techniques to make detection of headless puppeteer harder.

70 lines (58 loc) 2.13 kB
const test = require('ava') const { vanillaPuppeteer, addExtra } = require('../../test/util') const Plugin = require('.') test('vanilla: navigator.vendor is always Google Inc.', async t => { const browser = await vanillaPuppeteer.launch({ headless: true }) const page = await browser.newPage() const vendor = await page.evaluate(() => navigator.vendor) t.is(vendor, 'Google Inc.') }) test('stealth: navigator.vendor set to custom value', async t => { const puppeteer = addExtra(vanillaPuppeteer).use( Plugin({ vendor: 'Apple Computer, Inc.' }) ) const browser = await puppeteer.launch({ headless: true }) const page = await browser.newPage() const vendor = await page.evaluate(() => navigator.vendor) t.is(vendor, 'Apple Computer, Inc.') }) test('stealth: will not leak modifications', async t => { const puppeteer = addExtra(vanillaPuppeteer).use(Plugin()) const browser = await puppeteer.launch({ headless: true }) const page = await browser.newPage() const test1 = await page.evaluate( () => Object.getOwnPropertyDescriptor(navigator, 'vendor') // Must be undefined if native ) t.is(test1, undefined) const test2 = await page.evaluate( () => Object.getOwnPropertyNames(navigator) // Must be an empty array if native ) t.false(test2.includes('vendor')) }) test('stealth: does patch getters properly', 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 hasInvocationError = (() => { try { // eslint-disable-next-line dot-notation Object['seal'](Object.getPrototypeOf(navigator)['vendor']) return false } catch (err) { return true } })() return { hasInvocationError, toString: Object.getOwnPropertyDescriptor( Object.getPrototypeOf(navigator), 'vendor' ).get.toString() } }) t.deepEqual(results, { hasInvocationError: true, toString: 'function get vendor() { [native code] }' }) })