powerbi_screenshot.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package browser
  2. import (
  3. "fmt"
  4. "gbase/glog"
  5. "github.com/tebeka/selenium"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. "time"
  11. )
  12. // @title GetPBIScreenshots
  13. // @description 遍历获取PBI页面,并截图
  14. // @param PBIPageURL,PBI的首页
  15. // @return
  16. func (m *SeleniumDriverConf) GetPBIScreenshots(PBIPageURL, screenshotPath, fileNameNotExt string) (screenshotFileNames []string, err error) {
  17. err = m.WebDriver.Get(PBIPageURL)
  18. if err != nil {
  19. fmt.Printf("Get url error : %v\n", err)
  20. return
  21. }
  22. handle, _ := m.WebDriver.CurrentWindowHandle()
  23. m.WebDriver.ResizeWindow(handle, 1920, 1080)
  24. m.WebDriver.MaximizeWindow(handle)
  25. err = m.WebDriver.WaitWithTimeout(ShareExists, 30*time.Second)
  26. if err != nil {
  27. log.Printf("GetPBIScreenshots ShareExists error:%v", err)
  28. glog.XWarning(fmt.Sprintf("GetPBIScreenshots ShareExists error:%v", err))
  29. return
  30. }
  31. // todo 判断加载完成,暂时sleep30秒
  32. time.Sleep(30 * time.Second)
  33. //首页
  34. data, err := m.WebDriver.Screenshot()
  35. if err != nil {
  36. log.Printf(" %s,Screenshot error : %v\n", PBIPageURL, err)
  37. glog.XWarning(fmt.Sprintf(" %s,Screenshot error : %v", PBIPageURL, err))
  38. return
  39. }
  40. screenshotFileName := fmt.Sprintf("%v_0.png", fileNameNotExt)
  41. screenshotFilePath := filepath.Join(screenshotPath, screenshotFileName)
  42. ScreenshotSaveTo(data, screenshotFilePath)
  43. screenshotFileNames = append(screenshotFileNames, screenshotFileName)
  44. for i := 1; i < 999; i++ {
  45. log.Printf("page %v start===>", i+1)
  46. glog.XWarning(fmt.Sprintf("page %v start===>", i+1))
  47. //判断是否有下一页,没有则跳出循环
  48. err = m.WebDriver.WaitWithTimeout(NextPageExists, 30*time.Second)
  49. if err != nil {
  50. log.Printf("GetPBIScreenshots NextPageExistsV2 error : %v\n", err)
  51. glog.XWarning(fmt.Sprintf("GetPBIScreenshots NextPageExistsV2 error : %v", err))
  52. break
  53. }
  54. //判断是否刷新完
  55. //err = m.WebDriver.WaitWithTimeout(ShareExists, 30*time.Second)
  56. //if err != nil {
  57. // return
  58. //}
  59. // todo 判断加载完成,暂时sleep30秒
  60. time.Sleep(30 * time.Second)
  61. //刷新完成,开始截图
  62. data, err = m.WebDriver.Screenshot()
  63. if err != nil {
  64. log.Printf(" page %v,Screenshot error : %v\n", i, err)
  65. glog.XWarning(fmt.Sprintf(" page %v,Screenshot error : %v\n", i, err))
  66. break
  67. }
  68. screenshotFileName = fmt.Sprintf("%v_%v.png", fileNameNotExt, i)
  69. ScreenshotSaveTo(data, filepath.Join(screenshotPath, screenshotFileName))
  70. screenshotFileNames = append(screenshotFileNames, screenshotFileName)
  71. }
  72. return
  73. }
  74. // @title ScreenshotSaveTo
  75. // @description PBI页面截图另存为图片文件
  76. // @param
  77. // @return
  78. func ScreenshotSaveTo(data []byte, screenshotFilePath string) error {
  79. //currentDir, _ := os.Getwd()
  80. //imgPath := filepath.Join(currentDir, cfg.DownloadFolderName, "pbi.png")
  81. f, err := os.Create(screenshotFilePath)
  82. if err != nil {
  83. log.Printf("%v, Create error : %v\n", screenshotFilePath, err)
  84. return err
  85. }
  86. f.Write(data)
  87. defer f.Close()
  88. return nil
  89. }
  90. // @title ShareExists
  91. // @description 从分享按钮,判断页面是否完成刷新,2021-12-07更新了cssselector的元素
  92. // @param
  93. // @return
  94. func ShareExists(driver selenium.WebDriver) (bool, error) {
  95. _, err := driver.FindElement(selenium.ByCSSSelector, "button[aria-label='共享']")
  96. if err != nil {
  97. return false, err
  98. }
  99. return true, nil
  100. }
  101. // @title NextPageExists
  102. // @description 判断页面是否有下一页的按钮,并点击,2021-12-07更新了cssselector的元素
  103. // @param
  104. // @return
  105. func NextPageExists(driver selenium.WebDriver) (bool, error) {
  106. elem, err := driver.FindElement(selenium.ByCSSSelector, "button[aria-label='下一页']")
  107. if err != nil {
  108. return false, err
  109. }
  110. elemi, err := elem.FindElement(selenium.ByCSSSelector, "i")
  111. if err != nil {
  112. return false, fmt.Errorf("找不到下一页button的标签i")
  113. }
  114. elemClass, err := elemi.GetAttribute("class")
  115. if err != nil {
  116. return false, fmt.Errorf("找不到下一页的class")
  117. }
  118. if strings.Contains(elemClass, " inactive") == true {
  119. return false, fmt.Errorf("下一页禁止点击")
  120. }
  121. //排除了其它情况,尝试点击下一页
  122. err = elem.Click()
  123. if err != nil {
  124. return false, err
  125. }
  126. return true, nil
  127. }