【go语言】Chromeless简介及Chromedp库实现模拟登录截屏

一、什么是Chromeless

chromeless 是一个基于 Node.js 的库,用于通过无头浏览器(Headless Chrome)进行自动化测试和网页截图。它允许开发者使用 JavaScript 脚本来控制和操作浏览器,而无需实际打开浏览器窗口。

以下是一些 chromeless 的主要特性和用法:

  1. 基于 Chrome DevTools Protocol:chromeless 使用 Chrome DevTools Protocol(CDP)与浏览器进行通信。这允许对浏览器进行底层的控制和操作。
  2. 支持无头模式: 由于使用 Headless Chrome,chromeless 在执行测试和脚本时不会显示实际的浏览器界面,从而提高了效率。
  3. 链式调用:chromeless 的 API 设计允许使用链式调用,使代码看起来更清晰和易读。
  4. 截图和PDF生成: 可以使用 chromeless 进行页面截图和生成 PDF 文件,这对于测试和生成报告非常有用。
  5. 表单提交和用户交互: 支持模拟用户在页面上的交互,比如点击、输入文本等操作。
  6. 异步执行:chromeless 支持异步操作,可以等待页面加载完成或等待特定的事件发生。

以下是一个简单的 chromeless 示例:

const { Chromeless } = require('chromeless');async function run() {const chromeless = new Chromeless();const screenshot = await chromeless.goto('https://www.example.com').screenshot();console.log(screenshot); // 返回截图的 Bufferawait chromeless.end();
}run().catch(console.error);

在这个示例中,chromeless 打开了一个 Headless Chrome 浏览器,导航到了 https://www.example.com,然后截取了页面的屏幕截图。这只是 chromeless 的基本用法,它提供了更多的功能,可以满足自动化测试和其他网页操作的需求。

二、go语言中的实现

在 Go 语言中,要使用无头浏览器进行自动化测试和网页操作,可以考虑使用一些第三方库。以下是一些常见的用于在 Go 中进行无头浏览器测试的库:

1. Chromedp:Chromedp 是一个基于 Chrome DevTools Protocol 的库,允许你在无头浏览器中执行操作。它提供了对 Chrome DevTools 的直接访问,以及一些高级功能,如截图、模拟用户输入等。GitHub 地址:GitHub - chromedp/chromedp: A faster, simpler way to drive browsers supporting the Chrome DevTools Protocol.

  package mainimport ("context""log""github.com/chromedp/chromedp")func main() {ctx, cancel := chromedp.NewContext(context.Background())defer cancel()var buf []byteif err := chromedp.Run(ctx,chromedp.Navigate("https://www.example.com"),chromedp.CaptureScreenshot(&buf),); err != nil {log.Fatal(err)}// 处理截图数据(buf)}

2. Headless Chrome with Puppeteer Go:Headless Chrome with Puppeteer Go 是一个使用 Puppeteer 和 Go 的库,使得在 Go 中能够方便地控制 Chrome 浏览器。GitHub 地址:https://github.com/dtinth/puppeteer-go

package mainimport ("fmt""github.com/dtinth/puppeteer-go")func main() {browser, _ := puppeteer.Launch(puppeteer.DefaultArgs, puppeteer.Debug(false))defer browser.Close()page, _ := browser.NewPage()page.Navigate("https://www.example.com")page.Screenshot("screenshot.png")}

这两个库都提供了在 Go 中控制无头浏览器进行测试和网页操作的能力。选择其中一个库取决于你的具体需求和喜好。

三、简单实操实现登录截屏

package main
import ("context""github.com/chromedp/cdproto/cdp""github.com/chromedp/chromedp""log""os"
)
func main() {// 创建登录阶段的上下文ctxLogin, cancelLogin := chromedp.NewContext(context.Background())defer cancelLogin()// 定义变量分别用于存储两个阶段的截图var bufLogin []bytevar nodes []*cdp.Node// 登录阶段if err := chromedp.Run(ctxLogin,chromedp.Navigate("https://shimo.im/login"),//等待页面加载chromedp.WaitVisible(`[name="account"]`, chromedp.ByQuery),//输入账号和密码chromedp.SendKeys(`[name="account"]`, "zhangsan@shimo.im", chromedp.ByQuery),chromedp.SendKeys(`[name="password"]`, "woshizhangsan", chromedp.ByQuery),//点击同意协议和登录按钮chromedp.Click(`div.StyledCheckBox-sc-RjILa-1`, chromedp.ByQuery),chromedp.Click(`div[type="black"] button[data-test="btn-submit"]`, chromedp.ByQuery),//等待加载chromedp.WaitVisible(`.StyledUserCardContainer-sc-RevvT-9`, chromedp.ByQuery),chromedp.CaptureScreenshot(&bufLogin),); err != nil {log.Fatal(err)}if err := os.WriteFile("elementScreenshot.png", bufLogin, 0o644); err != nil {log.Fatal(err)}
}

chromedp使用例子:GitHub - chromedp/examples: chromedp code examples.

chromedp源码地址:GitHub - chromedp/chromedp: A faster, simpler way to drive browsers supporting the Chrome DevTools Protocol.

以下是chromedp库中常用函数:

chromedp.NewContext() 初始化chromedp的上下文,后续这个页面都使用这个上下文进行操作

chromedp.Run() 运行一个chrome的一系列操作

chromedp.Navigate() 将浏览器导航到某个页面

chromedp.WaitVisible() 等候某个元素可见,再继续执行。

chromedp.Click() 模拟鼠标点击某个元素

chromedp.Value() 获取某个元素的value值

chromedp.ActionFunc() 再当前页面执行某些自定义函数

chromedp.Text() 读取某个元素的text值

chromedp.Evaluate() 执行某个js,相当于控制台输入js

network.SetExtraHTTPHeaders() 截取请求,额外增加header头

chromedp.SendKeys() 模拟键盘操作,输入字符

chromedp.Nodes() 根据xpath获取某些元素,并存储进入数组

chromedp.NewRemoteAllocator

chromedp.OuterHTML() 获取元素的outer html

chromedp.Screenshot() 根据某个元素截图

page.CaptureScreenshot() 截取整个页面的元素

chromedp.Submit() 提交某个表单

chromedp.WaitNotPresent() 等候某个元素不存在,比如“正在搜索。。。”

chromedp.Tasks{} 一系列Action组成的任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GET和POST请求

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、GET请求二、POST请求三.幂等性是什么总结 前言 GET和POST是HTTP协议中的两种常见的请求方法,它们定义了客户端与服务器之间进行通信时的不同方…

STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1 、时钟树配置 3.1.2、外设参数配置 3.1.3 、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 …

Linux性能优化全景指南

Part1 Linux性能优化 1、性能优化性能指标 高并发和响应快对应着性能优化的两个核心指标:吞吐和延时 应用负载角度:直接影响了产品终端的用户体验系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资源已经到达瓶颈,但…

深度学习在自然语言处理中的应用

深度学习在自然语言处理中的应用 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)作为其重要分支,已经在诸多领域取得了令人瞩目的成果。深度学习作为当前最炙手可热的技术,为NLP带来了革命性的变革。本文将…

python+django网上银行业务综合管理系统vue_bvj8b

本课题主要研究如何用信息化技术改善传统网上银行综合管理行业的经营和管理模式,简化网上银行综合管理的难度,根据管理实际业务需求,调研、分析和编写系统需求文档,设计编写符合银行需要的系统说明书,绘制数据库结构模…

一周中的第几天

一周中的第几天 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date;class Solution {public String dayOfTheWeek(int day, int month, int year) {String[] weekDays {&qu…

【论文阅读】Self-Paced Curriculum Learning

论文下载 代码 Supplementary Materials bib: INPROCEEDINGS{,title {Self-Paced Curriculum Learning},author {Lu Jiang and Deyu Meng and Qian Zhao and Shiguang Shan and Alexander Hauptmann},booktitle {AAAI},year {2015},pages {2694--2700} }1. 摘…

php获取访客IP、UA、操作系统、浏览器等信息

最近有个需求就是获取下本地的ip地址、网上搜索了相关的教程,总结一下分享给大家、有需要的小伙伴可以参考一下 一、简单的获取 User Agent 信息代码: echo $_SERVER[HTTP_USER_AGENT]; 二、获取访客操作系统信息: /** * 获取客户端操作系统信息,包括win10 * pa…

R语言【base】——stop():停止执行当前表达式并执行错误操作。

Package base version 4.2.0 Parameters stop(..., call. TRUE, domain NULL)geterrmessage() 参数【...】:零个或多个对象,这些对象可以强制转换为字符(并且粘贴在一起,没有分隔符)或单个条件对象。 参数【call.…

Linux面试题 5

请描述一下 ping 命令。 答:ping 命令用于测试和诊断网络连接是否正常以及计算机之间的延迟。它发送 ICMP 回显请求报文到目标主机,然后等待目标主机返回 ICMP 回显应答报文,从而判断网络连接状态和延迟。 在 Linux 中,如何使用 …

Error in onLoad hook: “URIError: URI malformed“ found in…报错处理以及完善uniapp针对对象传参

使用uniapp传参的过程中遇到这么一个问题,当我们需要传整个对象作为参数时,我会先将这个对象先编码,然后再解码,从而获取到怎么参数,平常实操的时候也没有遇到过问题,但是今天测试的时候,刚好一…

SAP缓存 表缓存( Table Buffering)

本文主要介绍SAP中的表缓存在查询数据,更新数据时的工作情况以及对应概念。 SAP表缓存的工作 查询数据 更新数据 删除数据 表缓存的概念 表缓存技术设置属性 不允许缓冲: 允许缓冲,但已关闭: 缓冲已激活: 已…

搜索引擎推广的实践技巧提升你的品牌影响力-华媒舍

搜索引擎推广是一种有效提升品牌影响力的推广策略。通过关键词优化、广告创意设计、定向投放和数据分析与优化等实践技巧,可以提高品牌的知名度、点击率和转化率。在实施引擎霸屏推广之前,还需对实践效果进行评估,以确保推广策略的有效性和适…

鸿蒙Harmony(七)ArkUI--循环foreachList组件自定义组件

循环foreach import Prompt from system.promptclass Item {icon: Resourcename: stringprice: numberconstructor(icon: Resource, name: string, price: number) {this.icon iconthis.name namethis.price price} }Entry Component struct Index {State message: string …

k8s报错处理

解决failed to verify certificate: x509报错问题 [rootmaster1 home]# kubectl get nodes Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” …

百度地图添加坐标点

​​​​​​html <!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>查看签到信息-地图…

深度学习框架:Tensorflow和pytorch、PaddlePaddle比较

Tensorflow和pytorch、PaddlePaddle都是非常优秀的深度学习框架&#xff0c;它们各自有着独特的优势和特点。下面是它们之间的一些比较&#xff1a; 易用性&#xff1a; PyTorch&#xff1a;以简洁、直观的设计思想著称&#xff0c;易于学习和使用。它采用动态图模式&#xf…

钡铼技术集IO数据采集可编程逻辑控制PLC无线4G环保物联网关

背景 数据采集传输对于环保企业进行分析和决策是十分重要的&#xff0c;而实时数据采集更能提升环保生产的执行力度&#xff0c;从而采取到更加及时高效的措施。因此实时数据采集RTU成为环保企业的必备产品之一。 产品介绍 在推进环保行业物联网升级过程中&#xff0c;环保RTU在…

楼宇智慧能源消耗监测管理系统,楼宇中的能源“管家”

随着人口的增加&#xff0c;楼宇数据呈上涨趋势&#xff0c;但是楼宇智能建设在我国普及性远远不足&#xff0c;相比传统楼宇控制&#xff0c;智能楼宇控制系统对于楼宇内部的用电设备控制&#xff0c;能够更加的节约能源&#xff0c;降低成本。对于现代化楼宇而言&#xff0c;…

一款超酷的一体化网站测试工具:Web-Check

Web-Check 是一款功能强大的一体化工具&#xff0c;用于发现网站/主机的相关信息。用于检查网页的工具&#xff0c;用于确保网页的正确性和可访问性。它可以帮助开发人员和网站管理员检测网页中的错误和问题&#xff0c;并提供修复建议。 它只需要输入一个网站就可以查看一个网…