Introdução
Instalação
Guias
- Engine
- Profile
- Browser
- BrowserView
- Navegação
- Conteúdo
- DOM
- JavaScript
- Pop-ups
- Diálogos
- Downloads
- Extensões
- Rede
- Cache
- Cookies
- Proxy
- Autenticação
- Plugins
- Impressão
- Senhas
- Perfis de dados do Usuário
- Cartões de Crédito
- Mídia
- Área de transferência
- Zoom
- Corretor Ortográfico
- Implantação
- Chromium
Resolução de Problemas
Problemas frequentemente encontrados
Este guia descreve como solucionar problemas frequentemente encontrados.
Falha de início no Windows
Se o JxBrowser não iniciar no Windows, certifique-se de que o ambiente cumpre os requisitos do sistema e de que nenhum software antivírus interfere com ele.
O JxBrowser executa o Chromium num processo nativo separado. Por vezes, um software antivírus ou uma política de segurança local não permite que o processo nativo seja iniciado. Embora os arquivos executáveis do JxBrowser sejam assinados com uma assinatura válida e confiável, o software antivírus pode não permitir a execução de programas que não estejam na sua lista branca.
Se as ações acima não ajudarem, ative o logging, reproduza o problema e nos forneça as mensagens de log coletadas.
Falha no início no Linux
Se o JxBrowser não iniciar no Linux, certifique-se de que o ambiente atende aos requisitos do sistema e tem as bibliotecas do sistema necessárias.
Em algumas distribuições Linux, o processo do Chromium não pode ser iniciado devido à falta de sistema. Quando isto acontece, a biblioteca grava os detalhes nos logs.
Ative o logging e verifique se as mensagens de log contém erros como este:
java.lang.UnsatisfiedLinkError: /tmp/JxBrowser/VERSION/libbrowsercore_toolkit.so:
libgobject-2.0.so.0: cannot open shared object file: No such file or directory
Para resolver este problema, instale as bibliotecas em falta.
Se não ajudar, ative o logging, reproduza o problema e nos forneça as mensagens de log coletadas e o nome e a versão da sua distribuição Linux.
Início lento
O tempo de início depende do ambiente, do desempenho do hardware e do software antivírus instalado.
O processo de início do JxBrowser é composto por várias etapas. Primeiro, ele extrai os binários do Chromium armazenados em arquivos JAR. Em seguida, ele lança o processo principal do Chromium e estabelece a ligação entre Java e os processos do Chromium.
Normalmente, a extração dos binários do Chromium ocorre apenas uma vez no ambiente. Este passo pode atenuar consideravelmente o início. Por exemplo, demora mais ~3 segundos na máquina i7/16GB RAM/512GB SSD. Saiba como pular este passo aqui.
O software antivírus pode verificar os binários da biblioteca antes de permitir que o JxBrowser os inicie. Isto afeta negativamente o tempo de início. Tente desativar o antivírus e veja se isso ajuda.
Se não ajudar, ative o logging, reproduza o problema e nos forneça as mensagens de log coletadas e os detalhes sobre o seu hardware.
Falha no processo do Chromium
O JxBrowser executa o Chromium num processo nativo separado. Um erro neste processo pode levar a um encerramento inesperado do processo. Quando isto acontece, a biblioteca gera um ou vários arquivos de despejo de falhas. Estes arquivos são essenciais para compreender a causa da falha.
Se o processo do Chromium for encerrado inesperadamente e você receber o evento
EngineCrashed
, então
por favor reporte o problema e anexe o(s) arquivo(s) de despejo de falha gerado(s).
Congelamento na aplicação Java
Se a sua aplicação Java for suspensa e você acredita que isso acontece devido ao JxBrowser, siga estes passos:
- Ative o logging.
- Reproduza o problema.
- Faça um despejo de thread quando a aplicação estiver congelada.
- Reporte o problema e anexe o despejo do thread coletado e as mensagens de log.
O vídeo não é reproduzido
O formato do vídeo que está tentando reproduzir pode não ser suportado pelo JxBrowser. Consulte a lista de formatos de vídeo e áudio suportados.
Se um dos formatos de vídeo suportados não for reproduzido, reporte um problema.
JMenu sobreposto
No modo de renderização Hardware Acelerado,
BrowserView
irá sobrepor a barra de menu:
A razão deste problema está na mistura do menu pop-up lightweight com o BrowserView
heavyweight. Para resolver este problema,
desative o modo lightweight dos pop-ups Swing:
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
JPopupMenu.setDefaultLightWeightPopupEnabled(false)
Este código força todos os menus pop-up Swing a se tornarem heavyweight.
Utilizando o JxBrowser em Java 9+
Há casos em que o JxBrowser requer acesso a APIs não-públicas. No Java 9+, você deve conceder explicitamente este acesso ao JxBrowser. Nesta seção, enumeramos esses casos.
Incorporação no Swing
No modo de renderização HARWARE_ACCELERATED
no Windows e no Linux, a biblioteca usa a API interna do JDK para
atravessar corretamente o foco de entrada entre as janelas Java e Chromium.
Exportar o pacote necessário para o módulo sem nome se a sua aplicação for não modular:
--add-exports java.desktop/sun.awt=ALL-UNNAMED
Ou exportar o pacote necessário para os módulos JxBrowser se a aplicação for modular:
--add-exports java.desktop/sun.awt=jxbrowser.swing
Incorporação no JFXPanel
Se você incorporar o BrowserView
no JavaFX que está dentro de
JFXPanel,
a biblioteca exigirá acesso à API interna do JavaFX para obter o identificador nativo da janela do aplicativo.
Exporte os pacotes necessários para o módulo sem nome se a sua aplicação for não modular:
--add-opens javafx.swing/javafx.embed.swing=ALL-UNNAMED
--add-opens javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED
--add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED
--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED
Ou exportar os pacotes necessários para os módulos JxBrowser se a aplicação for modular:
--add-opens javafx.swing/javafx.embed.swing=jxbrowser
--add-opens javafx.graphics/com.sun.javafx.stage=jxbrowser
--add-exports javafx.graphics/com.sun.javafx.stage=jxbrowser
--add-exports javafx.controls/com.sun.javafx.scene.control=jxbrowser
Não é possível iniciar sessão na Conta Google
Uma tentativa de iniciar sessão na Conta Google pode dar origem à seguinte mensagem:
A razão deste problema pode ser a porta de depuração remota. Quando a porta está configurada, o Chromium bloqueia qualquer tentativa de iniciar sessão nos seus serviços (por exemplo, Gmail, YouTube).
Sem memória no Docker
Por padrão, o Docker executa um container com um espaço de memória compartilhada /dev/shm
de 64MB. Isto é muito pouco para o Chromium
e causará falhas durante a renderização das páginas.
Desde a versão 7.10, o JxBrowser utiliza /dev/shm
para armazenar bitmaps no modo de renderização fora da tela. Ele
aloca ~10MB adicionais (1080p) ou ~40MB (4k) para cada página web para armazenar os bitmaps.
Para resolver este problema, execute o container Docker com o comando docker run --shm-size=1gb
para aumentar o tamanho
de /dev/shm
.
Escolha a senha para o novo porta-chaves
No Linux, o Chromium pode criar um novo keyring e o sistema operacional irá mostrar esta caixa de diálogo:
Para evitar que isso aconteça, configure o Chromium para usar o armazenamento de senhas BASIC
em vez da senha do sistema:
var engine = Engine.newInstance(
EngineOptions.newBuilder(renderingMode)
.passwordStore(PasswordStore.BASIC)
.build());
val engine = Engine.newInstance(
EngineOptions.newBuilder(renderingMode)
.passwordStore(PasswordStore.BASIC)
.build())
ObjectClosedException
Objetos de serviço na biblioteca API podem ser encerrados.
Uma tentativa de chamar um objeto fechado leva a uma exceção ObjectClosedException
.
Neste guia, explicamos os cenários comuns em que um objeto de serviço pode ser encerrado e o que pode ser feito a esse respeito.
Motor fechado
O objeto de topo do JxBrowser é Engine. Há duas situações em que ele pode ser fechado:
- O método
Engine::close()
é chamado; - Ocorreu um erro no processo principal do Chromium.
Se você fechar um motor, todos os objetos associados a ele, tais como perfis, navegadores, frames, etc., serão fechados automaticamente. Assim, depois do motor ser encerrado, independentemente do motivo, certifique-se de que não utiliza nenhum dos objetos associados ao motor encerrado.
Se ocorrer um erro no processo principal do Chromium, o processo será terminado e o motor será fechado.
Quando isso acontece, a biblioteca gera arquivos de despejo de falhas e os salva num diretório específico.
Use o evento EngineCrashed
para ser notificado quando isso acontecer.
Neste caso, por favor, reporte o problema e anexe os arquivos de despejo de falhas.
Perfil excluído
Os perfis podem ser excluídos chamando o método
Profiles::delete()
.
Se você excluir um perfil, todos os objetos associados a ele, como o armazenamento de cookies, navegadores, frames, objetos DOM/JS, etc. são encerrados automaticamente. Assim, depois de excluir um perfil, certifique-se de que não utiliza nenhum dos objetos associados ao perfil excluído.
Navegador fechado
Existem duas situações em que o Browser
pode ser fechado:
- O método
Browser::close()
é chamado; - JavaScript fecha a janela.
Se você fechar um browser, todos os objetos associados a ele, como a navegação, o localizador de texto, os frames, o DOM/JS, etc., serão fechados automaticamente. Assim, depois do browser ser fechado, certifique-se de que não utiliza nenhum dos objetos associados ao browser fechado.
O método window.close()
no JavaScript só pode fechar
um navegador que foi aberto por outro script. Se você espera que isto aconteça, considere
checar o estado do browser antes de utilizá-lo.
Tenha em atenção que, quando o JavaScript fecha o browser, o Java o descobre com um ligeiro atraso. Se o browser já estiver
fechado mas o Java ainda não tiver sido notificado, a tentativa de utilizar o browser fechado levará à ObjectClosedException
.
Página Web descarregada
Cada página Web carregada tem um frame principal e frames secundários. Ao navegar para uma página Web, o browser descarrega a página anteriormente carregada e elimina todos os frames e objetos DOM/JS nela contidos.
Certifique-se de que não utiliza objetos DOM e JavaScript depois da página Web ser descarregada. Utilize os eventos de navegação para ser notificado.
Tenha em mente que o Java recebe eventos de navegação com um ligeiro atraso. Se a página já foi descarregada, mas o Java
ainda não foi notificado, a tentativa de utilizar objetos excluídos/fechados levará à ObjectClosedException
.
Processo de renderização terminado
No Chromium, os frames residem em processos de renderização. Quando o processo de renderização é terminado, o frame é eliminado. Quando o frame é eliminado, a página Web, os seus objetos DOM e JavaScript são eliminados e também são fechados.
Utilize o evento RenderProcessTerminated
para ser notificado quando o processo for encerrado. Se o processo for terminado inesperadamente, comunique o problema
e anexe os [arquivos de despejo de falhas] gerados (/docs/guides/troubleshooting/crash-dumps.html).
Se ele for terminado normalmente, não é necessário qualquer ação.