编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

golang + selenium + xpath 实现web自动化案例

wxchong 2024-07-25 13:33:22 开源技术 16 ℃ 0 评论

1 . 安装

go get github.com/antchfx/htmlquery
//安装xpath解析
go get github.com/tebeka/selenium
//安装selenium控制浏览器

下载"chromedriver.exe",版本要与chrome浏览器一致.

2 . 启动远程web驱动

./chromedriver.exe --port=9515 --url-base=wd/hub --verbose

这里推荐使用远程模式 . 因为本地端启动的话 , 首先要配置驱动程序 , 并且启动速度没有远程的快 .

3 . 源码及解读

package main

import (
   "fmt"
   "github.com/antchfx/htmlquery"
   "github.com/tebeka/selenium"
   "log"
   "strings"
   "time"
)

func main() {
   // 连接到本地运行的WebDriver实例。
   // 功能配置WebDriver进程和目标浏览器,带有标准和特定于浏览器的选项。
   caps := selenium.Capabilities{"browserName": "chrome"}
   //NewRemote创建新的远程客户端,启动一个新的会话。
   //urlPrefix:Selenium服务器的URL必须以协议(http, https,…)为前缀。
   //如果urlPrefix是空字符串,则默认使用DefaultURLPrefix。
   wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:9515/wd/hub"))

   if err != nil {
      panic(err.Error())
   }
   //Quit结束当前会话。
   //浏览器实例将被关闭。
   defer func(wd selenium.WebDriver) {
      _ = wd.Quit()
   }(wd)
   //Get将浏览器打开提供的URL。
   _url := "https://www.baidu.com/"
   if err := wd.Get(_url); err != nil {
      panic(err)
   }

   for {
      //PageSource返回当前页面的源代码。
      _, err := wd.PageSource()
      if err != nil {
         return
      }
      //获取当前的url
      currentURL, err := wd.CurrentURL()
      if err != nil {
         return
      }
      log.Println(wd.CurrentURL())
      //判断当前url是不是百度
      if currentURL == "https://www.baidu.com/" {
         //首先找到输入的搜索框
         element, err := wd.FindElement("id", "kw")
         //如果找不到,就等待1秒
         if err != nil {
            time.Sleep(time.Second)
         }
         //如果等待1秒后,或者已经找到,就 输入内容hello
         err = element.SendKeys("hello")
         if err != nil {
            time.Sleep(time.Second)
         }
         // 获取页面的源码
         pageSource, err := wd.PageSource()
         if err != nil {
            return
         }
         //申明1个reader类型 , 因为htmlquery.Parse的参数要求是reader类型
         reader := strings.NewReader(pageSource)
         parse, err := htmlquery.Parse(reader)
         if err != nil {
            return
         }
         //找到所有的a链接, 要求a链接中有href属性
         nodes := htmlquery.Find(parse, "//a[@href]")
         for i, node := range nodes {
            //循环获取每个a标签的文本(htmlquery.InnerText(node)),href属性值(htmlquery.SelectAttr(node, "href"))
            log.Println(i, htmlquery.InnerText(node), htmlquery.SelectAttr(node, "href"))
         }
      }
      time.Sleep(time.Second * 3)
   }
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表