selenium_driver.go 3.6 KB

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