selenium自动化测试-获取网页截图

news2024/11/27 13:29:36

今天学习下使用selenium自动化测试工具获取网页截图。

1,如果是简单获取当前屏幕截图只需要使用方法:

driver.get_screenshot_as_file('screenshot.png')

2,如果想获取完整网页长宽的截图需要设置参数后使用该方法:

首先打开驱动方式设置为无界面显示模式

# 打开驱动
def open_driver():
    try:
        # 连接浏览器web驱动全局变量
        global driver
        # Linux系统下浏览器驱动无界面显示,需要设置参数
        # “–no-sandbox”参数是让Chrome在root权限下跑
        # “–headless”参数是不用打开图形界面

        chrome_options = Options()
        # 设为无头模式
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--disable-dev-shm-usage')
        # 连接Chrome浏览器驱动,获取驱动
        driver = webdriver.Chrome(chrome_options=chrome_options)
        '''

        # 此步骤很重要,设置chrome为开发者模式,防止被各大网站识别出来使用了Selenium
        options = Options()
        # 静默模式(加载浏览器的静默模式,让它在后台偷偷运行)
        # options.add_argument('headless')
        # 去掉提示:Chrome正收到自动测试软件的控制
        options.add_argument('disable-infobars')
        # 以键值对的形式加入参数,打开浏览器开发者模式
        # options.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 打开浏览器开发者模式
        # options.add_argument("--auto-open-devtools-for-tabs")
        driver = webdriver.Chrome(chrome_options=options)
        '''
        # driver = webdriver.Chrome()
        print('连接Chrome浏览器驱动')
        # 浏览器窗口最大化
        driver.maximize_window()
        '''
        1, 隐式等待方法
        driver.implicitly_wait(最大等待时间, 单位: 秒)
        2, 隐式等待作用
        在规定的时间内等待页面所有元素加载;
        3,使用场景:
        在有页面跳转的时候, 可以使用隐式等待。
        '''
        driver.implicitly_wait(3)
        # 强制等待,随机休眠 暂停0-3秒的整数秒,时间区间:[0,3]
        time.sleep(random.randint(0, 3))

    except Exception as e:
        driver = None
        print(str(e))

 

然后设置网页长宽最大化,保证截图是完整的,不会出现滚动条

S = lambda X: driver.execute_script('return document.body.parentNode.scroll' + X)
driver.set_window_size(S('Width'), S('Height'))
driver.get_screenshot_as_file('screenshot.png')

3,编写代码

依旧采用拆分步骤细化功能模块封装方法编写代码,便于后续扩展功能模块,代码中缺少的封装方法代码,详情参考之前的《selenium自动化测试》文章。

def spider_screenshot_image(req_dict):
    '''
    @方法名称: 爬取网页内容截图文件
    @中文注释: 爬取网页内容截图文件
    @入参:
        @param req_dict dict 请求容器
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param rsp_dict dict 响应容器
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-09-26
    @使用范例: spider_screenshot_image(req_dict)
    '''

    try:
        if (not type(req_dict) is dict):
            return [0, "111111", "请求容器参数类型错误,不为字典", [None]]

        # 截图目录
        screenshot_dir = os.path.join(os.path.dirname(__file__), 'screenshot')
        if not os.path.exists(screenshot_dir):
            os.makedirs(screenshot_dir)

        print('打开浏览器驱动')
        open_driver()

        # 打开网址网页
        print('打开网址网页')
        driver.get(req_dict['url'])
        # 等待6秒启动完成
        driver.implicitly_wait(6)
        print('随机休眠')
        # 随机休眠 暂停0-2秒的整数秒
        time.sleep(random.randint(0, 2))

        # 保存当前网页屏幕快照PNG图像文件,截图不保证完整网页内容都截取到
        page_file_1 = os.path.join(screenshot_dir, 'page1.png')
        isprint = driver.get_screenshot_as_file(page_file_1)
        print(isprint)

        # 网页长宽最大化,保证截图是完整的,不会出现滚动条
        S = lambda X: driver.execute_script('return document.body.parentNode.scroll' + X)
        driver.set_window_size(S('Width'), S('Height'))

        # 保存当前网页屏幕快照PNG图像文件
        page_file_2 = os.path.join(screenshot_dir, 'page2.png')
        isprint = driver.get_screenshot_as_file(page_file_2)
        print(isprint)

        # 章节内容截图
        image_file = os.path.join(screenshot_dir, 'content.png')
        # 元素定位
        elem = driver.find_element(By.ID, req_dict['elem_id'])
        print(elem)
        # 元素截图
        isprint = elem.screenshot(image_file)
        print(isprint)

        print('关闭浏览器驱动')
        close_driver()

        print("爬取网页内容截图文件成功")
        # 返回容器
        return [1, '000000', '爬取网页内容截图文件成功', [None]]

    except Exception as e:
        print('关闭浏览器驱动')
        close_driver()
        print("爬取网页内容截图文件异常," + str(e))
        return [0, '999999', "爬取网页内容截图文件异常," + str(e), [None]]

 


4,运行效果

最后说明:上述文章仅供学习参考,请勿用于商业用途,感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升科研效率的关键:掌握3D科研绘图技能【文末送书】

提升科研效率的关键:掌握3D科研绘图技能 引言3D科研绘图的重要性和应用领域 3D科研绘图基础3D科研绘图的定义和重要性3D科研绘图的基本概念和技术 书籍简介书籍亮点核心内容内容简介作者简介 购买链接参与方式往期赠书回顾 引言 3D科研绘图的重要性和应用领域 3D科…

Ant-Design-Pro-V5 :ProTable自定义搜索菜单操作栏和搜索事件、列表工具栏操作。

import React, { useRef, useState, useEffect } from react; import { Button, Form } from antd; import { PageContainer, ProTable} from ant-design/pro-components; const Demo () > { const beforeSearchSubmit (params) > {//par 就是你搜索表单输入的内容 } co…

3D科研绘图与学术图表绘制:从入门到精通

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 3D科研绘图和学术图表绘…

运行时内存分配

目录 一、程序计数器 二、虚拟机栈 3、本地方法栈 4、Java堆(Heap) 5、方法区 很多人将 JAVA 内存分为堆内存(Heap)和栈内存(Stack),这种划分方式在一定程度上体现这两块区域是 Java 工程师最关注的内存区域。但是这种划分方式并不完全正确&#xf…

AttributeError: ‘Prophet‘ object has no attribute ‘stan_backend‘解决方案

在使用Facebook prophet过程遇到如下问题: 代码如下: from prophet import Prophet model Prophet()执行程序报如下错误: File "D:\Python\Python38\lib\site-packages\prophet\forecaster.py", line 156, in _load_stan_backend…

如何构建基于大模型的App

ChatGPT 的出现让大模型再一次成为业界的关注热点,然而,并不是每个组织都要去训练及生成大模型的,而且各个组织的技术积累和计算资源也不太允许这样去做。更多的时候, 我们还是基于大模型开发业务应用。所谓智能原生(A…

Spring MVC 入门指南

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Windows系统利用cpolar内网穿透搭建Zblog博客网站并实现公网访问内网!

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…

使用github创建个人页面,以及git的两种使用方式

目录 前言记录如何使用vs code提交代码 一、个人页面的创建二、Git的使用1.Git的工作原理2. 如何使用VS Code同步代码到远程仓库参考3. 如何在github网页上提交更新 前言 本篇主要介绍两个干货:1、如何利用github创建个人页面,对于学者范儿的从业人员可…

【已解决】windows10误删环境变量Path

【已解决】windows10误删环境变量Path 1.问题描述 进行python环境配置时,误删Path全部环境变量 2.解决原理及操作 图形化界面修改Path:同步到注册表,立即生效,已打开的cmd不会生效cmd命令修改Path:同步到注册表&am…

报错处理:Java休眠时在CPU上运行

大家好,今天我来分享一个我在运维过程中遇到的问题,关于Linux上Tomcat启动时出现的“Java休眠时在CPU上运行”的报错,以及如何解决这个问题的。 首先,让我们来看看这个报错信息。当你在启动Tomcat时,如果你看到类似的错…

SpringMVC 学习(四)RestFul 风格

5. RestFul 风格 5.1 简介 概念 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 功能 资源:互联网所有的事物都可以被抽象为…

【冰糖R语言】创建R包(打包R程序)

目标:将现有R程序打包 可能涉及知识点:devtools包、usethis包、Rstudio软件 一、R包的类型 通常一个R包中包含以下元素: 1)R文件夹:函数代码 2)man文件夹:存放每个函数的注释文件 3&#x…

千万别把工作 当成天大的事

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 工作不是我们的“主业”,人生才是。K哥一位前同事的遭遇,让我对这句话有了更深的感受。这位前同事,是某大厂高管,由于长期作息不规律和巨大工作压力&…

C++:线上课程2_12(多态和虚函数)

文章目录 一、多态1.多态定义2.多态分类2.1编译时的多态2.2运行时的多态 二、虚函数1.定义2.成员函数与虚函数3.为什么构造函数(移动构造函数,拷贝构造函数)不可以定义为虚函数?4.示例5.对象和指针和引用调用6.虚表分配7.this指针…

【Redis7】--6.集群

文章目录 集群1.基本介绍2.redis集群槽位3.redis集群分片4.redis槽位映射5.redis集群环境搭建5.1三主三从redis集群配置5.2启动六台redis实例5.3构建主从关系 6.redis集群读写7.redis集群主从切换8.redis集群扩容9.redis集群缩容10.集群常用操作命令和CRC16算法分析 集群 1.基…

聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname

聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname 1 从一个复杂网络环境下的 hdfs 报错问题聊起 大家知道,企业真实的网络环境是复杂多变的,这可能有多种原因: 一方面,单台服务器可以…

国产32位单片机 普冉PY32F002B 适用于LED灯驱,控制器等

PY32F002B 系列单片机采用高性能的 32 位 ARM Cortex-M0内核,宽电压工作范围的 MCU。嵌入了24Kbytes Flash 和 3Kbytes SRAM 存储器,最高工作频率 24MHz。有TSSOP20, QFN20, SOP16, SOP14,MSOP10多种不同封装类型多款产品。 芯片集成了I2C、SPI、USART 等…

C#程序中很多ntdll.dll、clr.dll的线程

VS中调试缓慢,如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。