-
VB.net使用CefSharp笔记
注意事项
CefSharp目前的稳定版本只支持.NET 4.5.2环境,所以在创建项目的时候一定要选准.Net的版本号
获取js执行返回值
Imports CefSharp
Imports CefSharp.WinForms
Public Class Form1
'定义cef浏览器控件的全局变量,方便后面调用,注意WithEvents
Private WithEvents browser As ChromiumWebBrowser
Public Sub New()
' 此调用是设计器所必需的。
InitializeComponent()
' 设置cef控件菜单语言为中文
Dim settings As New CefSettings() With {
.Locale = "zh-CN"
}
CefSharp.Cef.Initialize(settings)
'初始化cef浏览器控件样式和默认打开的地址,并将其加入到Panel控件中
browser = New ChromiumWebBrowser("about:blank") With {
.Dock = DockStyle.Fill
}
Panel2.Controls.Add(browser)
'手动跳转新的地址
browser.Load("http://mail.qq.com")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'从textbox中获取内容当做url扔给cef访问
Dim url = TextBox1.Text
browser.Load(url)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'调用cef执行js代码并返回结果,这里使用js原生函数querySelector通过css选择器获取dom的值
Dim js As String = "document.querySelector('.login_pictures_txt').innerText"
Dim html_task As Task(Of JavascriptResponse) = browser.EvaluateScriptAsync(js, timeout:=Nothing)
'阻塞等待task任务结束
html_task.Wait()
RichTextBox1.Text = html_task.Result.Result
End Sub
End Class
获取异步加载页面的HTML代码
比较简单粗暴有效的方法:使用Timer循环在页面中执行js通过css选择器去找加载完成后才会出现的dom元素个数,大于0则可认定为页面加载完成了.
Imports CefSharp
Imports CefSharp.WinForms
Public Class SingleBrowser
Private browser As ChromiumWebBrowser
Private WithEvents get_html_tm As New Timer() With {.Interval = 200} '获取页面HTML的计时器
Public Sub New()
' 此调用是设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
Dim settings As New CefSettings With {
.Locale = "zh-CN",
.CachePath = Application.StartupPath & "\Cache"
}
CefSharp.Cef.Initialize(settings)
browser = New ChromiumWebBrowser("about:blank") With {
.Dock = DockStyle.Fill
}
Panel2.Controls.Add(browser)
End Sub
Private Sub startBtn_Click(sender As Object, e As EventArgs) Handles startBtn.Click
'处理URL路由
Dim url As String = url_textbox.Text
'加载文本框中的地址,比如淘宝的搜索结果页面
browser.Load(url)
'开始计时器工作
get_html_tm.Start()
End Sub
''' <summary>
''' 判断淘宝搜索结果页面是否加载完毕
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Async Sub get_html_tick(sender As Object, e As EventArgs) Handles get_html_tm.Tick
Dim js As String = "document.querySelectorAll('.pic-link').length"
Dim result As Integer = doJs(js)
If result > 0 Then
get_html_tm.Stop()
'加载完毕,开始获取HTML内容
Dim html As String = Await browser.GetSourceAsync()
Console.WriteLine("----加载HTML成功")
Console.Write(html)
End If
End Sub
''' <summary>
''' 在浏览器中执行js
''' </summary>
''' <param name="js"></param>
''' <returns>返回js执行结果,object对象或者nothing</returns>
Private Function doJs(ByVal js As String)
If Not browser.IsLoading Then
Dim js_task As Task(Of JavascriptResponse) = browser.EvaluateScriptAsync(js)
js_task.Wait()
Return js_task.Result.Result
Else
Return Nothing
End If
End Function
End Class
使用AngleSharp解析HTML
Imports AngleSharp
Public Class SingleBrowser
Private parser As New AngleSharp.Parser.Html.HtmlParser() 'HTML解析器
Private Sub dealHtml(Byval html as String)
'解析HTML为AngleSharp的IHtmlDocument对象
Dim doc = parser.Parse(html)
'通过css选择器筛选出符合条件的dom元素集合
Dim link_list = doc.QuerySelectorAll(".pic-link")
'遍历dom集合进行处理
For Each link In link_list
'获取dom的文本内容
Console.WriteLine(link.TextContent())
'获取dom的属性href
Console.WriteLine(link.GetAttribute("href"))
Next
End Sub
使用offscreen在后台隐式获取指定页面的HTML
注意:需要另外从NuGet上安装CefSharp.Offscreen的包包
Imports CefSharp
Imports CefSharp.OffScreen
Public Class offscreen
Private browser As ChromiumWebBrowser
Public Sub New()
' 此调用是设计器所必需的。
InitializeComponent()
' 允许多线程间修改主UI线程的控件内容
CheckForIllegalCrossThreadCalls = False
Dim settings As New CefSettings() With {
.Locale = "zh-CN"
}
CefSharp.Cef.Initialize(settings)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
browser = New ChromiumWebBrowser("mail.qq.com")
AddHandler browser.LoadingStateChanged, AddressOf doneLoad
Catch ex As Exception
TextBox1.Text = ex.Message
End Try
End Sub
''' <summary>
''' 处理browser对象加载状态发生改变时的事件
''' 注意括号中的参数必须与browser.LoadingStateChanged签名一致
''' 所谓签名一致,就是括号里面参数的数量、类型一致(不知道这样理解对不对) '''
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Async Sub doneLoad(ByVal sender As Object, ByVal e As LoadingStateChangedEventArgs)
'如果browser不是处于loading状态
If Not e.IsLoading Then
'移除绑定的当前事件(即当前事件只触发一次)
RemoveHandler browser.LoadingStateChanged, AddressOf doneLoad
'手动设置的等待1秒,让browser渲染完毕
Threading.Thread.Sleep(1000)
'阻塞等待(异步)获取browser中的源代码
Dim html As String = Await browser.GetSourceAsync()
TextBox1.Text = html
End If
End Sub
End Class
————————————————
版权声明:本文为CSDN博主「DexterLien」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lpwmm/article/details/103060133
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式