×

chromedp使用入门

admin admin 发表于2024-02-24 10:40:56 浏览45 评论0

抢沙发发表评论

案例演示: https://github.com/chromedp/examples 这个项目


一些常见的方法:

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组成的任务


简单案例


package main
 
import (
 "context"
 "fmt"
 "log"
 
 "github.com/chromedp/cdproto/cdp"
 "github.com/chromedp/chromedp"
)
 
func main() {
 
 ctx, cancel := chromedp.NewContext(
  context.Background(),
  chromedp.WithLogf(log.Printf),
 )
 defer cancel()
 
 var nodes []*cdp.Node
 err := chromedp.Run(ctx,
  chromedp.Navigate("https://www.cnblogs.com/"),
  chromedp.WaitVisible(`#footer`, chromedp.ByID),
  chromedp.Nodes(`.//a[@class="titlelnk"]`, &nodes),
 )
 if err != nil {
  log.Fatal(err)
 }
 
 fmt.Println("get nodes:", len(nodes))
 // print titles
 for _, node := range nodes {
  fmt.Println(node.Children[0].NodeValue, ":", node.AttributeValue("href"))
 }
}



常用API

chromedp.Navigate("https://xxxx") // 跳转的url
chromedp.WaitVisible(`#username`, chromedp.ByID), //  使用chromedp.ByID选择器。所以就是等待id=username的标签元素加载完。
chromedp.SendKeys(`#username`, "username", chromedp.ByID), // 使用chromedp.ByID选择器。向id=username的标签输入username。
chromedp.SetValue 设置值,和sendkey不同的是,如果原有的输入框中有内容,sendkey不会清空原来的值,setva
chromedp.Value(`#input1`, val1, chromedp.ByID), // 获取id=input1的值,并把值传给val1
chromedp.Click("btn-submit",chromedp.Bysearch), // 触发点击事件,
chromedp.Screenshot(`#row`, &buf, chromedp.ByID), // 截图id=row的标签,把值传入buf 需要事先定义var buf []byte 
chromedp.ActionFunc(func(context.Context, cdp.Executor) error { // 将图片写入文件
 return ioutil.WriteFile("test.png", buf, 0644)
}),



常用选择器


chromedp.BySearch // 如果不写,默认会使用这个选择器,类似devtools ctrl+f 搜索
chromedp.ByID // 只id来选择元素
chromedp.ByQuery // 根据document.querySelector的规则选择元素,返回单个节点
chromedp.ByQueryAll // 根据document.querySelectorAll返回所有匹配的节点
chromedp.ByNodeIP // 检索特定节点(必须先有分配的节点IP),这个暂时没用过也没看到过例子,如果有例子可以发给我看下