Pular para o conteúdo principal

CSP estrita

Uma página com CSP estrita (script-src 'self', sem 'unsafe-inline') bloqueia script inline. O motor roda nela, desde que entre pelo caminho certo.

Como injetarSob CSP estrita
page.addScriptTag({ path })lança: vira um script inline
page.evaluate(<texto do IIFE>)funciona
page.addInitScript({ path })funciona
<script src> servido da própria origemfunciona

Os nomes são os do Playwright, onde o comportamento foi provado. O fixture @pilutech/botai-playwright usa o evaluate de texto em cada frame e nunca o addScriptTag: ele passou com default-src 'none'; script-src 'self'.

O que lança​

O addScriptTag({ path }) lê o arquivo e o põe na página como script inline. A CSP bloqueia, e o Playwright lança:

page.addScriptTag: Executing inline script violates the following Content Security Policy directive 'script-src 'self''. Either the 'unsafe-inline' keyword, a hash ('sha256-…'), or a nonce ('nonce-...') is required to enable inline execution. The action has been blocked.

O hash muda com o texto injetado; o resto da mensagem é o mesmo.

O que funciona​

O texto do arquivo, por evaluate​

É o caminho que serve com ou sem CSP. Leia o arquivo uma vez e avalie o texto na página:

import { createRequire } from 'node:module'
import { readFileSync } from 'node:fs'

const TEXTO_DO_IIFE = readFileSync(
createRequire(import.meta.url).resolve(
'@pilutech/botai-core/navegador.iife.js',
),
'utf8',
)

await page.goto('http://localhost:3000/cadastro')
await page.evaluate(TEXTO_DO_IIFE)
const resultado = await page.evaluate(
({ pessoa, hoje }) =>
window.__botaiNavegador.preencher(document, pessoa, hoje, {
segundaPassada: true,
}),
{ pessoa, hoje },
)

Antes da página, por addInitScript​

O script entra em toda página que o page abrir depois, antes dos scripts do site:

await page.addInitScript({ path: IIFE })
await page.goto('http://localhost:3000/cadastro')

Um <script src> da própria origem​

Se o seu app serve o arquivo (copiado para a pasta pública, por exemplo), a CSP script-src 'self' o aceita:

await page.goto('http://localhost:3000/cadastro')
await page.addScriptTag({ url: '/botai.js' })

Nos três casos, a chamada depois é a mesma: window.__botaiNavegador.preencher(document, pessoa, hoje, opcoes). Veja O navegador.iife.js.

Para outras ferramentas, os caminhos equivalentes estão nas receitas de Integrações, sem teste.