v2.0

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.

Painel Scripts de Sessão expandido, com os botões de snippets prontos e o editor de código
Scripts de Sessão: botões de snippets prontos acima, editor Node.js abaixo, aqui configurando bloqueio de imagens/fontes via interceptação de requisições.

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.

As variáveis da etapa já estão prontas As Variáveis do Fluxo da mesma etapa rodam antes do Script de Sessão, então ele lê com globalData.get('{nome}') o que elas definiram, sem precisar montar o valor por código. Veja Manipulação de Variáveis → Locais.

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ênciaO que é
sessionPage / positionA 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.).
globalDataVariá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..
Não é a mesma API do script principal É fácil escrever 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ãoScript principal
LinguagemSó Node.jsNode.js, Python ou Projeto ZIP
AmbienteDireto no processo do runtimeIsolado (sandbox), via API bm
Acesso ao navegadorSim, via sessionPage[position] (Puppeteer)Não
VariáveisglobalData.get()/.set(), diretobm.get() / bm.done() ao final
Quando rodaAntes do script principal, sempreDepois do Script de Sessão, se configurado
Uso típicoAjustes de página/sessão: bloquear diálogos, interceptar requests, CSS, timeoutsLó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.

Não existe 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.
Não declare de novo os nomes que o browserMate já entrega Os nomes que o script já recebe (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.
As variáveis que você grava aparecem nas listas Depois de salvar a etapa, o que o script grava com 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

Log de variável (bmLog)
const _val = globalData.get('{minhaVariavel}');
await bmLog('{application_info} {minhaVariavel} = ' + _val);
Data e hora atual (BR)
const _agora = new Date().toLocaleString('pt-BR', { timeZone: 'America/Sao_Paulo' });
globalData.set('{dataHoraAtual}', _agora);
Parsear JSON de variável
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)

Bloquear dialogs (alert/confirm/prompt)
sessionPage[position].on('dialog', async dialog => {
  await dialog.dismiss(); // alert: ok | confirm: false | prompt: null
});
Readequar timeout de navegação
sessionPage[position].setDefaultNavigationTimeout(60000); // ms
sessionPage[position].setDefaultTimeout(60000);
Desativar animações CSS
await sessionPage[position].addStyleTag({
  content: '*, *::before, *::after { transition: none !important; animation: none !important; }'
});
Bloquear imagens/fontes
await sessionPage[position].setRequestInterception(true);
sessionPage[position].on('request', req => {
  if (['image', 'stylesheet', 'font'].includes(req.resourceType())) {
    req.abort();
  } else {
    req.continue();
  }
});
Capturar requests (debug)
sessionPage[position].on('request', req => {
  console.log(`[REQ] ${req.method()} ${req.url()}`);
});
Injetar variável no window
const valor = globalData.get('{minhaVariavel}');
await sessionPage[position].evaluate((v) => {
  window.minhaVariavel = v;
}, valor);
Bloquear imagens/fontes acelera automações longas Em processos com muitas navegações, interceptar e abortar requisições de imagem/fonte/CSS reduz bastante o tempo de carregamento de página, o que é útil quando a etapa só precisa dos dados, não do visual. Combine com cuidado: se alguma etapa mais adiante depende de evidência fiel da tela, desative esse bloqueio antes dela.