chrome_driver.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package xnet
  2. import (
  3. "fmt"
  4. "gcore/core"
  5. "github.com/tebeka/selenium"
  6. "github.com/tebeka/selenium/chrome"
  7. "log"
  8. )
  9. type ChromeDriverConf struct {
  10. ChromeDriverPath string `ini:"chrome_driver_path"` //chromedriver.exe路径
  11. ChromeDriverPort int `ini:"chrome_driver_port"` //chromedriver服务端口
  12. ChromeDriverService *selenium.Service `json:"chrome_driver_service"`
  13. WebDriver selenium.WebDriver `json:"web_driver"`
  14. }
  15. // @title ChromeDriverServiceStart
  16. // @description 开启服务
  17. // @param
  18. // @return
  19. func (m *ChromeDriverConf) ChromeDriverServiceStart() (err error) {
  20. opts := []selenium.ServiceOption{}
  21. //selenium.SetDebug(true)
  22. m.ChromeDriverService, err = selenium.NewChromeDriverService(m.ChromeDriverPath, m.ChromeDriverPort, opts...)
  23. if nil != err {
  24. log.Printf("ChromeDriverServiceStart error:%v\n", err)
  25. core.LogWrite(fmt.Sprintf("ChromeDriverServiceStart error:%v\n", err))
  26. return
  27. } else {
  28. log.Println("ChromeDriverServiceStart success.")
  29. }
  30. return
  31. }
  32. // @title ChromeDriverServiceStop
  33. // @description 关闭服务
  34. // @param
  35. // @return
  36. func (m *ChromeDriverConf) ChromeDriverServiceStop() error {
  37. //注意这里,server关闭之后,chrome窗口也会关闭
  38. err := m.ChromeDriverService.Stop()
  39. if err != nil {
  40. log.Printf("ChromeDriverServiceStop error:%v\n", err)
  41. core.LogWrite(fmt.Sprintf("ChromeDriverServiceStop error:%v\n", err))
  42. return err
  43. }
  44. return nil
  45. }
  46. // @title WebDriverStart
  47. // @description 开启webdriver,和新增tab
  48. // @param
  49. // @return
  50. func (m *ChromeDriverConf) WebDriverStart() (WebDriver selenium.WebDriver, err error) {
  51. //链接本地的浏览器 chrome
  52. caps := selenium.Capabilities{
  53. "browserName": "chrome",
  54. //https://github.com/tebeka/selenium/issues/233
  55. "chromeOptions": map[string]interface{}{
  56. "excludeSwitches": [1]string{"enable-automation"},
  57. },
  58. }
  59. prefCaps := map[string]interface{}{}
  60. chromeCaps := chrome.Capabilities{
  61. Prefs: prefCaps,
  62. Path: "",
  63. Args: []string{
  64. "--headless", // 设置Chrome无头模式,在linux下运行,需要设置这个参数,否则会报错
  65. "--kiosk", // 加载启动项页面全屏效果,相当于F11
  66. "--start-maximized", // 最大化运行(全屏窗口),不设置,取元素会报错
  67. "--window-size=1920x1080",
  68. "--disable-infobars", // 关闭左上方Chrome 正受到自动测试软件的控制的提示
  69. //"--no-sandbox",// 沙盒,linux下要关闭沙盒模式.
  70. "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", // 模拟user-agent,防反爬
  71. },
  72. }
  73. //以上是设置浏览器参数
  74. caps.AddChrome(chromeCaps)
  75. // 调起chrome浏览器
  76. WebDriver, err = selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", m.ChromeDriverPort))
  77. if err != nil {
  78. //启用--user-data-dir参数后,同时只能打开一个chrome程序.
  79. //如果已打开chrome程序,必须先关闭已打开的chrome,再运行程序
  80. fmt.Printf("WebDriverStart connect to the webDriver error : %v\n", err)
  81. core.LogWrite(fmt.Sprintf("WebDriverStart connect to the webDriver error : %v", err))
  82. return
  83. } else {
  84. log.Println("connect to the webDriver success.")
  85. }
  86. return
  87. }
  88. // @title ChromeDriverServiceStop
  89. // @description 关闭webdriver和打开的窗口
  90. // @param
  91. // @return
  92. func (m *ChromeDriverConf) WebDriverStop() error {
  93. //关闭一个webDriver会对应关闭一个chrome窗口
  94. //但是不会导致seleniumServer关闭
  95. err := m.WebDriver.Quit()
  96. if err != nil {
  97. log.Printf("WebDriverStop error:%v\n", err)
  98. core.LogWrite(fmt.Sprintf("WebDriverStop error:%v\n", err))
  99. return err
  100. }
  101. return nil
  102. }