powerbi_screenshot.go 4.0 KB

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