Note: Advice in this article will only work for DotNetBrowser 1.
Guia do Programador da DotNetBrowser
Introdução
A DotNetBrowser é uma Biblioteca .NET que permite a incorporação de um componente baseado em Chromium em aplicativos .NET para exibir páginas da Web modernas criadas com HTML5, CSS3, JavaScript, etc. A DotNetBrowser suporta os ambos subsistemas gráficos .NET tanto WPF como WinForms e fornece os componentes de interface do usuário WPF/WinForms que pode ser incorporado em Aplicativo de Desktop .NET para exibir páginas da web.
Chromium
Todos os binários Chromium necessários são incorporados com a biblioteca. Você não precisa instalar o Google Chrome para trabalhar com a DotNetBrowser. A DotNetBrowser usa Chromium 51.0.2704.106.
Renderização
Tudo que você vê na página da Web, quando você carregá-la, é processado pelo motor Chromium. A DotNetBrowser exibe apenas as partes da página da web processadas pelo motor Chromium. O Chromium carrega e processa páginas da web em processos separados nativos (Arquitetura de Multiprocessamento). A página web parece exatamente como no Google Chrome.
Arquitetura de Multiprocessamento
A DotNetBrowser herda Arquitetura de Multiprocessamento do Chromium. Cada página da web é processada em um processo separado nativo (DotNetBrowser.Chromium.exe
). JavaScript na página web e plugins são executados em processos separados nativas também. Se um erro inesperado acontecer no plug-in da página Web ou DOM, o aplicativo continuará funcionando. Você pode ouvir eventos sobre encerramento inesperado do processo Chromium e restaurar componente Navegador, se necessário.
Uso da Memória
Desde toda a funcionalidade do Chromium está sendo executado em processos nativos separados, motor Chromium não usa a memória de seu aplicativo .NET.
Instalação e Implantação
Requisitos
A DotNetBrowser funciona no Windows, de 32 e 64 bits:
Microsoft Windows
- Windows 10
- Windows 8 & 8.1
- Windows 7
- Windows Server 2008
- Windows Server 2012
Microsoft Visual Studio
- 2013
- 2015
.NET Framework
- 4.0 ou superior
Instalação
A DotNetBrowser é distribuído como um simples arquivo ZIP dotnetbrowser-x.x.x.zip
. O arquivo tem a seguinte estrutura:
- Biblioteca DotNetBrowser (
/Library/DotNetBrowser.dll
) - DotNetBrowser Chromium binários para Windows (
/Library/DotNetBrowser.Chromium.dll
) - Especificação da API da DotNetBrowser (
/Library/Documentation/API/
) - Exemplos DotNetBrowser (
/Samples
) - Aplicação Demo DotNetBrowser (
/Library/DotNetBrowser.WPF.Demo.exe
e
)/Library/WindowsForms.Demo.exe
- Acordo de Licença DotNetBrowser (
Licence Agreement.txt
) - Readme file (
Readme.txt
) - Requisitos de software e hardware (
Requirements.txt
) - Licença Chromium WebKit (
GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1.txt
eGNU LIBRARY GENERAL PUBLIC LICENSE - Version 2.txt.txt
)
Para incluir a DotNetBrowser em seu Microsoft Visual Studio, você precisa baixar e extrair o arquivo em algum diretório, e adicionar a referência para DotNetBrowser.dll
e DotNetBrowser.Chromium.dll
em seu .NET do projeto no Visual Studio 2013.
Licenciamento
Para trabalhar com a biblioteca DotNetBrowser, você precisa de um arquivo de licença — teamdev.licenses
. Existem dois tipos de licenças: avaliação de teste grátis por 30 dias e licença comercial.
Licença de Avaliação de 30 dias
Quando você solicita um arquivo de licença de avaliação de 30 dias, você receberá uma mensagem de e-mail com o link de download para o arquivo teamdev.licenses
. Para ativar a licença de avaliação, você precisa incluir o arquivo em seu projeto MS VS2013 como Recurso Incorporado.
Licença Comercial
Quando você comprar uma licença comercial, você tem um arquivo com dois arquivos de licença dentro:
Development/
teamdev.licenses
Runtime/
teamdev.licenses
Você precisa incluir um desses arquivos de licença em seu projeto no Visual Studio para ativar a licença. A diferença entre as licenças de Desenvolvimento e de Tempo de Execução é o seguinte:
- você precisa usar a Licença de Desenvolvimento apenas para fins de desenvolvimento. O número de licenças deve ser igual ao número de desenvolvedores que usam a DotNetBrowser no desenvolvimento. Por exemplo, se você tiver 10 desenvolvedores envolvidos em seu projeto e apenas 4 deles trabalham com a DotNetBrowser, você deve comprar apenas 4 licenças.
- a Licença de Tempo de Execução deve ser usada quando você distribuir seu software com a DotNetBrowser fechada. Você pode implantar a Licença de Tempo de Execução com o seu pedido para um número ilimitado de usuários finais.
Implantação
Aqui está uma lista dos arquivos necessários que devem ser implantados para o ambiente do usuário final:
Assembly | Description |
---|---|
DotNetBrowser.dll | DotNetBrowser DLL |
DotNetBrowser.Chromium.dll | Chromium binaries |
A maneira de implantar esses arquivos depende de você.
Introdução
Em geral, para começar a trabalhar com a biblioteca DotNetBrowser no seu aplicativo .NET você precisa:
- Incluir
DotNetBrowser.dll
em seu projeto do Visual Studio. - Include
teamdev.licenses
into your Visual Studio Project as Recurso Incorporado.
Instalação de Licença de Avaliação
Navegador
Usando instância da DotNetBrowser.Browser
você pode trabalhar com o motor Chromium. Essa interface fornece métodos para o carregamento de páginas web por URL, carregamento de conteúdo HTML, obtenção de conteúdo HTML da página web carregada, executar JavaScript, navegar através de histórico de navegação, acessar a carregamento de Navegador, eventos de status, etc.
A biblioteca DotNetBrowser define todas as classes e interfaces nos seguintes espaço de nomes:
DotNetBrowser
DotNetBrowser.Events
DotNetBrowser.WPF
DotNetBrowser.WinForms
Quando você não precisa usar a instância Browser
você deve dispor-o usando o método da Browser.Dispose()
. Este método lança todos os alocados recursos por instância e termina todos os processos nativos correspondentes.
C#
if (!browser.Disposed) { browser.Dispose(); }
VB.NET
If Not browser.Disposed Then browser.Dispose() End If
A instância Browser
pode ser eliminada do código JavaScript através da função window.close()
JavaScript. Para receber notificações sobre a utilização de disposição de instância DisposeEvent
:
C#
browser.DisposeEvent += delegate(object sender, DisposeEventArgs e){};
VB.NET
AddHandler browser.DisposeEvent, sub(ByVal sender As Object, ByVal e As DisposeEventArgs) End sub
BrowserFactory
Para criar a instância Browser
utilize o método da
.BrowserFactory.Create()
C#
using DotNetBrowser; Browser browser = BrowserFactory.Create();
VB.NET
Imports DotNetBrowser Dim browser As Browser = BrowserFactory.Create()
BrowserContext
Cada instância ‘Browser’ deve ser criada usando a BrowserFactory
. A ‘BrowserFactory’ Inicializa o contexto necessário para uma sessão de navegação e fornece o caminho para o diretório onde o Chromium armazena cookies, arquivos de dados de cache, etc.
O código a seguir cria uma nova instância do Browser inicializada com contexto padrão:
C#
Browser browser = BrowserFactory.Create();
VB.NET
Dim browser As Browser = BrowserFactory.Create()
O código acima é igual a:
C#
Browser browser = BrowserFactory.Create(BrowserContext.DefaultContext);
VB.NET
Dim browser As Browser = BrowserFactory.Create(BrowserContext.DefaultContext)
A propriedade da BrowserContext.DefaultContext
é um padrão da BrowserContext
que é configurado para armazenar arquivos de dados do Chromium como cookies, cache, etc. no diretório temporário do usuário. Você pode obter o caminho para o diretório onde os arquivos de dados são armazenados usando o método BrowserPreferences.GetDefaultDataDir()
.
Duas instâncias ‘Browser’ com mesma a ‘BrowserContext’ usarão o mesmo diretório de dados do usuário. Como resultado, eles compartilham os cookies e arquivos de cache. Por exemplo:
C#
BrowserContextParams params1= new BrowserContextParams("C:\my-data1"); BrowserContext context1 = new BrowserContext(params1); Browser browser1 = BrowserFactory.Create(context1); Browser browser2 = BrowserFactory.Create(context1);
VB.NET
Dim params1 As BrowserContextParams = New BrowserContextParams("C:my-data1") Dim context1 As BrowserContext = New BrowserContext(params1) Dim browser1 As Browser = BrowserFactory.Create(context1) Dim browser2 As Browser = BrowserFactory.Create(context1)
Para criar instâncias ‘Browser’ independentes que não compartilham os cookies e cache de dados, você deve inicializar cada instância do Browser com uma diferente BrowserContext configurado para usar diferentes diretórios de dados. Por exemplo:
C#
BrowserContextParams params1= new BrowserContextParams("C:\my-data1"); BrowserContext context1 = new BrowserContext(params1); Browser browser1 = BrowserFactory.Create(context1); BrowserContextParams params2= new BrowserContextParams("C:\my-data2"); BrowserContext context2 = new BrowserContext(params2); Browser browser2 = BrowserFactory.Create(context2);
VB.NET
Dim params1 As BrowserContextParams = New BrowserContextParams("C:\my-data1") Dim context1 As BrowserContext = New BrowserContext(params1) Dim browser1 As Browser = BrowserFactory.Create(context1) Dim params2 As BrowserContextParams = New BrowserContextParams("C:\my-data2") Dim context2 As BrowserContext = New BrowserContext(params2) Dim browser2 As Browser = BrowserFactory.Create(context2)
Para obter a BrowserContext
da instância Browser
você pode usar a propriedade da browser.Context
.
Make sure that you don't use several BrowserContext instances configured to use same data directory.
In this case Chromium engine will read/write same data directory from different Browser instances which might cause unexpected behavior or errors.
BrowserView
BrowserView
representa uma interface para os componentes de interface do usuário que podem ser incorporados em aplicativos .NET GUI para exibir conteúdo HTML. A DotNetBrowser fornece duas implementações da BrowserView
: WPFBrowserView
e WinFormsBrowserView
.
Eliminação da BrowserView
Para a BrowserView, você primeiro precisa eliminar a visão e depois seu navegador:
C#
browserView.Dispose(); browserView.Browser.Dispose();
VB.NET
browserView.Dispose() browserView.Browser.Dispose()
O lugar habitual para descarte da BrowserView é o evento de FormClosing
para WinForms e evento de Window.Closing
para WPF.
A BrowserView criada através de seu construtor padrão descarta-se automaticamente.
BrowserView - WinForms
O exemplo de código a seguir demonstra como criar uma instância WinForms Browser, incorporá-la em uma janela e carregar o URL http://www.google.com. Mais detalhes sobre como configurar a amostra podem ser encontrados na Quick Start Guide.
C#
using System.Windows.Forms; using DotNetBrowser; using DotNetBrowser.WinForms; namespace WinForms.DotNetBrowser { public partial class Form1 : Form { public Form1() { InitializeComponent(); BrowserView browserView = new WinFormsBrowserView(); Controls.Add((Control) browserView); browserView.Browser.LoadURL(“http://www.google.com“); } } }
VB.NET
Imports System.Windows.Forms Imports DotNetBrowser Imports DotNetBrowser.WinForms Namespace WinForms.DotNetBrowser Public Partial Class Form1 Inherits Form Public Sub New() InitializeComponent() Dim browserView As BrowserView = New WinFormsBrowserView() Controls.Add(CType(browserView, Control)) browserView.Browser.LoadURL("http://www.google.com") End Sub End Class End Namespace
BrowserView - WPF
O seguinte código de exemplo demonstra como criar uma instância do Navegador WPF, incorporá-la em uma janela e carregar o URL http://www.google.com. Mais detalhes sobre a configuração da amostra podem ser encontrados na Quick Start Guide.
MainWindow.xaml
<Window x:Class="WPF.DotNetBrowser.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid Name="mainLayout"> </Grid> </Window>
C#
MainWindow.xaml.cs
using DotNetBrowser; using DotNetBrowser.WPF; namespace WPF.DotNetBrowser { public partial class MainWindow : Window { BrowserView webView; public MainWindow() { InitializeComponent(); webView = new WPFBrowserView(BrowserFactory.Create()); mainLayout.Children.Add((UIElement)webView.GetComponent()); webView.Browser.LoadURL("http://www.google.com"); } } }
VB.NET
MainWindow.xaml.vb
Imports DotNetBrowser Imports DotNetBrowser.WPF Namespace WPF.DotNetBrowser Public Partial Class MainWindow Inherits Window Private webView As BrowserView Public Sub New() InitializeComponent() webView = New WPFBrowserView(BrowserFactory.Create()) mainLayout.Children.Add(CType(webView.GetComponent(), UIElement)) webView.Browser.LoadURL("http://www.google.com") End Sub End Class End Namespace
Renderização Leve e Pesado
A DotNetBrowser suporta dois modos de renderização: leve e pesado. Por padrão, o modo de processamento pesado é ativada, por isso, quando você cria a instância Browser
usando o seguinte código, isso cria uma nova instância Browser
configurada para usar o modo de renderização pesado:
C#
Browser browser = BrowserFactory.Create();
VB.NET
Dim browser As Browser = BrowserFactory.Create()
Para criar uma nova instância do Navegador com o modo de renderização especificada use a seguinte forma:
C#
// Creates Browser instance with enabled lighweight rendering mode Browser browser = BrowserFactory.Create(BrowserType.LIGHTWEIGHT); // Creates Browser instance with enabled heavyweight rendering mode Browser browser = BrowserFactory.Create(BrowserType.HEAVYWEIGHT);
VB.NET
' Creates Browser instance with enabled lighweight rendering mode Dim browser As Browser = BrowserFactory.Create(BrowserType.LIGHTWEIGHT) ' Creates Browser instance with enabled heavyweight rendering mode Dim browser As Browser = BrowserFactory.Create(BrowserType.HEAVYWEIGHT)
As diferenças entre os modos de renderização leve e pesado e recomendações sobre o modo de renderização que você deve usar em sua aplicação você pode encontrar a seguir:
Leve (fora da tela) | Pesado (acelerado por GPU) |
---|---|
No modo de renderização leve motor Chromium renderiza página da web fora da tela usando CPU. Uma imagem da página da Web salva-se na memória compartilhada. A DotNetBrowserlê a imagem na memória compartilhada e expõe-no usando padrão WPF ou WinForms API. | No modo de renderização pesado, que é o modo padrão na DotNetBrowser, incorporamos uma janela Win32 nativa em seu quadro de aplicativo .NET. Em seguida, o motor Chromium está configurado para renderizar o conteúdo para esta janela nativa usando GPU. |
Browser browser = BrowserFactory.Create(BrowserType.LIGHTWEIGHT); | Browser browser = BrowserFactory.Create(BrowserType.HEAVYWEIGHT); |
Quando deve ser usado | Quando deve ser usado |
Este modo de renderização funciona muito bem se você precisa de um verdadeiro controle leve WPF/WinForms que permite a exibição de páginas da web modernas HTML5/JavaScript/CSS. Você pode fazer este controle leve transparente, exibir outros controles em cima dele, renderizar algo sobre a página da web, etc. | O modo de renderização (acelerado por GPU) funciona muito mais rápido em comparação com o modo de renderização leve. Neste modo o desempenho de renderização é o mesmo como no Google Chrome. Você pode exibir o vídeo em tela cheia ou HTML5 animação dinâmica com 60fps. Então, se o desempenho de renderização é muito importante para seu aplicativo, use o modo de renderização pesado. |
Carregamento de URL
Para carregar uma página da Web pelo seu URL usam o método de Browser.LoadURL()
.
O seguinte código demonstra como carregar a página da Web http://www.google.com:
C#
browser.LoadURL("http://www.google.com");
VB.NET
browser.LoadURL("http://www.google.com")
A página da Web vai se carregar assincronamente (isso não bloqueia o encadeamento de execução corrente), então não há garantia que a página da Web do Google se carregará completamente quando o método volta. Para saber quando a página da Web é carregada completamente use o Carregar Eventos.
Desde 1.8.1 é possível determinar quando navegador está carregando alguma coisa. A propriedade Browser.Loading
voltará verdade neste caso.
C#
using System; using DotNetBrowser; namespace MyNamespace { class Program { static void Main(string[] args) { // Create Browser instance. Browser browser = BrowserFactory.Create(); // Load "http://www.google.com" URL browser.LoadURL("http://www.google.com"); // Dispose Browser instance. browser.Dispose(); } } }
VB.NET
Imports System Imports DotNetBrowser Namespace MyNamespace Class Program Private Shared Sub Main(ByVal args As String()) ' Create Browser instance. Dim browser As Browser = BrowserFactory.Create() ' Load "http://www.google.com" URL. browser.LoadURL("http://www.google.com") ' Dispose Browser instance. browser.Dispose() End Sub End Class End Namespace
Carregamento e Espera
Em alguns casos (p. ex. testes de automação) precisaria de bloquear o encadeamento de execução corrente e esperar até que a página da Web se carregue completamente.
O exemplo de código a seguir demonstra como carregar a página da web http://www.google.com e esperar até que ela é carregada completamente:
C#
ManualResetEvent waitEvent = new ManualResetEvent(false); browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) { // Wait until main document of the web page is loaded completely. if (e.IsMainFrame) { waitEvent.Set(); } }; browser.LoadURL("http://www.google.com"); waitEvent.WaitOne();
VB.NET
Dim waitEvent As ManualResetEvent = New ManualResetEvent(False) AddHandler browser.FinishLoadingFrameEvent, sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs) If e.IsMainFrame Then waitEvent.Set() End If End sub browser.LoadURL("http://www.google.com") waitEvent.WaitOne()
Configuração de Manipulador de Carga
LoadHandler
permite a manipulação de qualquer atividade de carga, incluindo a filtragem de todos os URLs carregados no Componente de Navegador. Usando o LoadHandler
você pode cancelar qualquer evento de carga ou suprimir os certificados SSL problemáticos.
Exemplo:
C#
using System; using DotNetBrowser; using DotNetBrowser.Events; namespace MyNamespace { class Program { static void Main(string[] args) { // Create Browser instance. Browser browser = BrowserFactory.Create(); // Register custom LoadHandler implementation. browser.LoadHandler = new MyLoadHandler(); // Load "http://www.google.com" URL. browser.LoadURL("http://www.google.com"); // Dispose Browser instance. browser.Dispose(); } } public class MyLoadHandler : DefaultLoadHandler { public override bool OnLoad(LoadParams loadParams) { // Suppress loading everything with URL that starts with "http://www.google.com". if (loadParams.Url.StartsWith("http://www.google.com")) { return true; } return false; } } }
VB.NET
Imports DotNetBrowser Namespace MyNamespace Class Program Private Shared Sub Main(ByVal args As String()) ' Create Browser instance. Dim browser As Browser = BrowserFactory.Create() ' Register custom LoadHandler implementation. browser.LoadHandler = New MyLoadHandler() ' Load "http://www.google.com" URL. browser.LoadURL("http://www.google.com") ' Dispose Browser instance. browser.Dispose() End Sub End Class Public Class MyLoadHandler Inherits DefaultLoadHandler Public Overrides Function OnLoad(ByVal loadParams As LoadParams) As Boolean ' Suppress loading everything with URL that starts with "http://www.google.com". If loadParams.Url.StartsWith("http://www.google.com") Then Return True End If Return False End Function End Class End Namespace
Ativar/Desativar Navegação Backspace
Por padrão a navegação Backspace e Shift+Backspace está ativada. Para desativar a navegação quando o usuário pressiona Backspace ou Shift+Backspace use a seguinte aproximação:
MainWindow.xaml
<Window x:Class="WPF.BackspaceNavigation.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" Closing="Window_Closing"> <Grid Name="mainLayout"> </Grid> </Window>
C#
MainWindow.xaml.cs
using System; using System.IO; using DotNetBrowser; using DotNetBrowser.WPF; using System.Windows; namespace WPF.BackspaceNavigation { public partial class MainWindow : Window { Browser browser; WPFBrowserView browserView; public MainWindow() { InitializeComponent(); browser = BrowserFactory.Create(); browserView = new WPFBrowserView(browser); mainLayout.Children.Add(browserView); browser.LoadHandler = new SampleLoadHandler(); browserView.Browser.LoadURL("http://www.google.com"); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { // Dispose BrowserView when close app window. browserView.Dispose(); browser.Dispose(); } } class SampleLoadHandler : DefaultLoadHandler { public override bool CanNavigateOnBackspace() { return false; } } }
VB.NET
MainWindow.xaml.vb
Imports DotNetBrowser Imports DotNetBrowser.WPF Namespace WPF.BackspaceNavigation Public Partial Class MainWindow Inherits Window Private browser As Browser Private browserView As WPFBrowserView Public Sub New() InitializeComponent() browser = BrowserFactory.Create() browserView = New WPFBrowserView(browser) mainLayout.Children.Add(browserView) browser.LoadHandler = New SampleLoadHandler() browserView.Browser.LoadURL("http://www.google.com") End Sub Private Sub Window_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) browserView.Dispose() browser.Dispose() End Sub End Class Class SampleLoadHandler Inherits DefaultLoadHandler Public Overrides Function CanNavigateOnBackspace() As Boolean Return False End Function End Class End Namespace
Carregamento de conteúdo HTML
Para carregar conteúdo HTML a partir de uma cadeia de caracteres use o método Browser.LoadHTML()
. Por exemplo:
C#
browser.LoadHTML("<html><body><h1>Load HTML Sample</h1></body></html>");
VB.NET
browser.LoadHTML("<html><body><h1>Load HTML Sample</h1></body></html>")
A saída será semelhante a este:
Exemplo
C#
using System; using DotNetBrowser; namespace MyNamespace { class Program { static void Main(string[] args) { // Create Browser instance. Browser browser = BrowserFactory.Create(); // Load HTML content from string . browser.LoadHTML("<html><body><h1>Load HTML Sample</h1></body></html>"); // Dispose Browser instance. browser.Dispose(); } } }
VB.NET
Imports DotNetBrowser Module Module1 Sub Main(args As String()) ' Create Browser instance. Dim browser As Browser = BrowserFactory.Create() ' Load HTML content from string. browser.LoadHTML("<html><body><h1>Load HTML Sample</h1></body></html>") ' Dispose Browser instance. browser.Dispose() End Sub End Module
Recebendo HTML
Para receber uma cadeia de caracteres que representa o HTML da página da web carregada use o método Browser.GetHTML()
. Você deve usar este método apenas quando a página da web é carregada completamente. Caso contrário, você pode receber o HTML incompleto ou cadeia de caracteres vazia. O código a seguir demonstra como esperar até que a página web é carregada completamente e receber HTML da página web carregada:
C#
using System; using DotNetBrowser; using DotNetBrowser.Events; namespace MyNamespace { class Program { static void Main(string[] args) { // Create Browser instance. Browser browser = BrowserFactory.Create(); // Register frame loading event listener. browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) { // Wait until main document of the web page is loaded completely. if (e.IsMainFrame) { // Get HTML of the loaded web page and write it to Console. Console.Out.WriteLine(e.Browser.GetHTML()); } }; // Load teamdev.com to get its HTML content. browser.LoadURL("http://www.teamdev.com"); } } }
VB.NET
Imports DotNetBrowser Module MyNamespace Sub Main() 'Create Browser instance. Dim browser As Browser = BrowserFactory.Create() 'Register frame loading event listener. AddHandler browser.FinishLoadingFrameEvent, Sub(sender, e) 'Wait until main document of the web page is loaded completely. If (e.IsMainFrame) Then 'Get HTML of the loaded web page and write it to Console. Console.Out.WriteLine(e.Browser.GetHTML()) End If End Sub 'Load teamdev.com to get its HTML content. browser.LoadURL("http://www.teamdev.com") End Sub End Module
Eventos
Carregando Eventos
A interface Browser
fornece a funcionalidade que permite obter eventos de carga. Você pode anexar delegados para receber notificações sobre o progresso do carregamento da página web, disponibilidade de documentos, eventos de falha de carregamento, etc. A lista de eventos de carga que você pode receber é o seguinte:
StartLoadingFrameEvent
- Um evento que indica que o processo de carregamento de frames foi iniciado.FinishLoadingFrameEvent
- Um evento que indica que o processo de carregamento de frames foi concluído.ProvisionalLoadingFrameEvent
- Um evento que indica que o carregamento provisório de um frame especificado foi confirmado com sucesso.FailLoadingFrameEvent
- Um evento que indica que o processo de carregamento de frames falhou.DocumentLoadedInFrameEvent
- Um evento que indica que um frame é carregado com um documento.DocumentLoadedInMainFrameEvent
- Um evento que indica que o frame principal é carregado com um documento.
O código a seguir demonstra como receber e manipular vários eventos de carregamento:
C#
using System; using DotNetBrowser; using DotNetBrowser.Events; namespace MyNamespace { class Program { static void Main(string[] args) { ManualResetEvent waitEvent = new ManualResetEvent(false); // Create Browser instance. Browser browser = BrowserFactory.Create(); // Register an event that will be fired when web page's frame has been completely loaded. browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) { Console.Out.WriteLine("FinishLoadingFrame: URL = " + e.ValidatedURL + ", IsMainFrame = " + e.IsMainFrame); if (e.IsMainFrame) { waitEvent.Set(); } }; // Register an event that will be fired when web page's frame has been started loading. browser.StartLoadingFrameEvent += delegate(object sender, StartLoadingArgs e) { Console.Out.WriteLine("StartLoadingFrame: URL = " + e.ValidatedURL + ", IsMainFrame = " + e.IsMainFrame); }; // Register an event that will be fired when document of main frame has been completely loaded. browser.DocumentLoadedInMainFrameEvent += delegate(object sender, LoadEventArgs e) { Console.Out.WriteLine("DocumentLoadedInMainFrame"); }; // Load google.com to get loading events. browser.LoadURL("http://www.google.com"); //Wait until the page is loaded completely. waitEvent.WaitOne(); // Dispose Browser instance. browser.Dispose(); } } }
VB.NET
Imports System.Threading Imports DotNetBrowser Imports DotNetBrowser.Events Module MyNamespace Sub Main(args As String()) Dim waitEvent As ManualResetEvent = New ManualResetEvent(False) 'Create Browser instance. Dim browser As Browser = BrowserFactory.Create() 'Register an event that will be fired when web page's frame has been completely loaded. AddHandler browser.FinishLoadingFrameEvent, sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs) Console.Out.WriteLine("FinishLoadingFrame: URL = " + e.ValidatedURL.ToString() _ + ", IsMainFrame = " + e.IsMainFrame.ToString()) If e.IsMainFrame Then waitEvent.Set() End If End sub 'Register an event that will be fired when web page's frame has been started loading. AddHandler browser.StartLoadingFrameEvent, sub(ByVal sender As Object, ByVal e As StartLoadingArgs) Console.Out.WriteLine("StartLoadingFrame: URL = " + e.ValidatedURL.ToString() _ + ", IsMainFrame = " + e.IsMainFrame.ToString()) End sub 'Register an event that will be fired when document of main frame has been completely loaded. AddHandler browser.DocumentLoadedInMainFrameEvent, sub(ByVal sender As Object, ByVal e As LoadEventArgs) Console.Out.WriteLine("DocumentLoadedInMainFrame") End sub 'Load google.com to get loading events. browser.LoadURL("http://www.google.com") 'Wait until the page is loaded completely. waitEvent.WaitOne() 'Dispose Browser instance. browser.Dispose() End Sub End Module
Eventos de Título
TitleChangedEvent
indica que o título de um documento no frame principal foi alterado.
Para ser notificado quando o título de um documento foi alterado use o ouvinte TitleChangedEvent
, como mostrado no seguinte código de exemplo:
C#
browser.TitleChangedEvent += delegate(object sender, TitleEventArgs e) { string mainDocumentTitle = e.Title; };
VB.NET
AddHandler browser.TitleChangedEvent, sub(ByVal sender As Object, ByVal e As TitleEventArgs) Dim mainDocumentTitle As String = e.Title End sub
Eventos de Status
Quando o usuário move o cursor sobre um link, o motor de Chromium exibe seu URL na barra de status. O código JavaScript pode alterar o texto na barra de status de forma programática através da janela de propriedade de status também. A API DotNetBrowser fornece uma funcionalidade que lhe permite receber notificações sobre alterações de texto de barra de status.
StatusChangedEvent
indica que o texto da barra de status foi alterado.
O seguinte código de exemplo demonstra como usar essa funcionalidade:
C#
browser.StatusChangedEvent += delegate(object sender, StatusEventArgs e) { string statusText = e.Text; };
VB.NET
AddHandler browser.StatusChangedEvent, sub(ByVal sender As Object, ByVal e As StatusEventArgs) Dim statusText As String = e.Text End sub
DOM
Documento
Cada página web carregada no navegador tem o seu próprio objeto de documento. Para acessar objeto de documento da página web carregada usar o método Browser.GetDocument()
. Esse método retorna a instância DOMDocument
que você pode usar para acessar as propriedades do documento e seus nós filhos. Por exemplo:
C#
DOMDocument document = browser.GetDocument();
VB.NET
Dim document As DOMDocument = browser.GetDocument()
Se a página da Web contém frames (veja IFRAME
ou FRAME
), então, cada quadro tem seu próprio objeto de documento. Para acessar objeto de documento de um frame especificado use o método Browser.GetDocument(long frameId)
. O frameId
você pode obter do método Browser.GetFramesIds()
. Por exemplo:
C#
foreach (long frameId in browser.GetFramesIds()) { DOMDocument frameDocument = browser.GetDocument(frameId); }
VB.NET
For Each frameId As Long In browser.GetFramesIds() Dim frameDocument As DOMDocument = browser.GetDocument(frameId) Next
Tendo a instância DOMDocument
você pode trabalhar com o objeto de documento e sua estrutura DOM.
Se a página web não está completamente carregada ou ela não tem documento, então o método
Browser.GetDocument()
retornanull
. Portanto, antes de aplicar esse método, certifique-se de que a página web é carregada completamente.
Encontrando Elementos
A API DOM DotNetBrowser fornece a funcionalidade que pode ser usada para encontrar elementos HTML na página web carregada por diferentes condições. O seguinte código de exemplo demonstra como localizar todos os elementos HTML por etiqueta de nome especificada:
C#
List<DOMNode> divs = document.GetElementsByTagName("div");
VB.NET
Dim divs As List(Of DOMNode) = document.GetElementsByTagName("div")
Se você precisa de encontrar apenas o primeiro um elemento HTML no documento faça isso da seguinte maneira:
C#
DOMElement div = document.GetElementById("myId");
VB.NET
Dim div As DOMElement = document.GetElementById("myId")
Em geral, você pode procurar por elementos HTML utilizando diferentes condições:
C#
DOMElement element = document.GetElementById("myId"); List<DOMNode> elements = document.GetElementByTagName("div"); List<DOMNode>elements = document.GetElementByClassName("myClass"); List<DOMNode> elements = document.GetElementByName("myName"); DOMNode root = document.QuerySelector("#root");
VB.NET
Dim element As DOMElement = document.GetElementById("myId") Dim elements As List(Of DOMNode) = document.GetElementByTagName("div") Dim elements As List(Of DOMNode) = document.GetElementByClassName("myClass") Dim elements As List(Of DOMNode) = document.GetElementByName("myName") Dim root As DOMNode = document.QuerySelector("#root")
Atributos de Elementos
Exemplo de código a seguir demonstra como a lista de acesso e atributos do determinado elemento DOM.
C#
using DotNetBrowser; using DotNetBrowser.DOM; using DotNetBrowser.Events; using System;using System.Collections.Generic; using System.Linq;using System.Text; using System.Threading.Tasks; namespace DOMGetAttributesSample { class Program { static void Main(string[] args) { Browser browser = BrowserFactory.Create(); browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) { if (e.IsMainFrame) { DOMDocument document = e.Browser.GetDocument(); DOMElement link = document.GetElementById("link"); Dictionary<String, String> attributes = link.Attributes; foreach (var attribute in attributes) { Console.Out.WriteLine(attribute.Key + " = " + attribute.Value); } } }; browser.LoadHTML("<html><body><a href='#' id='link' title='link title'></a></body></html>"); } } }
VB.NET
Imports DotNetBrowser Imports DotNetBrowser.DOM Imports DotNetBrowser.Events Namespace DOMGetAttributesSample Class Program Private Shared Sub Main(ByVal args As String()) Dim browser As Browser = BrowserFactory.Create() AddHandler browser.FinishLoadingFrameEvent, sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs) If e.IsMainFrame Then Dim document As DOMDocument = e.Browser.GetDocument() Dim link As DOMElement = document.GetElementById("link") Dim attributes As Dictionary(Of String, String) = link.Attributes For Each attribute In attributes Console.Out.WriteLine(attribute.Key & " = " & attribute.Value) Next End If End sub browser.LoadHTML("<html><body><a href='#' id='link' title='link title'></a></body></html>") End Sub End Class End Namespace
Trabalhando com Campos de Formulário
O seguinte código de exemplo demonstra como preencher os campos de um formulário específico, automaticamente, quando a página é carregada completamente.
C#
using DotNetBrowser; using DotNetBrowser.DOM; using DotNetBrowser.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace DOMSetFormFieldsValuesSample { class Program { static void Main(string[] args) { string loginValue = "Login"; string passwordValue = "Password"; using (Browser browser = BrowserFactory.Create()) { ManualResetEvent waitEvent = new ManualResetEvent(false); browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) { // Wait until main document of the web page is loaded completely. if (e.IsMainFrame) { DOMDocument document = e.Browser.GetDocument(); List<DOMNode> forms = document.GetElementsByTagName("form"); foreach (DOMNode formNode in forms) { if (formNode.NodeType == DOMNodeType.ElementNode) { DOMElement form = (DOMElement)formNode; if(form.GetAttribute("name").Equals("Form")) { List<DOMNode> logins = form.GetElementsByName("login"); foreach (DOMNode loginNode in logins) { DOMElement login = (DOMElement)loginNode; login.SetAttribute("value", loginValue); Console.Out.WriteLine("Login = " + login.GetAttribute("value")); } List<DOMNode> passws = form.GetElementsByName("passw"); foreach (DOMNode passwNode in passws) { DOMElement passw = (DOMElement)passwNode; passw.SetAttribute("value", passwordValue); Console.Out.WriteLine("Password = " + passw.GetAttribute("value")); } } } } waitEvent.Set(); } }; browser.LoadHTML( "<html>"+ " <body>"+ " <form name='Form'>" + " Login:<br>" + " <input type='text' name='login'>" + " <br>" + " Password:<br>" + " <input type='password' name='passw'>" + " <br><br>" + " <input type='submit' value='Submit'>" + " </form>" + " </body>" + "</html>"); waitEvent.WaitOne(); } } } }
VB.NET
Imports DotNetBrowser Imports DotNetBrowser.DOM Imports DotNetBrowser.Events Imports System.Threading Namespace DOMSetFormFieldsValuesSample Class Program Private Shared Sub Main(ByVal args As String()) Dim loginValue As String = "Login" Dim passwordValue As String = "Password" Using browser As Browser = BrowserFactory.Create() Dim waitEvent As ManualResetEvent = New ManualResetEvent(False) AddHandler browser.FinishLoadingFrameEvent, sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs) If e.IsMainFrame Then Dim document As DOMDocument = e.Browser.GetDocument() Dim forms As List(Of DOMNode) = document.GetElementsByTagName("form") For Each formNode As DOMNode In forms If formNode.NodeType = DOMNodeType.ElementNode Then Dim form As DOMElement = CType(formNode, DOMElement) If form.GetAttribute("name").Equals("Form") Then Dim logins As List(Of DOMNode) = form.GetElementsByName("login") For Each loginNode As DOMNode In logins Dim login As DOMElement = CType(loginNode, DOMElement) login.SetAttribute("value", loginValue) Console.Out.WriteLine("Login = " & login.GetAttribute("value")) Next Dim passws As List(Of DOMNode) = form.GetElementsByName("passw") For Each passwNode As DOMNode In passws Dim passw As DOMElement = CType(passwNode, DOMElement) passw.SetAttribute("value", passwordValue) Console.Out.WriteLine("Password = " & passw.GetAttribute("value")) Next End If End If Next waitEvent.[Set]() End If End sub browser.LoadHTML( "<html>" & " <body>" & " <form name='Form'>" & " Login:<br>" & " <input type='text' name='login'>" & " <br>" & " Password:<br>" & " <input type='password' name='passw'>" & " <br><br>" & " <input type='submit' value='Submit'>" & " </form>" & " </body>" & "</html>") waitEvent.WaitOne() End Using End Sub End Class End Namespace
Executando JavaScript
A capacidade de executar código JavaScript na página web carregada é uma das principais características da DotNetBrowser. Para executar o código JavaScript, antes de tudo você precisa ter certeza de que a página é carregada completamente.
Se a página da Web é carregada completamente, você pode executar um código JavaScript usando uma das seguintes maneiras:
Executando JavaScript sem retornar um valor
O método Browser.ExecuteJavaScript(string javaScript)
executa o código JavaScript de forma assíncrona, sem bloquear a execução do encadeamento de execução atual. Se você não estiver interessado em receber o resultado do código JavaScript, você pode usar este método porque o seu parâmetro de retorno é nulo.
C#
// Executes the passed JavaScript code asynchronously. browser.ExecuteJavaScript("document.write('<html><title>My Title</title><body>Hello from JxBrowser!</body></html>');");
VB.NET
' Executes the passed JavaScript code asynchronously browser.ExecuteJavaScript("document.write('<html><title>My Title</title><body>Hello from JxBrowser!</body></html>');")
Executando JavaScript e retornando o resultado
O método Browser.ExecuteJavaScriptAndReturnValue(string javaScript)
executa o código descrito por parâmetro javaScript
e retorna o resultado da execução do código JavaScript como JSValue
. Este método bloqueia a execução do encadeamento de execução atual até que o código JavaScript passado terminar a sua execução e retornar o resultado da execução.
JSValue
fornece o acesso ao resultado da execução de código de JavaScript. Utilizando os métodos de JSValue
você pode determinar se o valor do resultado é um objeto, número, string ou valor booleano. Por exemplo, o código a seguir demonstra como obter um valor da cadeia de caracteres do documento usando o método Browser.ExecuteJavaScriptAndReturnValue(string javaScript)
:
C#
JSValue documentTitle = browser.ExecuteJavaScriptAndReturnValue("document.title"); // Make sure that result value is a string and read its value if (documentTitle.IsString()) { Console.WriteLine("Document Title = " + documentTitle.GetString()); }
VB.NET
Dim documentTitle As JSValue = browser.ExecuteJavaScriptAndReturnValue("document.title") ' Make sure that result value is a string and read its value If documentTitle.IsString() Then Console.WriteLine("Document Title = " & documentTitle.GetString()) End If
Neste exemplo vamos verificar que o retorno JSValue
é um valor de cadeia de caracteres, usando o método JSValue.IsString()
; e acessar o valor da cadeia de caracteres, usando o método JSValue.GetString()
.
Please avoid using the Browser.ExecuteJavaScriptAndReturnValue(String javaScript) method in the UI thread,
because the passed JavaScript code can cause JavaScript Alert dialog to be shown.
All the dialogs are displayed in the UI thread by default. As result, it can cause a deadlock.
Acessando objetos JavaScript
Você pode acessar objetos JavaScript na página web carregada usando o método Browser.ExecuteJavaScriptAndReturnValue(String javaScript)
. Se o valor de retorno representa objeto JavaScript, então JSValue irá conter a instância que representa .NET wrapper para objeto JavaScript. A JSObject classe fornece a funcionalidade que permite trabalhar com propriedades de objetos JavaScript e chamar suas funções.
Obtenção de propriedades
Para acessar JavaScript propriedade de objeto use o método JSObject.GetProperty(String name)
. O código a seguir demonstra como obter o valor da propriedade document.title
:
C#
JSValue document = browser.ExecuteJavaScriptAndReturnValue("document"); JSValue titleValue = document.AsObject().GetProperty("title"); String title = titleValue.GetString();
VB.NET
Dim document As JSValue = browser.ExecuteJavaScriptAndReturnValue("document") Dim titleValue As JSValue = document.AsObject().GetProperty("title") Dim title As String = titleValue.GetString()
Definição de propriedades
Para modificar a propriedade de objeto JavaScript com valor especificado use o método JSObject.SetProperty(String name, object value)
. O código a seguir demonstra como modificar a propriedade document.title com valor ‘My title’:
C#
JSValue document = browser.ExecuteJavaScriptAndReturnValue("document"); document.AsObject().SetProperty("title", "My title");
VB.NET
Dim document As JSValue = browser.ExecuteJavaScriptAndReturnValue("document") document.AsObject().SetProperty("title", "My title")
Trabalhando com funções
A propriedade de objeto JavaScript pode representar uma função (JSFunction). Você pode usar a função de objeto JavaScript utilizando o seguinte método:
C#
JSValue document = browser.ExecuteJavaScriptAndReturnValue("document"); JSValue write = document.AsObject().GetProperty("write"); write.AsFunction().Invoke(document.AsObject(), "<html><body>Hello</body></html>");
VB.NET
Dim document As JSValue = browser.ExecuteJavaScriptAndReturnValue("document") Dim write As JSValue = document.AsObject().GetProperty("write") write.AsFunction().Invoke(document.AsObject(), "<html><body>Hello</body></html>")
Trabalho com matrizes
JSValue pode representar uma Matriz (JSArray). Você pode acessar os elementos da matriz usando o seguinte método:
C#
JSValue array = browser.ExecuteJavaScriptAndReturnValue("['John', 'Doe', 46];"); JSValue john = array.AsArray()[0]; JSValue doe = array.AsArray()[1];
VB.NET
Dim array As JSValue = browser.ExecuteJavaScriptAndReturnValue("['John', 'Doe', 46];") Dim john As JSValue = array.AsArray().Item(0) Dim doe As JSValue = array.AsArray().Item(1)
.NET para conversão de tipos JavaScript
JavaScript e .NET trabalham com diferentes tipos primitivos. A DotNetBrowser implementa conversão de tipos automática de .NET para tipos JavaScript. Veja como objetos .NET serão convertidos para seus equivalentes JavaScript pela DotNetBrowser:
.NET | JavaScript |
---|---|
double, float, long, int, short, System.Double, System.Float System.Int64, System.Int32, System.Int16 | Number |
bool, System.Boolean | Boolean |
System.String | String |
null | null |
DotNetBrowser.JSObject | Object |
DotNetBrowser.JSArray | Array |
DotNetBrowser.JSFunction | Function |
Mensagens de Console
Usando o ConsoleListener
você pode ouvir as mensagens de Console JavaScript com diferentes níveis: DEBUG
, LOG
, WARNING
e ERROR
. Para começar a receber Mensagens de Console, você precisa se registrar ConsoleListener
para uma especificada instância Browser
. Por exemplo:
С#
browser.ConsoleMessageEvent += delegate(object sender, DotNetBrowser.Events.ConsoleEventArgs e) { Console.WriteLine("Message: " + e.Message); };
VB.NET
AddHandler browser.ConsoleMessageEvent, sub(ByVal sender As Object, ByVal e As DotNetBrowser.Events.ConsoleEventArgs) Console.WriteLine("Message: " & e.Message) End sub
Exemplo
MainWindow.xaml
<Window x:Class="ConsoleListenerSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpf="clr-namespace:DotNetBrowser.WPF;assembly=DotNetBrowser" Title="MainWindow" Height="350" Width="525" Closing="Window_Closing"> <Grid Name="mainLayout"> <wpf:WPFBrowserView Name="browserView" /> </Grid> </Window>
C#
MainWindow.xaml.cs
using DotNetBrowser; using DotNetBrowser.WPF; using System; using System.Windows; namespace ConsoleListenerSample { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); browserView.Browser.LoadURL("http://www.google.com"); browserView.Browser.ConsoleMessageEvent += Browser_ConsoleMessageEvent; browserView.Browser.ExecuteJavaScript("console.error(\"Error message\");"); } private void Browser_ConsoleMessageEvent(object sender, DotNetBrowser.Events.ConsoleEventArgs e) { Console.WriteLine("Message: " + e.Message); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { // Dispose BrowserView when close app window. browserView.Dispose(); browserView.Browser.Dispose(); } } }
VB.NET
MainWindow.xaml.vb
Namespace ConsoleListenerSample ''' <summary> ''' Interaction logic for MainWindow.xaml ''' </summary> Public Partial Class MainWindow Inherits Window Public Sub New() InitializeComponent() browserView.Browser.LoadURL("http://www.google.com") AddHandler browserView.Browser.ConsoleMessageEvent, AddressOf Browser_ConsoleMessageEvent browserView.Browser.ExecuteJavaScript("console.error(""Error message"");") End Sub Private Sub Browser_ConsoleMessageEvent(ByVal sender As Object, ByVal e As DotNetBrowser.Events.ConsoleEventArgs) Console.WriteLine("Message: " & e.Message) End Sub Private Sub Window_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) ' Dispose BrowserView when close app window. browserView.Dispose() browserView.Browser.Dispose() End Sub End Class End Namespace
JavaScript-.NET Bridge
Chamando o .NET de JavaScript
A API JavaScript-.NET Bridge permite injetar objetos .NET em código JavaScript. Este é um poderoso recurso que permite acessar a funcionalidade .NET a partir de JavaScript.
Nota: Para acessar os objetos de JavaScript e injetar os objetos de .NET, certifique-se de que a página web é carregada completamente
e o suporte de JavaScript está habilitado. Se você injetar ou registrar objeto .NET e, em seguida, carregue a página da web.
Todos os objetos .NET registrados serão destruídos e não estarão disponíveis em JavaScript da página web carregada.
Injetando objetos .NET
Para injetar objeto .NET para JavaScript você precisa associar o objeto .NET com propriedade especificada de um objeto JavaScript. Por exemplo, você pode adicionar uma nova propriedade ao objeto JavaScript global de window
(outros objetos irão funcionar também) e associar esta propriedade com o objeto .NET usando o seguinte código:
C#
JSValue window = browser.ExecuteJavaScriptAndReturnValue("window"); window.AsObject().SetProperty("csharp", new CSharpObject());
VB.NET
Dim window As JSValue = browser.ExecuteJavaScriptAndReturnValue("window") window.AsObject().SetProperty("csharp", New CSharpObject())
Nota: Para injetar objeto .NET em código JavaScript, recomendamos que você use o seguinte método:
C#
browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) { if (e.IsMainFrame) { JSValue value = browser.ExecuteJavaScriptAndReturnValue("window"); value.AsObject().SetProperty("Account", new Account()); } };
VB.NET
AddHandler browser.FinishLoadingFrameEvent, sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs) If e.IsMainFrame Then Dim value As JSValue = browser.ExecuteJavaScriptAndReturnValue("window") value.AsObject().SetProperty("Account", New Account()) End If End sub
A implementação do objeto .NET pode ser o seguinte:
C#
public class Account { public void Save(String firstName, String lastName) { Console.Out.WriteLine("firstName = " + firstName); Console.Out.WriteLine("lastName = " + lastName); } }
VB.NET
Public Class Account Public Sub Save(ByVal firstName As String, ByVal lastName As String) Console.Out.WriteLine("firstName = " & firstName) Console.Out.WriteLine("lastName = " & lastName) End Sub End Class
Nota: Certifique-se de que você injeta o objeto .NET qual classe/interface está marcado como público.
Somente as classes públicas podem ser registradas e acessadas a partir de JavaScript.
Agora o código de JavaScript pode chamar métodos de objeto público:
JavaScript
window.Account.Save("FirstName", "LastName");
Nota: O código JavaScript pode acessar/chamar apenas métodos públicos de objetos registrados .NET.
Como JavaScript chama método .NET
Quando JavaScript chama um método público de um objeto .NET registrado, os parâmetros de JavaScript são convertidos automaticamente para objetos .NET/valores primitivos por DotNetBrowser.
Se a DotNetBrowser não puder converter valores de JavaScript passados ou encontrar um método com a assinatura apropriada, será exibido um erro de JavaScript.
Se objeto .NET registrado tem vários métodos com o mesmo nome e número de parâmetros, mas os tipos de parâmetros diferentes, o JavaScript irá chamar o primeiro método declarado na classe .NET.
JavaScript para conversão de tipos .NET
JavaScript e .NET trabalham com diferentes tipos primitivos. DotNetBrowser implementa a conversão automática de tipos JavaScript para tipos .NET. Veja como objetos JavaScript serão convertidos para seus equivalentes .NET por DotNetBrowser:
JavaScript | .NET |
---|---|
Number | double, float, long, int, short, System.Double, System.Float System.Int64, System.Int32, System.Int16 |
Boolean | bool, System.Boolean |
String | System.String |
null | null |
Object | DotNetBrowser.JSObject |
Array | DotNetBrowser.JSArray |
Function | DotNetBrowser.JSFunction |
Salvando imagem de página da Web
Para tirar uma screenshot de uma página da web especificada você precisará seguir os passos abaixo:
- Criar instância
Browser
. - Definir o tamanho da
Browser
necessário. - Criar uma
BrowserView
(WPF ou WinForms) com esta instânciaBrowser
- Carregar página web necessária por sua URL ou HTML e esperar até que seu conteúdo será renderizado completamente.
- Obter Drawing.Image de Sistema da página web carregada usando
BrowserView.GetImage()
.
Note: the OnRepaint event used in the following sample is supported for lightweight rendering mode only.
The GetImage() method works for both modes, but the component should be embedded and shown before calling this method.
Exemplo
O exemplo a seguir demonstra como capturar a imagem da página web completa. Neste caso, você ainda não precisa incorporar visualização do navegador.
C#
using DotNetBrowser; using DotNetBrowser.Events; using DotNetBrowser.WPF; using System; using System.Drawing.Imaging; using System.Threading; using System.Windows; namespace HTMLToImageSample { public partial class WindowMain : Window { private WPFBrowserView browserView; public WindowMain() { this.Loaded += delegate { Width = 400; Height = 300; browserView = new WPFBrowserView(BrowserFactory.Create(BrowserType.LIGHTWEIGHT)); Browser browser = browserView.Browser; // #1 Set browser initial size browserView.Browser.SetSize(1280, 1024); // #2 Load web page and wait until web page is loaded completely. ManualResetEvent resetEvent = new ManualResetEvent(false); FinishLoadingFrameHandler listener = new FinishLoadingFrameHandler( (object sender, FinishLoadingEventArgs e) => { if (e.IsMainFrame) { resetEvent.Set(); } }); browser.FinishLoadingFrameEvent += listener; try { browser.LoadURL("teamdev.com/dotnetbrowser"); resetEvent.WaitOne(new TimeSpan(0, 0, 45)); } finally { browser.FinishLoadingFrameEvent -= listener; } // #3 Set the required document size. JSValue documentHeight = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollHeight, " + "document.documentElement.scrollHeight, document.body.offsetHeight, " + "document.documentElement.offsetHeight, document.body.clientHeight, " + "document.documentElement.clientHeight);"); JSValue documentWidth = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollWidth, " + "document.documentElement.scrollWidth, document.body.offsetWidth, " + "document.documentElement.offsetWidth, document.body.clientWidth, " + "document.documentElement.clientWidth);"); int scrollBarSize = 25; int viewWidth = (int) documentWidth.GetNumber() + scrollBarSize; int viewHeight = (int) documentHeight.GetNumber() + scrollBarSize; // #4 Register OnRepaint to get notifications // about paint events. We expect that web page will be completely rendered twice: // 1. When its size is updated. // 2. When HTML content is loaded and displayed. ManualResetEvent waitEvent = new ManualResetEvent(false); DrawingView drawingView = (DrawingView) browserView.GetInnerView(); drawingView.OnRepaint += delegate(object sender, OnRepaintEventArgs e) { // Make sure that all view content has been repainted. if (e.UpdatedRect.Size.Equals(e.ClientSize)) { waitEvent.Set(); } }; browserView.Browser.SetSize(viewWidth, viewHeight); // #5 Wait until Chromium renders web page content. waitEvent.WaitOne(); // #6 Save Image of the loaded web page into a PNG file. Dispatcher.BeginInvoke((Action) (() => { browserView.GetImage().Save(@"teamdev.png", ImageFormat.Png); } )); }; } [STAThread] public static void Main() { Application app = new Application(); WindowMain wnd = new WindowMain(); app.Run(wnd); var browser = wnd.browserView.Browser; wnd.browserView.Dispose(); browser.Dispose(); } } }
VB.NET
Imports DotNetBrowser Imports DotNetBrowser.Events Imports DotNetBrowser.WPF Imports System.Drawing.Imaging Imports System.Threading Imports System.Windows Module HTMLToImageSample Public Partial Class WindowMain Inherits Window Private browserView As WPFBrowserView Public Sub New() AddHandler Me.Loaded, sub() Width = 400 Height = 300 browserView = New WPFBrowserView(BrowserFactory.Create(BrowserType.LIGHTWEIGHT)) Dim browser As Browser = browserView.Browser browserView.Browser.SetSize(1280, 1024) Dim resetEvent As ManualResetEvent = New ManualResetEvent(False) Dim listener As FinishLoadingFrameHandler = New FinishLoadingFrameHandler(sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs) If e.IsMainFrame Then resetEvent.Set() End If End sub) AddHandler browser.FinishLoadingFrameEvent, listener Try browser.LoadURL("teamdev.com/dotnetbrowser") resetEvent.WaitOne(New TimeSpan(0, 0, 45)) Finally RemoveHandler browser.FinishLoadingFrameEvent, listener End Try Dim documentHeight As JSValue = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollHeight, " & "document.documentElement.scrollHeight, document.body.offsetHeight, " & "document.documentElement.offsetHeight, document.body.clientHeight, " & "document.documentElement.clientHeight);") Dim documentWidth As JSValue = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollWidth, " & "document.documentElement.scrollWidth, document.body.offsetWidth, " & "document.documentElement.offsetWidth, document.body.clientWidth, " & "document.documentElement.clientWidth);") Dim scrollBarSize As Integer = 25 Dim viewWidth As Integer = CInt(documentWidth.GetNumber()) + scrollBarSize Dim viewHeight As Integer = CInt(documentHeight.GetNumber()) + scrollBarSize Dim waitEvent As ManualResetEvent = New ManualResetEvent(False) Dim drawingView As DrawingView = CType(browserView.GetInnerView(), DrawingView) AddHandler drawingView.OnRepaint, sub(ByVal sender As Object, ByVal e As OnRepaintEventArgs) If e.UpdatedRect.Size.Equals(e.ClientSize) Then waitEvent.Set() End If End sub browserView.Browser.SetSize(viewWidth, viewHeight) waitEvent.WaitOne() Dispatcher.BeginInvoke(CType((sub() browserView.GetImage().Save("teamdev.png", ImageFormat.Png) End sub), Action)) End sub End Sub <STAThread> Public Shared Sub Main() Dim app As Application = New Application() Dim wnd As WindowMain = New WindowMain() app.Run(wnd) Dim browser = wnd.browserView.Browser wnd.browserView.Dispose() browser.Dispose() End Sub End Class End Module
Calculando Tamanho da Página
Se você precisa tirar screenshot da página da web inteira, incluindo roláveis partes ocultas e não sabe a dimensão da página da web, então você precisa calculá-lo usando o seguinte método:
C#
JSValue documentHeight = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollHeight, " + "document.documentElement.scrollHeight, document.body.offsetHeight, " + "document.documentElement.offsetHeight, document.body.clientHeight, " + "document.documentElement.clientHeight);"); JSValue documentWidth = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollWidth, " + "document.documentElement.scrollWidth, document.body.offsetWidth, " + "document.documentElement.offsetWidth, document.body.clientWidth, " + "document.documentElement.clientWidth);"); int scrollBarSize = 25; int viewWidth = (int) documentWidth.GetNumber() + scrollBarSize; int viewHeight = (int) documentHeight.GetNumber() + scrollBarSize;
VB.NET
Dim documentHeight As JSValue = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollHeight, " & "document.documentElement.scrollHeight, document.body.offsetHeight, " & "document.documentElement.offsetHeight, document.body.clientHeight, " & "document.documentElement.clientHeight);") Dim documentWidth As JSValue = browserView.Browser.ExecuteJavaScriptAndReturnValue( "Math.max(document.body.scrollWidth, " & "document.documentElement.scrollWidth, document.body.offsetWidth, " & "document.documentElement.offsetWidth, document.body.clientWidth, " & "document.documentElement.clientWidth);") Dim scrollBarSize As Integer = 25 Dim viewWidth As Integer = CInt(documentWidth.GetNumber()) + scrollBarSize Dim viewHeight As Integer = CInt(documentHeight.GetNumber()) + scrollBarSize
Neste código usamos o JavaScript
e DOM API` para obter a dimensão do documento carregado.
Popups
Qualquer página da web pode exibir janelas pop-up usando o recurso de JavaScript window.open()
. Por exemplo:
JavaScript
window.open("http://www.google.com", "_blank", "toolbar=yes, scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400");
A API da DotNetBrowser fornece a classe PopupHandler
para personalizar a manipulação na criação de janelas pop-up. Para personalizar as janelas de popup você precisa registrar sua própria implementação de PopupHandler
dependendo do GUI Toolkit que você usa em seu aplicativo .NET. Veja:
Desabilitar Popups
Por padrão, janelas pop-up estão habilitadas. Para desativar janelas pop-up, você deve criar sua própria implementação de PopupHandler
e retornar nulo do HandlePopup()
método, como mostrado abaixo:
C#
public class SamplePopupHandler : PopupHandler { public PopupContainer HandlePopup(PopupParams popupParams) { return null; } }
VB.NET
Public Class SamplePopupHandler Implements PopupHandler Public Function HandlePopup(ByVal popupParams As PopupParams) As PopupContainer _ Implements PopupHandler.HandlePopup Return Nothing End Function End Class
Uso:
C#
browser.PopupHandler = new SamplePopupHandler();
VB.NET
browser.PopupHandler = New SamplePopupHandler()
Eliminação de Popup
Há duas maneiras de eliminar a janela pop-up:manualmente usando o método Browser.Dispose()
e por meio de programação de JavaScript usando o recurso window.close()
. Se você usar sua própria implementação de PopupHandler
, você precisa lidar com situação quando a janela pop-up está disposto a partir de JavaScript
. Usando DisposeEvent
você pode ouvir evento quando a pop-up da instância Browser
está disposto a destruir recipiente de pop-up. Caso contrário, você pode ter o problema quando instância Browser
é descartado, mas seu recipiente é aberto e exibe o conteúdo de cinza.
O código a seguir demonstra como manipular tal situação em sua implementação de PopupHandler
:
WinForms:
C#
browser.DisposeEvent += delegate (object sender, DisposeEventArgs e) { form.BeginInvoke((Action)(() => { if(!formClosed) { form.Controls.Clear(); form.Hide(); form.Close(); formClosed = true; } })); };
VB.NET
AddHandler browser.DisposeEvent, Sub(sender, e) form.BeginInvoke(Sub() If (Not (formClosed)) Then form.Controls.Clear() form.Hide() form.Close() formClosed = True End If End Sub) End Sub
WPF:
C#
browser.DisposeEvent += delegate(object sender, DisposeEventArgs e) { Application.Current.Dispatcher.Invoke((Action)(() => { window.Content = null; window.Hide(); window.Close(); })); };
VB.NET
AddHandler browser.DisposeEvent, Sub(sender, e) Application.Current.Dispatcher.Invoke( Sub() window.Content = Nothing window.Hide() window.Close() End Sub) End Sub
Caixas de diálogo
OnBeforeUnload
O evento onbeforeunload
é acionado quando o documento está prestes a ser descarregado. Esse evento permite que você exibir uma mensagem em uma caixa de diálogo de confirmação para informar o usuário se quer ficar ou sair da página atual. A API DotNetBrowser permite a manipulação desta caixa de diálogo usando a API DialogHandler
. Por padrão, a caixa de diálogo é exibida. Usando sua implementação personalizada de DialogHandler
, você pode lidar com esta caixa de diálogo do seu jeito. Por exemplo, você pode exibir sua mensagem personalizada de diálogo ou suprimir a caixa de diálogo e não permitir a descarga de página da web.
O exemplo a seguir demonstra como manipular a caixa de diálogo onbeforeunload
:
MainWindow.xaml
<Window x:Class="WPFDialogHandlerSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpf="clr-namespace:DotNetBrowser.WPF;assembly=DotNetBrowser" Title="MainWindow" Height="350" Width="525"> <Grid Name="mainLayout"> <wpf:WPFBrowserView Name="browserView"/> </Grid> </Window>
C#
MainWindow.xaml.cs
using System; using System.Windows; using System.Windows.Controls; using DotNetBrowser; using DotNetBrowser.WPF; namespace WPFDialogHandlerSample { public partial class MainWindow : Window { public MainWindow() { // Initialize WPF Application UI. InitializeComponent(); var defaultHandler = browserView.Browser.DialogHandler; browserView.Browser.DialogHandler = new CustomDialogHandler(defaultHandler); // Load HTML from string into BrowserView. browserView.Browser.LoadHTML("<html><body onbeforeunload='return myFunction()'>" + "<a href='http://www.google.com'>Click here to leave</a>" + "<script>function myFunction() { return 'Leave this web page?'; }" + "</script></body></html>"); } } public class CustomDialogHandler : DialogHandler { private DialogHandler defaultHandler; public CustomDialogHandler(DialogHandler defaultHandler) { this.defaultHandler = defaultHandler; } public CloseStatus OnBeforeUnload(UnloadDialogParams parameters) { CloseStatus returnValue = CloseStatus.CANCEL; String title = "Confirm Navigation"; String message = parameters.Message; MessageBoxResult result = MessageBox.Show(message, title, MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { returnValue = CloseStatus.OK; } return returnValue; } public void OnAlert(DialogParams parameters) { defaultHandler.OnAlert(parameters); } public CloseStatus OnConfirmation(DialogParams parameters) { return defaultHandler.OnConfirmation(parameters); } public CloseStatus OnFileChooser(FileChooserParams parameters) { return defaultHandler.OnFileChooser(parameters); } public CloseStatus OnPrompt(PromptDialogParams parameters) { return defaultHandler.OnPrompt(parameters); } public CloseStatus OnReloadPostData(ReloadPostDataParams parameters) { return defaultHandler.OnReloadPostData(parameters); } public CloseStatus OnColorChooser(ColorChooserParams parameters) { return defaultHandler.OnColorChooser(parameters); } public CloseStatus OnSelectCertificate(CertificatesDialogParams parameters) { return defaultHandler.OnSelectCertificate(parameters); } } }
VB.NET
MainWindow.xaml.vb
Imports DotNetBrowser Namespace WPFDialogHandlerSample Class MainWindow Inherits Window Sub New() ' Initialize WPF Application UI. InitializeComponent() Dim defaultHandler = browserView.Browser.DialogHandler browserView.Browser.DialogHandler = new CustomDialogHandler(defaultHandler) ' Load HTML from string into BrowserView. browserView.Browser.LoadHTML("<html><body onbeforeunload='return myFunction()'>" + "<a href='http://www.google.com'>Click here to leave</a>" + "<script>function myFunction() { return 'Leave this web page?'; }" + "</script></body></html>") End Sub End Class Friend Class CustomDialogHandler Implements DialogHandler Private defaultHandler As DialogHandler Public Sub New(defaultHandler As DialogHandler) Me.defaultHandler = defaultHandler End Sub Public Function OnBeforeUnload(parameters As UnloadDialogParams) As CloseStatus _ Implements DialogHandler.OnBeforeUnload Dim returnValue As CloseStatus = CloseStatus.CANCEL Dim title As String = "Confirm Navigation" Dim message As String = parameters.Message Dim result As MessageBoxResult = MessageBox.Show(message, title, MessageBoxButton.YesNo, MessageBoxImage.Question) If result = MessageBoxResult.Yes Then returnValue = CloseStatus.OK End If return returnValue End Function Public Sub OnAlert(parameters As DialogParams) Implements DialogHandler.OnAlert defaultHandler.OnAlert(parameters) End Sub Public Function OnColorChooser(parameters As ColorChooserParams) As CloseStatus _ Implements DialogHandler.OnColorChooser return defaultHandler.OnColorChooser(parameters) End Function Public Function OnConfirmation(parameters As DialogParams) As CloseStatus _ Implements DialogHandler.OnConfirmation return defaultHandler.OnConfirmation(parameters) End Function Public Function OnFileChooser(parameters As FileChooserParams) As CloseStatus _ Implements DialogHandler.OnFileChooser return defaultHandler.OnFileChooser(parameters) End Function Public Function OnPrompt(parameters As PromptDialogParams) As CloseStatus Implements DialogHandler.OnPrompt return defaultHandler.OnPrompt(parameters) End Function Public Function OnReloadPostData(parameters As ReloadPostDataParams) As CloseStatus _ Implements DialogHandler.OnReloadPostData return defaultHandler.OnReloadPostData(parameters) End Function Public Function OnSelectCertificate(parameters As CertificatesDialogParams) As CloseStatus _ Implements DialogHandler.OnSelectCertificate return defaultHandler.OnSelectCertificate(parameters) End Function End Class End Namespace
Selecionar Certificado SSL
Usando a API DotNetBrowser DialogHandler
você pode lidar com situação quando na caixa de diálogo Selecionar Certificado SSL será exibido. Por padrão a DotNetBrowser exibe sua própria implementação da caixa de diálogo onde o usuário pode selecionar certificado exigido na lista de certificados disponíveis. A fim de substituir o comportamento padrão, você deve registrar a sua própria implementação da interfce DialogHandler
com substituído método DialogHandler.OnSelectCertificate(CertificatesDialogParams parameters)
. Sua implementação pode exibir sua própria caixa de diálogo ou suprimir a caixa de diálogo e selecionar certificado exigido por meio de programação.
O exemplo a seguir demonstra como substituir a implementação padrão com lógica personalizada Selecionar Certificado SSL:
C#
using System; using System.Collections.Generic; using DotNetBrowser; namespace CertificateSelectSample { /// <summary> /// Demonstrates how to handle SSL certificate selection. /// </summary> class Program { static void Main(string[] args) { Browser browser = BrowserFactory.Create(); browser.DialogHandler = new SampleDialogHandler((selectCertificateParameters) => { String message = "Select a certificate to authenticate yourself to " + selectCertificateParameters.HostPortPair.HostPort; Console.WriteLine(message); List<Certificate> certificates = selectCertificateParameters.Certificates; if (!(certificates.Count == 0)) { Object selectedValue = certificates[0]; if (selectedValue != null) { selectCertificateParameters.SelectedCertificate = ((Certificate) selectedValue); return CloseStatus.OK; } } return CloseStatus.CANCEL; }); browser.LoadURL("<URL that causes Select SSL Certificate dialog>"); } private class SampleDialogHandler : DialogHandler { private Func<CertificatesDialogParams, CloseStatus> certificateAction; public SampleDialogHandler(Func<CertificatesDialogParams, CloseStatus> certificateAction) { this.certificateAction = certificateAction; } public void OnAlert(DialogParams parameters) { } public CloseStatus OnConfirmation(DialogParams parameters) { return CloseStatus.CANCEL; } public CloseStatus OnPrompt(PromptDialogParams parameters) { return CloseStatus.CANCEL; } public CloseStatus OnFileChooser(FileChooserParams parameters) { return CloseStatus.CANCEL; } public CloseStatus OnBeforeUnload(UnloadDialogParams parameters) { return CloseStatus.CANCEL; } public CloseStatus OnSelectCertificate(CertificatesDialogParams parameters) { return certificateAction(parameters); } public CloseStatus OnReloadPostData(ReloadPostDataParams parameters) { return CloseStatus.CANCEL; } public CloseStatus OnColorChooser(ColorChooserParams parameters) { return CloseStatus.CANCEL; } } } }
VB.NET
Imports DotNetBrowser ''' <summary> '''Demonstrates how to handle SSL certificate selection. ''' </summary> Module CertificateSelectSample Sub Main() Dim browser As Browser = BrowserFactory.Create() browser.DialogHandler = new SampleDialogHandler() browser.LoadURL("<URL that causes Select SSL Certificate dialog>") End Sub Friend Class SampleDialogHandler Implements DialogHandler Public Sub OnAlert(parameters As DialogParams) Implements DialogHandler.OnAlert End Sub Public Function OnConfirmation(parameters As DialogParams) As CloseStatus _ Implements DialogHandler.OnConfirmation Return CloseStatus.CANCEL End Function Public Function OnPrompt(parameters As PromptDialogParams) As CloseStatus Implements DialogHandler.OnPrompt Return CloseStatus.CANCEL End Function Public Function OnFileChooser(parameters As FileChooserParams) As CloseStatus _ Implements DialogHandler.OnFileChooser Return CloseStatus.CANCEL End Function Public Function OnBeforeUnload(parameters As UnloadDialogParams) As CloseStatus _ Implements DialogHandler.OnBeforeUnload Return CloseStatus.CANCEL End Function Public Function OnSelectCertificate(parameters As CertificatesDialogParams) As CloseStatus _ Implements DialogHandler.OnSelectCertificate Dim message As String = "Select a certificate to authenticate yourself to " + parameters.HostPortPair.HostPort Console.WriteLine(message) Dim certificates As List(Of Certificate) = parameters.Certificates If Not (certificates.Count = 0) Then Dim selectedValue As Object = certificates.Item(0) If selectedValue IsNot Nothing Then parameters.SelectedCertificate = CType(selectedValue, Certificate) Return CloseStatus.OK End If End If Return CloseStatus.CANCEL End Function Public Function OnReloadPostData(parameters As ReloadPostDataParams) As CloseStatus _ Implements DialogHandler.OnReloadPostData Return CloseStatus.CANCEL End Function Public Function OnColorChooser(parameters As ColorChooserParams) As CloseStatus _ Implements DialogHandler.OnColorChooser Return CloseStatus.CANCEL End Function End Class End Module
Manipulação de Erros de Certificado SSL
Por padrão, que a DotNetBrowser rejeita a carregar os sites HTTPS com certificados SSL inválidos, por razões de segurança. Se você precisa ignorar certificados SSL inválidos e continuar a carregar a página da web, você pode registrar sua implementação LoadHandler
onde você decide se certificados SSL inválidos devem ser ignorados ou não.
Por exemplo:
C#
private class SampleLoadHandler : DefaultLoadHandler { public override bool OnCertificateError(CertificateErrorParams errorParams) { // Return false to ignore certificate error. return false; } }
VB.NET
Private Class SampleLoadHandler Inherits DefaultLoadHandler Public Overrides Function OnCertificateError(ByVal errorParams As CertificateErrorParams) As Boolean 'Return false to ignore certificate error. Return False End Function End Class
O parâmetro CertificateErrorParams fornece informações sobre o certificado SSL inválido. Você pode decidir se o certificado é permitido ou não usando seus detalhes.
C#
using DotNetBrowser; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CertificateErrorSample { /// <summary> /// Demonstrates how to handle SSL certificate errors. /// </summary> class Program { static void Main(string[] args) { Browser browser = BrowserFactory.Create(); browser.LoadHandler = new SampleLoadHandler(); browser.LoadURL("<https-url-with-invalid-ssl-certificate>"); } private class SampleLoadHandler : DefaultLoadHandler { public override bool OnCertificateError(CertificateErrorParams errorParams) { Certificate certificate = errorParams.Certificate; Console.WriteLine("ErrorCode = " + errorParams.CertificateError); Console.WriteLine("SerialNumber = " + certificate.SerialNumber); Console.WriteLine("FingerPrint = " + certificate.FingerPrint); Console.WriteLine("CAFingerPrint = " + certificate.CAFingerPrint); string subject = certificate.Subject; Console.WriteLine("Subject = " + subject); string issuer = certificate.Issuer; Console.WriteLine("Issuer = " + issuer); Console.WriteLine("KeyUsages = " + String.Join(", ", certificate.KeyUsages)); Console.WriteLine("ExtendedKeyUsages = " + String.Join(", ", certificate.ExtendedKeyUsages)); Console.WriteLine("HasExpired = " + certificate.HasExpired); // Return false to ignore certificate error. return false; } } } }
VB.NET
Imports DotNetBrowser Module CertificateErrorSample Sub Main() Dim browser As Browser = BrowserFactory.Create() browser.LoadHandler = New SampleLoadHandler() browser.LoadURL("<https-url-with-invalid-ssl-certificate>") End Sub Private Class SampleLoadHandler Inherits DefaultLoadHandler Public Overrides Function OnCertificateError(ByVal errorParams As CertificateErrorParams) As Boolean Dim certificate As Certificate = errorParams.Certificate Console.WriteLine("ErrorCode = " & errorParams.CertificateError) Console.WriteLine("SerialNumber = " & certificate.SerialNumber) Console.WriteLine("FingerPrint = " & certificate.FingerPrint) Console.WriteLine("CAFingerPrint = " & certificate.CAFingerPrint) Dim subject As String = certificate.Subject Console.WriteLine("Subject = " & subject) Dim issuer As String = certificate.Issuer Console.WriteLine("Issuer = " & issuer) Console.WriteLine("KeyUsages = " & String.Join(", ", certificate.KeyUsages)) Console.WriteLine("ExtendedKeyUsages = " & String.Join(", ", certificate.ExtendedKeyUsages)) Console.WriteLine("HasExpired = " & certificate.HasExpired) 'Return false to ignore certificate error. Return False End Function End Class End Module
Carregamentos de Arquivo
A DotNetBrowser fornece a API que permite tratar todos os carregamentos de arquivo. Usando esta API pode controlar de que arquivos devem ser carregados, forneça o caminho para o diretório de destino onde o arquivo deve salvar-se e acompanha o progresso de download.
Você pode registrar sua própria implementação da interface DownloadHandler
para lidar com carregamentos de arquivo do seu próprio modo. O exemplo a seguir demonstra como fazer isso:
C#
using DotNetBrowser; using DotNetBrowser.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace DownloadSample { class Program { static void Main(string[] args) { using (Browser browser = BrowserFactory.Create()) { var downloadHandler = new SampleDownloadHandler(); browser.DownloadHandler = downloadHandler; browser.LoadURL("ftp://ftp.teamdev.com/updates/jxbrowser-4.0-beta.zip"); downloadHandler.Wait(); } } class SampleDownloadHandler : DownloadHandler { private ManualResetEvent waitEvent = new ManualResetEvent(false); public bool AllowDownload(DownloadItem download) { download.DownloadEvent += delegate(object sender, DownloadEventArgs e) { DownloadItem downloadItem = e.Item; if (downloadItem.Completed) { Console.Out.WriteLine("Download is completed!"); waitEvent.Set(); } }; Console.Out.WriteLine("Destination file: " + download.DestinationFile); return true; } public void Wait() { waitEvent.WaitOne(); } } } }
VB.NET
Imports System.Threading Imports DotNetBrowser Imports DotNetBrowser.Events Module DownloadSample Sub Main() Using browser As Browser = BrowserFactory.Create() Dim downloadHandler = new SampleDownloadHandler() browser.DownloadHandler = downloadHandler browser.LoadURL("ftp://ftp.teamdev.com/updates/jxbrowser-4.0-beta.zip") downloadHandler.Wait() End Using End Sub Friend Class SampleDownloadHandler Implements DownloadHandler Private Dim waitEvent As ManualResetEvent = new ManualResetEvent(False) Public Function AllowDownload(download As DownloadItem) As Boolean Implements DownloadHandler.AllowDownload AddHandler download.DownloadEvent, sub(sender As Object, e As DownloadEventArgs) Dim downloadItem As DownloadItem = e.Item If downloadItem.Completed Then Console.Out.WriteLine("Download is completed!") waitEvent.Set() End If End sub Console.Out.WriteLine("Destination file: " + download.DestinationFile) Return True End Function Public Sub Wait() waitEvent.WaitOne() End Sub End Class End Module
A classe DownloadItem
fornece os métodos para pausar e cancelar processo de carregamento. Consulte seus métodos correspondentes.
Upload de Arquivo
Usando a API DotNetBrowser DialogHandler
Você pode lidar com a situação quando a página da web precisa exibir a caixa de diálogo de File Open (e.g. quando o usuário clica File Input em um formulário web). Usando esta API você pode exibir sua própria caixa de diálogo File Open ou suprimir a caixa de diálogo, e forneça o caminho para um arquivo de programa.
Nota: Por padrão, a DotNetBrowser exibe caixa de diálogo padrão de OpenFileChooser.
O exemplo a seguir demonstra como modificar esta lógica:
C#
using DotNetBrowser; using DotNetBrowser.Events; using DotNetBrowser.WPF; using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; namespace FileUploadSample { class Program { public class WindowMain : Window { private WPFBrowserView browserView; public WindowMain() { Browser browser = BrowserFactory.Create(); browserView = new WPFBrowserView(browser); browser.DialogHandler = new SampleDialogHandler(this); Content = browserView; Width = 1024; Height = 768; this.Loaded += WindowMain_Loaded; } void WindowMain_Loaded(object sender, RoutedEventArgs e) { browserView.Browser.LoadHTML("http://jkorpela.fi/forms/file.html"); } public class SampleDialogHandler : WPFDefaultDialogHandler { private Window windowMain; public SampleDialogHandler(Window windowMain) : base(windowMain) { // TODO: Complete member initialization this.windowMain = windowMain; } public override CloseStatus OnFileChooser(FileChooserParams parameters) { CloseStatus returnValue = CloseStatus.CANCEL; bool isOpenMode = parameters.Mode == FileChooserMode.Open; bool isOpenMultipleMode = parameters.Mode == FileChooserMode.OpenMultiple; if (isOpenMode || isOpenMultipleMode) { Application.Current.Dispatcher.Invoke((Action)(() => { OpenFileDialog fileChooser = new OpenFileDialog(); fileChooser.Multiselect = isOpenMultipleMode; fileChooser.Title = "Open"; fileChooser.FileOk += delegate { if (isOpenMultipleMode) { string[] selectedFiles = fileChooser.FileNames; parameters.SelectedFiles = String.Join("|", selectedFiles); } else { parameters.SelectedFiles = fileChooser.FileName; } returnValue = CloseStatus.OK; }; fileChooser.ShowDialog(windowMain); })); } return returnValue; } } [STAThread] public static void Main() { Application app = new Application(); WindowMain wnd = new WindowMain(); app.Run(wnd); var browser = wnd.browserView.Browser; wnd.browserView.Dispose(); browser.Dispose(); } } } }
VB.NET
Imports System.Windows Imports DotNetBrowser Imports DotNetBrowser.WPF Imports Microsoft.Win32 Module Module1 Public Class WindowMain Inherits Window Public Dim browserView As WPFBrowserView Public Sub New() Dim browser As Browser = BrowserFactory.Create() browserView = New WPFBrowserView(browser) browser.DialogHandler = New SampleDialogHandler(Me) Content = browserView Width = 1024 Height = 768 AddHandler Me.Loaded, AddressOf WindowMain_Loaded End Sub Private Sub WindowMain_Loaded(sender As Object, e As RoutedEventArgs) browserView.Browser.LoadURL("http://jkorpela.fi/forms/file.html") End Sub Public Class SampleDialogHandler Inherits WPFDefaultDialogHandler Private windowMain As Window Public Sub New(windowMain As Window) MyBase.New(windowMain) Me.windowMain = windowMain End Sub Public Overloads Function OnFileChooser(ByVal parameters As FileChooserParams) As CloseStatus Dim returnValue As CloseStatus = CloseStatus.CANCEL Dim isOpenMode As Boolean = parameters.Mode = FileChooserMode.Open Dim isOpenMultipleMode As Boolean = parameters.Mode = FileChooserMode.OpenMultiple If isOpenMode Or isOpenMultipleMode Then System.Windows.Application.Current.Dispatcher.Invoke(Sub() Dim fileChooser As OpenFileDialog = New OpenFileDialog() fileChooser.Multiselect = isOpenMultipleMode fileChooser.Title = "Open" AddHandler fileChooser.FileOk, sub() If isOpenMultipleMode Then Dim selectedFiles As String() = fileChooser.FileNames parameters.SelectedFiles = String.Join("|", selectedFiles) Else parameters.SelectedFiles = fileChooser.FileName End If returnValue = CloseStatus.OK End sub fileChooser.ShowDialog(windowMain) End Sub) End If Return returnValue End Function End Class End Class <STAThread> Sub Main() Dim app As Application = New Application() Dim wnd As WindowMain = New WindowMain() app.Run(wnd) Dim browser = wnd.browserView.Browser wnd.browserView.Dispose() browser.Dispose() End Sub End Module
Plugins
Sobre Plugins
A DotNetBrowser herda a Google Chromium Plugin Architecture, mas ela pode exibir apenas plugins sem janelas, porque ela usa um componente leve para exibir páginas HTML. Windowless plugins are designed to run directly within the rendering pipeline. Right now only Flash and Silverlight supports windowless mode, so they can be displayed by DotNetBrowser.
Note: Since version 1.7, NPAPI plugins are no longer supported.
If you have to use NPAPI plugins, we recommend that you stick to DotNetBrowser versions up to 1.7
Gerenciador de Plugins
Para obter informações sobre todos os plugins instalados e disponíveis, você pode usar o método PluginManager.GetPluginsInfo()
:
C#
PluginManager pluginManager = browser.PluginManager; foreach (PluginInfo pluginInfo in pluginManager.GetPluginsInfo()) { Console.WriteLine("Plugin name: " + pluginInfo.Name); }
VB.NET
Dim pluginManager As PluginManager= browser.PluginManager For Each pluginInfo As PluginInfo In pluginManager.GetPluginsInfo() Console.WriteLine("Plugin name: " + pluginInfo.Name) Next
Para ativar/desativar o plugin especificado registre sua própria implementação PluginFilter
:
C#
class CustomPluginFilter : PluginFilter { public bool IsPluginAllowed(PluginInfo pluginInfo) { return pluginInfo.MimeTypes.Contains("application/pdf"); } }
pluginManager.PluginFilter = new CustomPluginFilter();
VB.NET
Class CustomPluginFilter Implements PluginFilter Public Function IsPluginAllowed(pluginInfo As PluginInfo) As Boolean Implements PluginFilter.IsPluginAllowed Return pluginInfo.MimeTypes.Contains("application/pdf") End Function End Class
pluginManager.PluginFilter = New CustomPluginFilter()
Agente de usuário
A cadeia de caracteres do agente de usuário pode ser modificada apenas uma vez, antes de criar quaisquer instâncias Browser
. Você pode fornecer sua própria cadeia de caracteres do agente de usando o método BrowserPreferences.SetUserAgent(String userAgent)
:
C#
BrowserPreferences.SetUserAgent("My User Agent String");
VB.NET
BrowserPreferences.SetUserAgent("My User Agent String")
Exemplo
MainWindow.xaml
<Window x:Class="WPF.UserAgent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid Name="mainLayout"> </Grid> </Window>
C#
MainWindow.xaml.cs
using System; using System.IO; using DotNetBrowser; using DotNetBrowser.WPF; using System.Windows; namespace WPF.UserAgent { public partial class MainWindow : Window { Browser browser; WPFBrowserView browserView; public MainWindow() { BrowserPreferences.SetUserAgent("My User Agent String"); InitializeComponent(); browser = BrowserFactory.Create(); browserView = new WPFBrowserView(browser); mainLayout.Children.Add(browserView); browser.UserAgent = "Modified User Agent String"; browserView.Browser.LoadURL("http://whatsmyuseragent.com/"); } } }
VB.NET
MainWindow.xaml.vb
Imports DotNetBrowser Imports DotNetBrowser.WPF Namespace WPF.UserAgent Class MainWindow Dim browser As Browser Dim browserView As WPFBrowserView Public Sub New() BrowserPreferences.SetUserAgent("My User Agent String") InitializeComponent() browser = BrowserFactory.Create() browserView = New WPFBrowserView(browser) mainLayout.Children.Add(browserView) browser.UserAgent = "Modified User Agent String" browserView.Browser.LoadURL("http://whatsmyuseragent.com/") End Sub End Class End Namespace