0


selenium进行网页长截图,模块长截图

使用selenium进行网页截图,本文使用方法皆为显式情境下调试,未涉及隐式(无界面)与协议(设备模拟)。

首先定义驱动driver

from selenium import webdriver
driver = webdriver.Chrome()
#可指定目标页面网址,不指定页面默认为空白页
#url1='???'
#driver.get(url1)

拼接图片涉及

from PIL import Image

import numpy as np

一、基本操作

首先是最基础的截图,界面截图与某一部件截图

#部件截图
driver.find_element_by_id('captchaimg').screenshot('C:/xxxx/xx.png')
#屏幕截图
driver.get_screenshot_as_file('C:/xxxx/xx.png')

二、整页截图

以上方法只能截取当前页面的图片,那么当网页长度超出屏幕长度时呢?(即需要滚动)

2.1截取再拼接

        window_height = self.driver.execute_script("return window.screen.height")   #屏幕高度
        self.driver.set_window_size(650, window_height)  #设置浏览器宽高
        time.sleep(1)
        page_height = self.driver.execute_script('return document.documentElement.scrollHeight')  # 页面高度
        print(window_height, page_height)
        n1 = page_height// window_height
        if n1 == 0:       #判断是否需要滚动
            self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path_last,Account_number ))    #指定截图保存位置
        else:
            self.driver.set_window_size(650, window_height)
            for j in range(n1+1):
                self.driver.execute_script("window.scrollBy(0,{})".format(j*window_height))
                time.sleep(0.5)
                #driver.find_element(By.ID,'frmRecPODetail').screenshot(r'.png'.format(i))    #只截取部分
                self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path_mid, j))  # 截屏

        #拼图时间到
        target_img=os.listdir(self.path_mid)
        base_mat = np.atleast_2d(Image.open(os.path.join(self.path_mid,target_img[0])))
        for i in target_img[1:]:
            mat = np.atleast_2d(Image.open(os.path.join(self.path_mid,i)))  # 打开截图并转为二维矩阵
            base_mat = np.append(base_mat, mat, axis=0)  # 拼接图片的二维矩阵
        Image.fromarray(base_mat).save(os.path.join(self.path_last,'{}.png'.format(Account_number)))

2.2利用javascript进行打印截图

        # 打开谷歌浏览器
        chrome_options = webdriver.ChromeOptions()
        settings = {
            "recentDestinations": [{
                "id": "Save as PDF",
                "origin": "local",
                "account": ""
            }],
            "selectedDestinationId": "Save as PDF",
            "version": 2,  # 另存为pdf,1 是默认打印机
            "isHeaderFooterEnabled": True,  # 是否勾选页眉和页脚

            # "customMargins": {},
            # "marginsType": 2,#边距(2是最小值、0是默认)
            # "scaling": 100,
            # "scalingType": 3,
            # "scalingTypePdf": 3,
            # "isLandscapeEnabled": True,  # 若不设置该参数,默认值为纵向
            "isCssBackgroundEnabled": True,
            "mediaSize": {
                "height_microns": 297000,
                "name": "ISO_A4",
                "width_microns": 210000,
                "custom_display_name": "A4"
            },
        }
        chrome_options.add_argument('--enable-print-browser')
        # chrome_options.add_argument('--headless') #headless模式下,浏览器窗口不可见,应当可提高效率
        prefs = {
            'printing.print_preview_sticky_settings.appState': json.dumps(settings),
            'savefile.default_directory': r'{}'.format(self.path_last)  # 此处填写你希望文件保存的路径,可填写your file path默认下载地址
        }

        chrome_options.add_argument('--kiosk-printing')  # 静默打印,无需用户点击打印页面的确定按钮
        chrome_options.add_experimental_option('prefs', prefs)

        self.driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=self.path_dri)
self.driver.execute_script(
            'document.title="{}.pdf";window.print();'.format(Account_number))  # 利用js修改网页的title,该title最终就是PDF文件名,利用js的window.print可以快速调出浏览器打印窗口,避免使用热键ctrl+P

三、某部件长截图

在网页中,或许存在某一部件,该部件采取滚动条的形式(即需要滚动该部件进行截屏)

同理,使用单位置截屏滚动再拼接的方法。

        tabe = self.driver.find_element_by_xpath('sdasd')
        tr0 = tabe.find_elements_by_xpath('tbody')[0]  #找到位置
#我这里是有多行tr,故统计tr数量
        tr0 = tr0.find_elements_by_xpath('tr')
        
        self.driver.set_window_size(1350,650)  #调整浏览器尺寸,也可以直接打印部件

        n1 = (len(tr0)-1)//5   #5是我同窗可显示数目
        if n1==0:         #展示数量小于5,无需滚动
            self.pic += 1
            self.driver.execute_script('document.documentElement.scrollTop=10000')
            self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,'0'))
        else:
            for i in range(n1+1):
                
                self.driver.execute_script("arguments[0].scrollIntoView(false)",tr0[i*5])
                self.driver.execute_script('document.documentElement.scrollTop=10000')
            #     driver.find_element(By.ID,'frmRecPODetail').screenshot(r'C:\xx\{}.png'.format(i))    #只截取部分
                self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,i))  # 截屏
                self.pic+=1
            else: 
                
                if  (len(tr0)-1)%5!=0:
                    self.driver.execute_script("arguments[0].scrollIntoView(false)",tr0[i*5+(len(tr0)-1)%5])
                    self.driver.execute_script('document.documentElement.scrollTop=10000')    # 将页面滚动到底部
            #         driver.find_element(By.ID,'frmRecPODetail').screenshot(r'C:\xx\{}.png'.format(i+1))
                    self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,i+1))  # 截屏
                    self.pic += 1
                    
                else:
                    self.driver.execute_script('document.documentElement.scrollTop=10000')    # 将页面滚动到底部
                    self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,i))  # 截屏,替换最后一张

#若需要拼接,需要注意第一张图片在循环之外打开(以它为底)
#拼接部分
            # target_img=os.listdir(self.path3)
            # base_mat = np.atleast_2d(Image.open(os.path.join(self.path3,target_img[0])))
            # for i in target_img[1:]:
            #     mat = np.atleast_2d(Image.open(os.path.join(self.path3,i)))  # 打开截图并转为二维矩阵
            #     base_mat = np.append(base_mat, mat, axis=0)  # 拼接图片的二维矩阵
            # Image.fromarray(base_mat).save(os.path.join(self.path1,'521.png'))
标签: selenium chrome python

本文转载自: https://blog.csdn.net/Zhong____/article/details/127258151
版权归原作者 精英干员瑕光 所有, 如有侵权,请联系我们删除。

“selenium进行网页长截图,模块长截图”的评论:

还没有评论