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

news/2024/7/19 11:21:07 标签: selenium, python, 爬虫

今天学习下使用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自动化测试》文章。

python">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.niftyadmin.cn/n/5051408.html

相关文章

蓝海渲染案例 | 《仙逆》之后再无仙侠,且看平凡少年王林的修仙之路

动画《仙逆》改编自作者耳根原作的同名小说,于2023年9月25日起在腾讯视频全网独播。该动画由企鹅影视出品、河北铸梦文化传播有限公司承制、蓝海创意云提供独家渲染服务。蓝海创意云作为业内知名渲染服务商,凭借着优质的渲染业务能力,承接了该…

Golang基础之关键字

Type 参考 ## https://blog.csdn.net/SHELLCODE_8BIT/article/details/122837699 type有如下几种用法: 定义结构体定义接口类型定义类型别名类型查询 类型定义 type Celsius float64 // 摄氏温度 type Fahrenheit float64 // 华氏温度const (AbsoluteZeroC Cels…

【C++ • STL】探究string的源码

文章目录 一、深浅拷贝二、传统版写法的string类(简单)三、string类的模拟实现四、现代版写法的string类五、总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ" 一、深浅拷贝 浅拷贝:也称位…

跨域(浏览器)

跨域问题 是前端开发中常遇到的一个挑战。由于浏览器的同源策略限制,前端在发起异步请求时会受到限制,只能向相同源(域名、协议和端口号都相同)的服务器发送请求。当请求的目标服务器与当前页面的源不一致时,就会触发…

赴日IT课程分享 如何尽快就职日本IT公司?

想要做赴日IT工作,我们先要搞清楚一个问题,那就是日本IT行业的缺口真的很大吗?答案是肯定的,对于有3-5年实际开发经验,能独立做开发,日语口语也好,不需要协助就能独立跟日本人交流的人&#xff…

如何办一份有价值的企业内刊/报纸?向《华为人》学习就够了

前两天有一个朋友联系华研荟,说他是今年大学毕业加入了一个中型公司,他学的是企业管理,在公司人力资源部门工作。上周老板说公司要办一份自己的内刊,这个工作由人力资源部负责,而人力资源经理就把这个活交给她了。 她…

MTK Logo 逆向解析汇总

相关文章 MTK Logo 逆向解析之 bin 转 rawx MTK Logo 逆向解析之 rawx 全解压 MTK Logo 逆向解析之 raw 转 bmp 要想逆向解析 logo.bin 就得先知道 logo.bin 是怎么生成的,具体介绍可以参考这篇 MTK logo.bin手动制作 这里简单概括一下 logo.bin 中不单单只包…

【LeetCode热题100】--48.旋转图像

48.旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 使用辅助数组 class Solution {public void rotate(int[][] matrix)…