Introdução
Instalação
Guias
- Engine
- Perfil
- Navegador
- BrowserView
- Navegação
- Conteúdo
- Menu de contexto
- DOM
- JavaScript
- Pop-ups
- Diálogos
- Downloads
- Extensões do Chrome
- Rede
- Cache
- Cookies
- Proxy
- Autenticação
- Permissões
- Plugins
- Impressão
- Senhas
- Perfis de dados do usuário
- Cartões de crédito
- Mídia
- Zoom
- Corretor ortográfico
- Implantação
- Chromium
Resolução de problemas
- Registro
- Exceções comuns
- A aplicação não termina
- O vídeo não é reproduzido
- Não é possível iniciar sessão na conta Google
- Os dados do usuário não são armazenados
- Esquema de cores
- Falha no início
- Início lento no Windows
- Aplicação .NET que não responde
- Encerramento inesperado do processo Chromium
- Comportamento inesperado
- Fim do suporte do Windows 7/8/8.1
Migração
Exceções Comuns
Este guia descreve as exceções comuns que podem ser lançadas quando se trabalha com a biblioteca DotNetBrowser.
Exceções de inicialização
Exceções de licença
Estas exceções são lançadas quando a verificação da licença falha por algum motivo.
NoLicenseException
é lançada quando a licença está em falta. Isso geralmente acontece quando nenhuma chave de licença é definida noEngineOptions
, e o DotNetBrowser não consegue localizar um arquivodotnetbrowser.license
contendo a chave de licença. Para resolver este caso, verifique se a licença foi adicionada ao projeto.InvalidLicenseException
é lançada quando a licença está configurada corretamente, mas a verificação da licença falha. O motivo exato da falha na verificação da licença é fornecido como mensagem de exceção. Por exemplo, esta exceção pode ser lançada quando a licença está expirada ou a ligação do produto na licença não corresponde a nenhum dos namespaces.
Por exemplo, uma das mensagens possíveis InvalidLicenseException
: Falha na verificação da licença do DotNetBrowser. Motivo: Esta versão do produto é incompatível com a licença.
Isso significa que a chave de licença especificada no projeto é incompatível com a versão do DotNetBrowser referenciada. É necessário certificar-se de que a chave correta e válida foi utilizada.
Caso contrário, não hesite em contatar a nossa equipa de vendas em sales@teamdev.com para obter a licença atualizada.
Exceções aos binários do Chromium
A ChromiumBinariesMissingException
é lançada quando o DotNetBrowser não consegue iniciar o engine Chromium vinculado porque os binários do Chromium estão em falta e não podem ser restaurados. O motivo real da exceção é fornecido como mensagem de exceção. Por exemplo, esta exceção pode ser lançada quando não são encontrados binários Chromium compatíveis na pasta Chromium binaries, e o DotNetBrowser não consegue encontrar um assembly que contenha os binários compatíveis.
Falha ao extrair os binários do Chromium no processo separado
Esta exceção é lançada quando os binários do Chromium foram encontrados na montagem, no entanto, houve um problema com a sua extração para a pasta de binários do Chromium.
Na maioria dos casos, a extração dos binários da DLL é efetuada através do GZipCompress.exe
, um utilitário que faz parte do DotNetBrowser. Este utilitário pode não conseguir extrair os binários por algum motivo. Por exemplo, se estiver bloqueado por uma aplicação de terceiros (antivírus ou firewall) ou se houver falta de permissões para esta operação. A seguinte mensagem de exceção é observada neste caso: Failed to extract the Chromium binaries in the separate process. GZipCompress.exe has exited with code <exit_code>
.
Quando esta exceção ocorre, o resultado detalhado do GZipCompress.exe
é escrita em DotNetBrowser logs. A análise dos registros ajuda geralmente a compreender a causa real da falha.
Outras exceções na inicialização do engine
A EngineInitializationException
é lançada quando algo corre mal durante a inicialização da instância IEngine
.
A pasta de dados do usuário já está sendo utilizada
Não é permitido criar duas ou mais instâncias do IEngine
que apontem para a mesma pasta de dados do usuário, mesmo que essas instâncias do IEngine
sejam criadas em processos .NET separados. Este caso de utilização não é suportado pelo próprio Chromium e conduz a um comportamento imprevisível e a falhas súbitas do engine.
Consequentemente, quando este caso é detectado, é lançada a EngineInitializationException
com a seguinte mensagem: The user data directory is already in use: <path><path>
Existem algumas soluções possíveis:
- Criar várias instâncias do
IBrowser
utilizando o mesmoIEngine
:IEngine engine = EngineFactory.Create(engineOptions); IBrowser browser1 = engine.CreateBrowser(); IBrowser browser2 = engine.CreateBrowser();
Dim engine As IEngine = EngineFactory.Create(engineOptions) Dim browser1 As IBrowser = engine.CreateBrowser() Dim browser2 As IBrowser = engine.CreateBrowser()
- Crie instâncias separadas do
IEngine
utilizando diferentes pastas de dados do usuário:IEngine engine1 = EngineFactory.Create(new EngineOptions.Builder { UserDataDirectory = @"C:\Users\Me\DotNetBrowser1" }.Build()); IEngine engine2 = EngineFactory.Create(new EngineOptions.Builder { UserDataDirectory = @"C:\Users\Me\DotNetBrowser2" }.Build()); IBrowser browser1 = engine1.CreateBrowser(); IBrowser browser2 = engine2.CreateBrowser();
Dim engine1 As IEngine = EngineFactory.Create(New EngineOptions.Builder With { .UserDataDirectory = "C:\Users\Me\DotNetBrowser" }.Build()) Dim engine2 As IEngine = EngineFactory.Create(New EngineOptions.Builder With { .UserDataDirectory = "C:\Users\Me\DotNetBrowser" }.Build()) Dim browser1 As IBrowser = engine1.CreateBrowser() Dim browser2 As IBrowser = engine2.CreateBrowser()
Exceções em runtime
ObjectDisposedException
A ObjectDisposedException
é lançada quando há uma tentativa de utilizar um objeto que já foi eliminado. Por exemplo, esta exceção é lançada quando se trabalha com:
- algum elemento DOM ou objeto JavaScript previamente armazenado em cache depois de carregar uma página Web diferente;
- um frame que já não existe no navegador;
- instância
IEngine
, quaisquer instânciasIBrowser
criadas por este engine, ou quaisquer outros objetos relacionados com essas instâncias depois doIEngine
. - instância
IEngine
, quaisquer instânciasIBrowser
criadas por este engine, ou quaisquer outros objetos relacionados com essas instâncias após a falha do Chromium.
ConnectionClosedException
A ConnectionClosedException
é lançada quando a ligação ao engine Chromium parece estar fechada. Esta exceção está normalmente relacionada com a chamada do método IEngine.Dispose()
ou uma falha do Chromium.
Operação cross-thread não válida
Quando você tenta modificar a IU no evento DotNetBrowser, você pode ver System.InvalidOperationException
com a seguinte descrição: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on..
.
O DotNetBrowser dispara os seus eventos através das threads separadas e não utiliza a thread principal da IU para este fim. Para modificar a IU no evento DotNetBrowser, passe a execução para a thread principal da IU utilizando Invoke
e BeginInvoke
em WinForms ou Dispatcher.Invoke
e Dispatcher.BeginInvoke
em WPF. A propriedade Control.InvokeRequired
no WinForms ou a chamada Dispatcher.CheckAccess()
no WPF podem ser utilizadas para verificar se é necessário passar a execução.
Os exemplos de código abaixo demonstram como obter acesso à IU a partir de outro segmento.
WinForms
browser.Navigation.FrameLoadFinished += (s, e) =>
{
if (e.Frame.IsMain)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() =>
{
this.Title = e.Browser.Url;
}));
}
else
{
this.Title = e.Browser.Url;
}
}
};
browser.Navigation.LoadUrl("https://www.teamdev.com");
AddHandler browser.Navigation.FrameLoadFinished, Sub(s, e)
If e.Frame.IsMain Then
If InvokeRequired Then
BeginInvoke(New Action(Sub()
Me.Title = e.Browser.Url
End Sub))
Else
Me.Title = e.Browser.Url
End If
End If
End Sub
browser.Navigation.LoadUrl("https://www.teamdev.com")
WPF
browser.Navigation.FrameLoadFinished += (s, e) =>
{
if (e.Frame.IsMain)
{
if (!Dispatcher.CheckAccess())
{
Dispatcher.BeginInvoke(new Action(() =>
{
this.Title = e.Browser.Url;
}));
}
else
{
this.Title = e.Browser.Url;
}
}
};
browser.Navigation.LoadUrl("https://www.teamdev.com");
AddHandler browser.Navigation.FrameLoadFinished, Sub(s, e)
If e.Frame.IsMain Then
If Not Dispatcher.CheckAccess() Then
Dispatcher.BeginInvoke(New Action(Sub()
Me.Title = e.Browser.Url
End Sub))
Else
Me.Title = e.Browser.Url
End If
End If
End Sub
browser.Navigation.LoadUrl("https://www.teamdev.com")