Scripts de Sessão
Um bloco de código Node.js que roda antes do script principal da etapa de Regra Customizada, com acesso direto à sessão do navegador, para ajustes de baixo nível que o script principal (sandboxed, via bm) não alcança.
O que é
Toda etapa de 🔢 Regra Customizada tem, além do script principal (Node.js, Python ou Projeto ZIP, veja Python e NodeJS), um segundo bloco de código independente: o Script de Sessão. Ele roda antes do script principal, sempre em Node.js, e sempre direto no processo do runtime, e não no ambiente isolado onde o script principal executa.
Essa diferença é o que importa: o script principal só enxerga a API bm (variáveis do processo, log, resultado). O Script de Sessão enxerga a sessão de navegador que a etapa está usando, a mesma página controlada pelo Puppeteer por trás da automação, e pode mexer nela diretamente: interceptar requisições de rede, bloquear diálogos nativos, injetar CSS/JS na página, ajustar timeouts de navegação. São coisas que o script principal, isolado, não tem como fazer.

Onde configurar
Na etapa de Regra Customizada, o painel Scripts de Sessão aparece logo abaixo de Variáveis do Fluxo, de Iterações de Listas e do Timer de Espera, e acima do bloco Código Customizado (o script principal). Quando a etapa já tem um Script de Sessão, o editor abre expandido. Sem script, ele fica recolhido: clique em ▼ Mostrar para abrir.
globalData.get('{nome}') o que elas definiram, sem precisar montar o valor por código. Veja Manipulação de Variáveis → Locais.
- É opcional e independente do script principal. Dá para usar só o Script de Sessão, sem nenhum script principal configurado, se o objetivo da etapa for puramente um ajuste de sessão (ex.: bloquear diálogos antes de uma etapa de navegação seguinte).
- Não precisa (e não tem como) chamar
bm.done(), porque não é essa API que está disponível aqui (veja O que está disponível). - Sempre Node.js 24, a mesma versão do script principal (veja Versões). Não existe opção de Python para o Script de Sessão, mesmo que o script principal da mesma etapa esteja em Python.
- Roda a cada execução da etapa: se a etapa está dentro de um Loop, o Script de Sessão roda em toda iteração, não só uma vez.
O que está disponível
O Script de Sessão recebe quatro referências prontas, diferentes das do script principal, então não misture as duas APIs:
| Referência | O que é |
|---|---|
sessionPage / position | A lista de páginas da sessão do Puppeteer e o índice da página atual. sessionPage[position] é a aba que a etapa está controlando. Dá acesso direto aos métodos do Puppeteer (.on(), .setRequestInterception(), .addStyleTag(), .evaluate(), .setDefaultTimeout() etc.). |
globalData | Variáveis do processo, lidas e escritas diretamente, com globalData.get('{var}') / globalData.set('{var}', valor). Note que não é bm.get()/bm.done(): aqui a leitura e a escrita acontecem na hora, sem precisar finalizar um resultado. |
bmLog(mensagem) | Grava uma mensagem nos logs oficiais da execução, o mesmo destino de bm.bmLog() no script principal, só que chamado sem o prefixo bm.. |
bm.get(...) ou bm.done(...) por hábito, mas essas referências não existem aqui. No Script de Sessão é globalData.get(...)/globalData.set(...) direto, e bmLog(...) sem o bm..
Scripts de Sessão × script principal
| Script de Sessão | Script principal | |
|---|---|---|
| Linguagem | Só Node.js | Node.js, Python ou Projeto ZIP |
| Ambiente | Direto no processo do runtime | Isolado (sandbox), via API bm |
| Acesso ao navegador | Sim, via sessionPage[position] (Puppeteer) | Não |
| Variáveis | globalData.get()/.set(), direto | bm.get() / bm.done() ao final |
| Quando roda | Antes do script principal, sempre | Depois do Script de Sessão, se configurado |
| Uso típico | Ajustes de página/sessão: bloquear diálogos, interceptar requests, CSS, timeouts | Lógica de negócio: parsing, cálculo, chamadas de API, geração de arquivo |
Erros de sintaxe e avisos
O Script de Sessão é conferido antes da execução, do mesmo jeito que o Script Inline: o editor sublinha a linha com o problema e mostra uma faixa com a descrição, e a etapa entra no indicador de pendências, na categoria Script com erro de sintaxe, o que esconde o botão de publicar até você corrigir. Salvar continua liberado.
Os mesmos dois níveis do Script Inline valem aqui: erro em vermelho (o script não roda, e vira pendência) e aviso em amarelo (o código é válido, mas algo vai falhar se a linha executar, como uma variável nunca declarada ou um texto que parece JSON e está quebrado). Veja a lista completa em Código Inline: Erros de sintaxe e avisos. Avisos não impedem publicar.
A conferência trata o código como o corpo de uma função assíncrona, que é como ele roda. Por isso await e return soltos no nível de cima valem aqui, ao contrário do Script Inline em Node.js.
require no Script de Sessão
Este script roda fora do módulo do runtime, então require('fs') e afins dão require is not defined. O que o Node oferece globalmente (Buffer, setTimeout, console) continua valendo. Para usar bibliotecas, ou ler e gravar arquivos, use o script principal (Inline ou Projeto). O editor avisa em amarelo quando encontra um require aqui.
sessionPage, position, globalData, bmLog, bm e process) já existem. Escrever const position = 1 ou let bmLog = ... repete o nome e o script não roda (já foi declarado). Escolha outro nome para as suas variáveis locais.
globalData.set('{nome}', valor) passa a aparecer nas listas de variáveis das etapas seguintes. O nome precisa estar entre chaves: globalData.set('nome', valor) grava uma chave que nenhum {nome} do fluxo enxerga, e por isso não entra na lista. Detalhes em Manipulação de Variáveis: Script.
Snippets prontos
O editor traz atalhos que preenchem o Script de Sessão com um ponto de partida. Clique no botão para carregar, depois ajuste.
Utilidades de dados e log
const _val = globalData.get('{minhaVariavel}');
await bmLog('{application_info} {minhaVariavel} = ' + _val);
const _agora = new Date().toLocaleString('pt-BR', { timeZone: 'America/Sao_Paulo' });
globalData.set('{dataHoraAtual}', _agora);
const _obj = JSON.parse(globalData.get('{varJson}') || '{}');
globalData.set('{campoParsed}', _obj.campo ?? '');
O botão Marcadores de log (referência) só cola no editor a lista completa dos prefixos {application_*} como comentário, para consulta rápida. A referência oficial, com o significado de cada ícone, está em Logs Customizados.
Controle da página (Puppeteer)
sessionPage[position].on('dialog', async dialog => {
await dialog.dismiss(); // alert: ok | confirm: false | prompt: null
});
sessionPage[position].setDefaultNavigationTimeout(60000); // ms
sessionPage[position].setDefaultTimeout(60000);
await sessionPage[position].addStyleTag({
content: '*, *::before, *::after { transition: none !important; animation: none !important; }'
});
await sessionPage[position].setRequestInterception(true);
sessionPage[position].on('request', req => {
if (['image', 'stylesheet', 'font'].includes(req.resourceType())) {
req.abort();
} else {
req.continue();
}
});
sessionPage[position].on('request', req => {
console.log(`[REQ] ${req.method()} ${req.url()}`);
});
const valor = globalData.get('{minhaVariavel}');
await sessionPage[position].evaluate((v) => {
window.minhaVariavel = v;
}, valor);
