• 教程五 在Go中使用Energy创建跨平台GUI - 执行开发者工具方法


    教程-示例-文档 


    介绍

    本文介绍在Energy中如何执行开发者工具方法

    开发者工具方法,可以设置浏览器头,模拟仿真设备等.


    使用方式

    • 字典对象创建

    cef.NewCefDictionaryValue()
    • 字典对象是key=value方式, chromium定义的字典名称和对应的值,通过字典对象设置执行的参数
      • 字典对象有五种类型
      1. 字典本身类型 ICefDictionaryValue
      2. 字符串 String
      3. 整型  Int
      4. 浮点  Double
      5. 布尔  Boolean
    • 示例 - 创建字典

    1. //字典对象
    2. var dict = cef.NewCefDictionaryValue()
    3. //根据chromium字典设置
    4. dict.SetInt("width", 500)
    5. dict.SetBoolean("mobile", true)
    6. dict.SetDouble("deviceScaleFactor", 1)
    7. dict.SetString("type", "portraitPrimary")
    8. TempDict := cef.NewCefDictionaryValue()
    9. dict.SetDictionary("screenOrientation", TempDict)

    • 执行开发者工具方法

    Chromium().ExecuteDevToolsMethod(messageId, name, dict)
    • 示例 - 调用访真设备方法
    1. //字典对象
    2. var dict = cef.NewCefDictionaryValue()
    3. //根据chromium字典设置
    4. dict.SetInt("width", 500)
    5. dict.SetInt("height", 768)
    6. dict.SetInt("x", 100)
    7. dict.SetInt("y", 100)
    8. dict.SetBoolean("mobile", true)
    9. dict.SetDouble("deviceScaleFactor", 1)
    10. TempDict := cef.NewCefDictionaryValue()
    11. TempDict.SetString("type", "portraitPrimary")
    12. TempDict.SetInt("angle", 0)
    13. dict.SetDictionary("screenOrientation", TempDict)
    14. //执行方法
    15. windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setDeviceMetricsOverride", dict)
    • 示例 - 设置浏览器 userAgent
    1. dict := cef.NewCefDictionaryValue()
    2. dict.SetString("userAgent", "Mozilla/5.0 (Linux; Android 11; M2102K1G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36")
    3. windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setUserAgentOverride", dict)

    完整示例

    一如既往先配置好go和energy环境, 然后创建一个main函数来创建应用

    这个示例稍微有点复杂,使用了事件机制内置资源内置http服务

    内置http服务

    启用了Energy简单的内置http服务-参考: 示例-内置http服务

    1. //在主进程启动成功之后执行
    2. //在这里启动内置http服务
    3. //内置http服务需要使用 go:embed resources 内置资源到执行程序中
    4. cef.SetBrowserProcessStartAfterCallback(func(b bool) {
    5. fmt.Println("主进程启动 创建一个内置http服务")
    6. //通过内置http服务加载资源
    7. server := assetserve.NewAssetsHttpServer()
    8. server.PORT = 22022 //服务端口号
    9. server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
    10. server.Assets = &resources
    11. go server.StartHttpServer()
    12. })

    事件监听

    在应用初始化时使用 SetOnEvent 函数,监听Go消息事件

    1. ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
    2. })

    通过 event.On 来监听一个事件

    1. event.On(eventName, func(context ipc.IIPCContext){
    2. })

    事件触发

    在web端使用js代码,ipc.emit 触发go监听的事件

    ipc.emit(eventName,[callback function]);
    • Go示例代码
    1. package main
    2. import (
    3. "embed"
    4. "fmt"
    5. "github.com/energye/energy/cef"
    6. "github.com/energye/energy/common/assetserve"
    7. "github.com/energye/energy/ipc"
    8. )
    9. //资源目录,内置到执行程序中
    10. //go:embed resources
    11. var resources embed.FS
    12. func main() {
    13. //全局初始化 每个应用都必须调用的
    14. cef.GlobalCEFInit(nil, &resources)
    15. //创建应用
    16. cefApp := cef.NewApplication(nil)
    17. //主窗口的配置
    18. //指定一个URL地址,或本地html文件目录
    19. cef.BrowserWindow.Config.DefaultUrl = "http://localhost:22022/execute-dev-tool-method.html"
    20. //chromium配置
    21. config := cef.NewChromiumConfig()
    22. config.SetEnableMenu(true) //启用右键菜单
    23. config.SetEnableDevTools(true) //启用开发者工具
    24. cef.BrowserWindow.Config.SetChromiumConfig(config)
    25. //这里演示使用ipc通信实现js和go互相调用,在go监听事件中执行开发者工具方法
    26. //使用内置http服务和自定义页面
    27. //这里执行的方法是仿真移动端
    28. //1. js使用ipc.emit触发 go事件
    29. //2. go中"execute-dev-method"事件执行,通过context获得browserId
    30. //3. 通过browserId获得chromium
    31. //4. 使用字典对象传递方法参数
    32. //5. 点击Note链接
    33. ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
    34. event.On("execute-dev-method", func(context ipc.IIPCContext) {
    35. //获得当前窗口信息
    36. windowInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
    37. //字典对象
    38. var dict = cef.NewCefDictionaryValue()
    39. //根据chromium字典设置
    40. dict.SetInt("width", 500)
    41. dict.SetInt("height", 768)
    42. dict.SetInt("x", 100)
    43. dict.SetInt("y", 100)
    44. dict.SetBoolean("mobile", true)
    45. dict.SetDouble("deviceScaleFactor", 1)
    46. TempDict := cef.NewCefDictionaryValue()
    47. TempDict.SetString("type", "portraitPrimary")
    48. TempDict.SetInt("angle", 0)
    49. dict.SetDictionary("screenOrientation", TempDict)
    50. windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setDeviceMetricsOverride", dict)
    51. //设置浏览器 userAgent
    52. dict = cef.NewCefDictionaryValue()
    53. dict.SetString("userAgent", "Mozilla/5.0 (Linux; Android 11; M2102K1G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36")
    54. windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setUserAgentOverride", dict)
    55. })
    56. })
    57. //在主进程启动成功之后执行
    58. //在这里启动内置http服务
    59. //内置http服务需要使用 go:embed resources 内置资源到执行程序中
    60. cef.SetBrowserProcessStartAfterCallback(func(b bool) {
    61. fmt.Println("主进程启动 创建一个内置http服务")
    62. //通过内置http服务加载资源
    63. server := assetserve.NewAssetsHttpServer()
    64. server.PORT = 22022 //服务端口号
    65. server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
    66. server.Assets = &resources
    67. go server.StartHttpServer()
    68. })
    69. //运行应用
    70. cef.Run(cefApp)
    71. }
    • html示例代码
    1. "en">
    2. "UTF-8">
    3. 执行开发者工具方法
    4. "overflow: hidden;margin: 0px;padding: 0px;">

    示例效果图

  • 相关阅读:
    RADServer应用程序的交钥匙应用程序基础
    【RocketMQ】sendDefaultImpl call timeout 问题及其解决办法
    软件测试/测试开发丨为什么接口自动化测试是提升职业技能的关键?
    【TES605】基于Virtex-7 FPGA的高性能实时信号处理平台
    【经验分享】如何构建openGauss开发编译提交一体化环境
    Vue3组合式API
    如何保障UDP传输中数据文件不丢失?
    vite-vue3-ts 搭建项目时 项目中使用 @ 指代 src
    讲解实例+详细介绍@Resource与@Autowired注解的区别(全网最全)
    好奇宝宝看 Docker 底层原理(上)
  • 原文地址:https://blog.csdn.net/snxamdf/article/details/128062661