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

这篇具有很好参考价值的文章主要介绍了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

三、某部件长截图

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

同理,使用单位置截屏滚动再拼接的方法。文章来源地址https://www.toymoban.com/news/detail-511511.html

        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进行网页长截图,模块长截图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Python的Selenium库进行网页抓取和JSON解析

    随着互联网的快速发展,网页抓取和数据解析在许多行业中变得越来越重要。无论是电子商务、金融、社交媒体还是市场调研,都需要从网页中获取数据并进行分析。Python的Selenium库作为一种自动化测试工具,已经成为许多开发者的首选,因为它提供了强大的功能和灵活性。

    2024年02月10日
    浏览(282)
  • 如何使用Python自动化测试工具Selenium进行网页自动化?

    Selenium 是一个流行的Web自动化测试框架, 它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为 。 Selenium可以通过代码驱动浏览器自动化测试流程,包括页面导航、元素查找、数据填充、点击操作等。 与PyAutoGUI和AutoIt相比, Selenium更适合于处

    2023年04月09日
    浏览(120)
  • selenium爬取网页内容,对网页内容进行点击

    所需要的库 首先明确所要爬取的网页,选择调用方法,增加无界面模式的无头参数,然后调用,获取网址,使页面放大,为最大化窗口 获取数据运用XPATH函数,将获取的数据作为item,运用XPATH函数获取,   模仿人点击下一页,运用 for语句,每10个一点,停留5秒 同样寻找下一

    2024年01月17日
    浏览(64)
  • 【selenium模块-WEB自动化】八大网页元素定位方法(三)

    一、id 定位 标签的 id 具有唯一性,就像人的身份证。 二、name 定位 name 指定标签的名称,在页面中可以不唯一。 三、class 定位 class 指定标签的类名,在页面中可以不唯一。 四、tag 定位 每个 tag 往往用来定义一类功能,所以通过 tag 来识别某个元素的成功率很低,每个页面

    2024年02月15日
    浏览(50)
  • 20230908_python练习_selenium模块爬取网页小说练习

    霍比特人小说爬取,使用 selenium 模块调用谷歌浏览器,无界面模式爬取小说网站信息,将数据按照每次2000字符在mysql中保存。

    2024年02月07日
    浏览(53)
  • selenium利用javascript进行自动打印网页为PDF

    selenium爬取页面的时候有时需要保持页面为PDF格式 并且不能使用pdfkit 模块(有的网址限制必须浏览器打开) 一:导入模块 二:在初始化driver对象的时候设定,浏览器静默保存(即保存时不弹出另存为按钮)和默认保存位置 三:打开所需网页 四:调用js打开打印窗口 修改当前页面标题(因

    2024年02月15日
    浏览(47)
  • Linux中使用selenium截图的文字变为方框的解决方案

    最近在Linux中使用selenium截图时,发现文字都变为了方框: 虽然不影响selenium的使用,但有点影响调试,也不好看,后面发现是因为Linux缺少中文字体的缘故,需要安装中文字体就能解决。 先检查 /usr/share 目录下是否有有 fonts 和 fontconfig 目录,如果没有则需要执行下面的命令

    2024年02月08日
    浏览(41)
  • JAVA使用selenium实现后台浏览器截图(含代码+docker打包)

    最近接到一个特殊需求,需要每天定时截图某网站首页,保存备查,因此使用JAVA实现了后台截图。 下面是完整的方法。 JAVA实现浏览器截图,浏览器选用的是chrome,使用selenium-java依赖。selenium可以帮助我们调用浏览器,完成想要的功能。 由于是后台截图,不需要显示界面,

    2024年03月13日
    浏览(39)
  • vue-element使用html2canvas实现网页指定区域(指定dom元素)截图

    直接上代码: ** 如果要截取的dom元素、区域涉及到v-if或者v-show的条件表达式时,截取的方法请在nextTick里面调用----例如: this.$nextTick(() = { this.saveImageNew() }) 否之获取dom元素的时候会获取不到!!!!!!!!

    2024年02月04日
    浏览(63)
  • 使用selenium获取网页源码

    安装好selenium和下载好WebDriver后即可测试。下面演示如何打开一个网址,并获取该网站的源码。 基本步骤如下: 1. 导入webdriver from seleniumimport webdriver 2. 创建浏览器操作对象 指定下载的webdriver文件路径,我有将该文件复制到了当前程序运行的路径下,所以直接指定该文件名,

    2023年04月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包