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
Engine
Este guia descreve como criar, utilizar e fechar o Engine
.
Consulte o guia Arquitetura para obter informações sobre como a arquitetura do DotNetBrowser foi concebida e funciona, bem como sobre os principais componentes que ele fornece.
Criando um engine
Para criar uma nova instância IEngine
, utilize os métodos estáticos EngineFactory.Create()
ou EngineFactory.Create(EngineOptions)
. A sobrecarga do método com EngineOptions
inicializa e executa o engine Chromium com as opções passadas.
IEngine engine = EngineFactory.Create(engineOptions);
Dim engine As IEngine = EngineFactory.Create(engineOptions)
Dependendo do desempenho do hardware, o processo de inicialização pode demorar vários segundos. Recomendamos que não chame este método na thread da IU da aplicação porque pode congelar toda a aplicação durante algum tempo. Utilize a abordagem descrita no exemplo.
Quando uma nova instância do IEngine
é criada, o DotNetBrowser executa as seguintes ações:
- Verifica o ambiente e certifica-se de que é um ambiente suportado.
- Encontra os binários do Chromium e os extrai para a pasta se necessário.
- Executa o processo principal do engine Chromium.
- Estabelece a conexão IPC entre o .NET e o processo principal do Chromium.
Opções do engine
Esta seção destaca as principais opções do Engine que você pode personalizar.
Modo de renderização
Esta opção indica a forma como o conteúdo de uma página Web é renderizado. O DotNetBrowser suporta os seguintes modos de renderização:
- acelerado por hardware
- fora da tela
Modo acelerado por hardware
O Chromium renderiza o conteúdo utilizando a GPU e apresenta-o diretamente numa superfície. Ver o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(RenderingMode.HardwareAccelerated);
Dim engine As IEngine = EngineFactory.Create(RenderingMode.HardwareAccelerated)
Leia mais sobre o modo de renderização acelerada por hardware, seu desempenho e limitações.
Modo fora da tela
O Chromium renderiza o conteúdo utilizando a GPU e copia os pixéis para a RAM. Veja o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(RenderingMode.OffScreen);
Dim engine As IEngine = EngineFactory.Create(RenderingMode.OffScreen)
Leia mais sobre o modo de renderização fora da tela, o seu desempenho e limitações.
Idioma
Esta opção configura o idioma utilizado nas páginas de erro predefinidas e nas caixas de diálogo da mensagem. Por padrão, o idioma é configurado dinamicamente de acordo com a localidade predefinida da sua aplicação .NET. Se a lista de idiomas suportados não contiver o idioma obtido a partir da localidade da aplicação .NET, o inglês americano é utilizado.
A opção atual permite substituir o comportamento predefinido e configurar o engine Chromium com o idioma fornecido. Veja o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
Language = DotNetBrowser.Ui.Language.German
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.Language = DotNetBrowser.Ui.Language.German
}.Build())
No exemplo de código acima, configuramos o IEngine
com o idioma alemão. Se o DotNetBrowser não conseguir carregar uma página Web, a página de erro em alemão é apresentada:
Pasta de dados do usuário
Representa um caminho absoluto para a pasta que contém os perfis e os seus dados, tais como cache, cookies, histórico, cache GPU, armazenamento local, ligações visitadas, dados Web, pastas de dicionário de verificação ortográfica, etc. Veja o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
UserDataDirectory = @"C:\Users\Me\DotNetBrowser"
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.UserDataDirectory = "C:\Users\Me\DotNetBrowser"
}.Build())
O mesmo diretório de dados do utilizador não pode ser utilizado simultaneamente por várias instâncias do IEngine
executadas numa única ou em diferentes aplicações .NET. A criação do IEngine
falha se a pasta já estiver sendo utilizada por outro IEngine
.
Se não fornecer o caminho da pasta de dados do usuário, o DotNetBrowser cria e utiliza uma pasta temporária do utilizador.
Incógnito
Esta opção indica se o modo incógnito para o perfil predefinido está ativado. Neste modo, os dados do usuário, como o histórico de navegação, os cookies, os dados do site e as informações introduzidas nos formulários das páginas Web, são armazenados na memória. Ela será libertada assim que eliminar o Profile
ou eliminar o engine IEngine
.
Por predefinição, o modo de navegação anônima está desativado.
O exemplo seguinte demonstra como ativar o modo de navegação anônima:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
IncognitoEnabled = true
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.IncognitoEnabled = true
}.Build())
Pedido de interceção por esquema URI
A opção Schemes
pode ser utilizada para configurar a interceção de pedidos de URL por esquema. Eis como configurá-la para interceptar e tratar todos os pedidos para os esquemas de URI personalizados:
Handler<InterceptRequestParameters, InterceptRequestResponse> handler =
new Handler<InterceptRequestParameters, InterceptRequestResponse>(p =>
{
UrlRequestJobOptions options = new UrlRequestJobOptions
{
Headers = new List<HttpHeader>
{
new HttpHeader("Content-Type", "text/html", "charset=utf-8")
}
};
UrlRequestJob job = p.Network.CreateUrlRequestJob(p.UrlRequest, options);
Task.Run(() =>
{
// O processamento do pedido é efetuado numa thread de trabalho
// para evitar o congelamento da página Web.
job.Write(Encoding.UTF8.GetBytes("Hello world!"));
job.Complete();
});
return InterceptRequestResponse.Intercept(job);
});
EngineOptions engineOptions = new EngineOptions.Builder
{
Schemes =
{
{ Scheme.Create("myscheme"), handler }
}
}.Build();
using (IEngine engine = EngineFactory.Create(engineOptions))
{
using (IBrowser browser = engine.CreateBrowser())
{
NavigationResult result =
browser.Navigation.LoadUrl("myscheme://test1").Result;
// Se o handler de esquema não fosse definido, o LoadResult seria
// LoadResult.Stopped.
// No entanto, com o handler de esquema, a página web é carregada e
// o resultado é LoadResult.Completed.
Console.WriteLine($"Load result: {result.LoadResult}");
Console.WriteLine($"HTML: {browser.MainFrame.Html}");
}
}
Dim interceptRequestHandler =
New Handler(Of InterceptRequestParameters, InterceptRequestResponse)(
Function(p)
Dim options = New UrlRequestJobOptions With {
.Headers = New List(Of HttpHeader) From {
New HttpHeader("Content-Type", "text/html",
"charset=utf-8")
}
}
Dim job As UrlRequestJob =
p.Network.CreateUrlRequestJob(p.UrlRequest, options)
Task.Run(Sub()
' O processamento do pedido é efetuado numa thread de trabalho
' para evitar o congelamento da página Web.
job.Write(Encoding.UTF8.GetBytes("Olá Mundo!"))
job.Complete()
End Sub)
Return InterceptRequestResponse.Intercept(job)
End Function)
Dim engineOptionsBuilder = new EngineOptions.Builder
With engineOptionsBuilder
.Schemes.Add(Scheme.Create("myscheme"), interceptRequestHandler)
End With
Dim engineOptions = engineOptionsBuilder.Build()
Using engine As IEngine = EngineFactory.Create(engineOptions)
Using browser As IBrowser = engine.CreateBrowser()
Dim result As NavigationResult =
browser.Navigation.LoadUrl("myscheme://test1").Result
' Se o handler de esquema não estivesse definido, o LoadResult seria
' LoadResult.Stopped.
No entanto, com o handler de esquemas, a página Web é carregada e
' o resultado é LoadResult.Completed.
Console.WriteLine($"Carregar resultado: {result.LoadResult.ToString()}")
Console.WriteLine($"HTML: {browser.MainFrame.Html}")
End Using
End Using
Vá ao nosso repositório para obter o exemplo completo: C#, VB.NET.
A mesma abordagem pode ser utilizada para interceptar e tratar todos os pedidos HTTPS.
Nem todos os esquemas podem ser interceptados. Por exemplo, não é possível interceptar esquemas como chrome
, data
, ou chrome-extensions
. A tentativa de os interceptar pode levar a um comportamento inesperado ou a uma falha no Chromium.
Além disso, alguns esquemas são tratados como esquemas locais, por exemplo, file
. Eles não podem ser interceptados porque não se trata de um pedido de rede.
Se o esquema especificado não puder ser interceptado, a exceção correspondente será lançada pelo construtor EngineOptions
. Por exemplo: “O esquema “file” não pode ser interceptado.”
Agente do usuário
Com esta opção, você pode configurar a string padrão do agente do usuário. Veja o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
UserAgent = "<user-agent>"
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.UserAgent = "<user-agent>"
}.Build())
Você pode fazer o override a string padrão do agente do usuário em cada instância do IBrowser
.
Porta de depuração remota
Esta opção permite ativar a depuração remota das Ferramentas de desenvolvimento do Chrome (ou DevTools). O exemplo seguinte demonstra como utilizar esta funcionalidade:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
ChromiumSwitches = { "--remote-allow-origins=http://localhost:9222" },
RemoteDebuggingPort = 9222
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.ChromiumSwitches = { "--remote-allow-origins=http://localhost:9222" },
.RemoteDebuggingPort = 9222
}.Build())
Desde o Chromium 111, é necessário especificar a opção remote-allow-origins
para permitir conexões de sockets web de origem especificada. Mais informações no Problema 1422444.
Agora você pode carregar o URL de depuração remota em uma instância do IBrowser
para abrir a página DevTools e inspecionar HTML, depurar JavaScript e outros. Veja um exemplo abaixo:
Não abra o URL de depuração remota em outras aplicações do navegador Web, como o Mozilla Firefox, o Microsoft Internet Explorer, o Safari, o Opera e outros, pois pode resultar numa falha nativa do servidor Web Chromium DevTools.
O recurso de depuração remota é compatível apenas com a versão do Chromium usada pela biblioteca DotNetBrowser. Por exemplo, se utilizar o DotNetBrowser 3.0.0 baseado no Chromium 131.0.6778.70, você pode abrir o URL de depuração remota apenas no mesmo Chromium/Google Chrome. Se você utilizar uma versão anterior do DotNetBrowser, tem de baixar a compilação Chromium correspondente.
Recomendamos o carregamento do URL de depuração remota numa instância do IBrowser
em vez do Google Chrome.
Desativar o menu tátil
O toque longo em dispositivos táteis do Windows 10 pode mostrar o seguinte menu tátil:
O exemplo de código abaixo demonstra como desativar este menu tátil:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
TouchMenuDisabled = true
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.TouchMenuDisabled = true
}.Build())
Pasta de binários do Chromium
Utilize esta opção para definir um caminho absoluto ou relativo para a pasta onde os binários do Chromium estão localizados ou para onde devem ser extraídos. Veja o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
ChromiumDirectory = @"C:\Users\Me\.DotNetBrowser\chromium"
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.ChromiumDirectory = @"C:\Users\Me\.DotNetBrowser\chromium"
}.Build())
Para obter detalhes, consulte a seção Localização dos Binários do Chromium.
Reprodução automática de vídeos
Para ativar a reprodução automática de conteúdos de vídeo nas páginas Web, utilize a opção abaixo:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
AutoplayEnabled = true
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.AutoplayEnabled = true
}.Build())
Switches do Chromium
Utilize esta opção para definir os switches do Chromium passados para o processo principal do Chromium. Veja o exemplo de código abaixo:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
ChromiumSwitches = { "--<switch-name>", "--<switch-name>=<switch-value>" }
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.ChromiumSwitches = { "--<switch-name>", "--<switch-name>=<switch-value>" }
}.Build())
Nem todas as opções do Chromium são suportadas pelo DotNetBrowser, então não há garantia de que as opções passadas funcionem e não causem quaisquer erros. Recomendamos a configuração do Chromium através das [Opções do Engine] (/dotnetbrowser/pt/docs/guides/gs/engine.html#opções-do-engine) em vez de interruptores.
APIs do Google
Algumas funcionalidades do Chromium, como a Geolocalização, a Ortografia, a Fala e outras, utilizam APIs da Google. Para acessar essas APIs, é necessária uma chave de API, um ID de cliente OAuth 2.0 e uma senha de cliente. Para adquirir a chave da API, siga estas instruções.
Para fornecer a chave da API, o ID do cliente e a senha do cliente, utilize o seguinte exemplo de código:
IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
GoogleApiKey = "<api-key>",
GoogleDefaultClientId = "<client-id>",
GoogleDefaultClientSecret = "<client-secret>"
}.Build());
Dim engine As IEngine = EngineFactory.Create(New EngineOptions.Builder With
{
.GoogleApiKey = "<api-key>",
.GoogleDefaultClientId = "<client-id>",
.GoogleDefaultClientSecret = "<client-secret>"
}.Build())
A configuração de chaves API é opcional. No entanto, se isto não for feito, algumas APIs que utilizam os serviços Google não funcionam.
Geolocalização
A geolocalização é uma das funcionalidades do Chromium que utiliza a API do Google. É necessário ativar Google Maps Geolocation API e billing, caso contrário, a Geolocation API não funciona. Depois de ativar a API de geolocalização e a faturação do Google Maps, você pode fornecer as chaves ao engine Chromium do DotNetBrowser.
Para ativar a geolocalização no DotNetBrowser, conceda uma permissão específica.
Reconhecimento de voz
O reconhecimento de voz é uma das funcionalidades do Chromium que utiliza a API do Google. É necessário ativar Speech API e billing, caso contrário o reconhecimento de voz não funciona.
Depois de ativar a Speech API e a faturação, pode fornecer as chaves ao engine Chromium do DotNetBrowser.
Eliminação do engine
A instância IEngine
atribui memória e recursos do sistema que têm de ser libertados. Quando o IEngine
já não for necessário, deve ser eliminado através do método IEngine.Dispose()
para encerrar o processo nativo do Chromium e libertar toda a memória atribuída e os recursos do sistema. Veja o exemplo abaixo:
IEngine engine = EngineFactory.Create();
// ...
engine.Dispose();
Dim engine As IEngine = EngineFactory.Create()
' ...
engine.Dispose()
Qualquer tentativa de utilizar uma IEngine
já descartada levará à ObjectDisposedException
.
Para verificar se o IEngine
foi descartado, utilize a propriedade IsDisposed
apresentada no exemplo de código abaixo:
bool disposed = engine.IsDisposed;
Dim disposed As Boolean = engine.IsDisposed
Eventos do engine
Engine descartado
Para receber notificações quando o IEngine
for eliminado, utilize o evento Disposed
apresentado no exemplo de código abaixo:
engine.Disposed += (s, e) => {};
AddHandler engine.Disposed, Sub(s, e)
End Sub
Engine falhado
Para receber notificações quando o IEngine
falha inesperadamente devido a um erro no engine Chromium, utilize a abordagem apresentada no exemplo de código abaixo:
engine.Disposed += (s, e) =>
{
long exitCode = e.ExitCode;
// O engine foi desativado se este código de saída for diferente de zero.
});
AddHandler engine.Disposed, Sub(s, e)
Dim exitCode As Long = e.ExitCode
' O engine falhou se este código de saída for diferente de zero.
End Sub)