cei-crawler: TimeoutError: waiting for function failed: timeout 30000ms exceeded

Opa, blz?

Antes de mais nada, parabéns pelo pacote, muito legal! Já consegui fazer o uso normal dos serviços, inclusive já obtive dados de uma carteira minha e de alguns amigos, porém, 1 amigo em específico está dando o seguinte erro:

Logging at CEI… Selecting institution 3 - XP INVESTIMENTOS CCTVM S/A (3) TimeoutError: waiting for function failed: timeout 30000ms exceeded at new WaitTask (/home/src/node_modules/puppeteer/lib/DOMWorld.js:549:28) at DOMWorld.waitForFunction (/home/src/node_modules/puppeteer/lib/DOMWorld.js:454:12) at Frame.waitForFunction (/home/src/node_modules/puppeteer/lib/FrameManager.js:657:28) at Page.waitForFunction (/home/src/node_modules/puppeteer/lib/Page.js:1141:29) at Function.getStockHistory (/home/src/app/lib/StockHistoryCrawler.js:103:24) at processTicksAndRejections (internal/process/task_queues.js:97:5) at async CeiCrawler.getStockHistory (/home/src/app/lib/CeiCrawler.js:111:16) at async /home/src/app/cei-process-new.js:50:36

Tentei dar uma olhada no que poderia ser, mas não encontrei nada que pudesse resolver. As options que estou utilizando:

            const ceiCrawlerOptions = {
                puppeteerLaunch: {
                    headless: true,
                    timeout: 0,
                    args: ['--no-sandbox']
                },
                trace: true,
                capEndDate: true
            };

O erro acontece na chamada de: let stockHistory = await ceiCrawler.getStockHistory();

Agradeço desde já qualquer ajuda, Abraço

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 21 (8 by maintainers)

Most upvoted comments

Pois é… Vou fechar a issue mas ela ta sempre no radar… Se aparecerem mais usuários reclamando desse comportamento a gente pode ver de endereçar ela… Se por um acaso seu amigo conseguir contatar a B3 e resolver tb, deixa o caminho das pedras aqui hehe

Valeuzão!

@matheusdalzot a opção navigationTimeout foi adicionada na versão 0.3.0… Se nao me engano vcs estavam utilizando uma versao mais antiga, n?

@damicothiago na verdade parece que temos um problema maior entao 😕 Eu ja to pegando a conta a partir daquela label. Só que esse erro aí, Cannot read rows of null, é porque o crawler nao esta encontrando a tabela de dividendos na pagina. To achando que o seletor dela é diferente quando a opcao Todos esta selecionada D: Tu consegue checar pra mim?

Em contas “normais” o seletor das páginas são esses: Dividendos: .responsive tbody Negociações: #ctl00_ContentPlaceHolder1_rptAgenteBolsa_ctl00_rptContaBolsa_ctl00_pnAtivosNegociados table tbody Carteira:

  • Ações: #ctl00_ContentPlaceHolder1_rptAgenteContaMercado_ctl00_rptContaMercado_ctl00_rprCarteira_ctl00_grdCarteira tbody
  • Tesouro direto: #ctl00_ContentPlaceHolder1_rptAgenteContaMercado_ctl00_rptContaMercado_ctl00_trBodyTesouroDireto tbody

Pelo jeito, nesse caso do seu amigo, esse seletor de negociacoes nao existe… =s

Edit: Pode ser tb que ele tenha uma corretora sem negociacao. Vi aqui que o código desse crawler nao tava null-safe. Subi mais um commit, ve se agora vai

Eita nois… O CEI é todo bugado mesmo -_- Sim, isso tem a ver. No Crawler eu ignoro a opção Todos justamente pra trazer discriminado qual operação é de qual conta… Vou ver se consigo implementar algo no sentido de “Se só tem a opcao Todos, traz ela” Aviso quando tiver no ar 👍

@damicothiago Parece que o erro foi na linha 103 do StockHistoryCrawler.js.

await page.waitForFunction((cachedAccount, select) => { const value = document.querySelector(select).value; return value != '0' && value != cachedAccount; }, {}, cachedAccount, PAGE.SELECT_ACCOUNT_OPTIONS);

Dando uma olhada na documentação do puppeteer o método waitForFunction tem seu próprio timeout definido de 30000ms. Ele recebe um parâmetro options que você pode passar um timeout maior, por algum motivo a função está demorando mais no caso desse seu outro amigo. Já tentou rodar com headless false? Para verificar o que está acontecendo durante o processo.

Colocando o headless como false, quando você executar o código vai ser aberta uma instância do Chromium e você vai poder ver exatamente o que o puppeteer está fazendo no tempo de execução.

@damicothiago dada toda essa situação velho, não acho que a gente deva tratar isso no crawler não. Me parece um corner case muito especifico pra gambiarrar e conseguir funcionar… A solução seria, por exemplo, tentar duas vezes cada clique pra ver se traz dados. Mas aí, todos usuarios que nao tem esse problema e realmente nao tem dados, vão sofrer problemas de performance por causa disso… Além claro, de dificultar o código em manutenção e evolução… Não existe nenhum canal da B3 pra talvez abrir um chamado/suporte e eles arrumarem essa bagunça na conta do seu amigo, n? rs

Putz! Que loucura cara. Esse CEI cada dia uma descoberta. @Menighin uma possibilidade para trazer a conta seria retirar desse campo de baixo. Esse “Todos” aparece somente em alguns casos? Pq aqui para mim não chega a ter essa opção.

@damicothiago consegue ver com ele se isso é só pra tela de Negociações? Ou a tela de Proventos e a de Carteira também tem esse comportamento?

Oi @damicothiago ! Isso que o @skepticaldev falou é tudo verdade e é uma boa maneira de investigar o problema.

Tenho também uma outra suspeita: Esse código basicamente espera que a lista de contas sejam carregadas na página de “Negociações” do CEI. Se vc entrar la e selecionar uma corretora no input de cima, vai ver que aparece a lista de contas dessa corretora no input de baixo.

Esse await aí estouraria caso não tenha nenhuma conta na corretora, o que acho que nao deveria acontecer. Talvez você possa confirmar isso com seu amigo. Vê com ele se na página de Negociações todas as corretoras dele possuem ao menos uma conta. Se alguma de fato não possuir, aí é um bug no código que eu nao esperava e posso ver como arrumar 👍