Python+Selenium截图

实际使用过程中,截图一般的使用场景:全屏截图、区域截图(截取指定的区域)

场景一、全屏截图

直接使用selenium的get_screenshot_as_file就可以实现

# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time

# 时间格式进行格式化
def time_format():
    current_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
    return current_time

driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
driver.get_screenshot_as_file("截图\\"+time_format()+".png")

sleep(2)
driver.quit()


场景二、 区域截图(截取指定的区域)

实现思路:

1.截取全屏图片并保存

2.获取元素位置、大小

3.裁取元素图片并保存

# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time
from PIL import Image

# 时间格式进行格式化
def time_format():
    current_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
    return current_time

driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
# 截取全屏
driver.save_screenshot("截图\\full.png")
# 要截屏的目标元素
element = driver.find_element_by_id("su")
print(element.location)
print(element.size)
# 获取element的顶点坐标
xPiont = element.location['x']
yPiont = element.location['y']
# 获取element的宽、高
element_width = xPiont + element.size['width']
element_height = yPiont + element.size['height']

picture = Image.open('截图\\full.png')

'''
crop()--  一个显式的参数:一个4元组
  Image.crop(box=None):图像返回一个矩形区域,box是一个四元组 限定所述左,上,右,和下像素坐标
  参数:box--裁剪矩形,作为(左,上,右,下)-tuple;返回类型:Image;返回:一个Image对象
  所以你应该重写它:
  img.crop((414,122,650,338))
  #        ^    4-tuple    ^
'''
picture = picture.crop((xPiont, yPiont, element_width, element_height))
picture.save("截图\\"+time_format()+".png")

sleep(2)
driver.quit()

运行结果:




Note:如果把截取元素图片的代码单独拿出来封装,截图的图片下方会出现空白区域:

# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time
from PIL import Image

# 时间格式进行格式化
def time_format():
    current_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
    return current_time


# 区域截图(对指定的区域/元素截图)
def element_screenshot(element):
    # 截取全屏图片
    driver.save_screenshot("截图\\full.png")
    # 获取element的顶点坐标
    x_piont = element.location['x']
    y_piont = element.location['y']
    # 获取element的宽、高
    element_width = x_piont + element.size['width']
    element_height = x_piont + element.size['height']
    # 开始截取指定区域
    picture = Image.open("截图\\full.png")
    
	'''
    crop()--  一个显式的参数:一个4元组
      Image.crop(box=None):图像返回一个矩形区域,box是一个四元组 限定所述左,上,右,和下像素坐标
      参数:box--裁剪矩形,作为(左,上,右,下)-tuple;返回类型:Image;返回:一个Image对象
      所以你应该重写它:
      img.crop((414,122,650,338))
      #        ^    4-tuple    ^
    '''
    picture = picture.crop((x_piont, y_piont, element_width, element_height))
    picture.save("截图\\"+time_format()+".png")


driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')

# 要截屏的目标元素
element = driver.find_element_by_id("su")
# 调用element_screenshot()方法
element_screenshot(element)

sleep(2)
driver.quit()

运行结果:



运行结果如上图所示,在图片的下边会出现空白区域,并不是我们期望得到的结果,需要去掉图片下边的空白区域,在代码中加入如下js即可:

'''
    去掉截图下端的空白区域
    '''
    driver.execute_script(
        """
        $('#main').siblings().remove();
        $('#aside__wrapper').siblings().remove();
        $('.ui.sticky').siblings().remove();
        $('.follow-me').siblings().remove();
        $('img.ui.image').siblings().remove();
        """
    )


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值