对WebElement截图

WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了。

WebDriver.PhantomJS自带的方法支持对整个网页截屏。

下面提供几种思路。

方式一

针对WebDriver.Chrome

通过WebDriver的js脚本注入功能,曲线救国。

1. 注入第三方html转canvas的js库(见下方推荐)

2. 获取元素html源码

3. 将html转换为canvas

4. 下载canvas

优点: 截取长图容易实现

缺点: 加载第三方库耗费时间,转换原理请参考这篇文章:

将 DOM 对象绘制到 canvas 中

方式二

针对WebDriver.Chrome

截取全图,自行裁剪、拼接

1. 获取元素位置、大小

2. 获取窗口大小

3. 截取包含元素的窗口

4. 进行相应的裁剪和拼接。

具体算法思路很清晰,但需要注意的细节较多。这里就不在赘述。示例代码请移步:

[Github]PythonSpiderLibs

优点: 不需太多js工作,python+少量js代码即可完成

缺点: 拼接等工作会被WebDriver的实现差异、图片加载速度等因素影响,需多加注意。 在保证截图质量的情况下,速度较慢

方式三

针对WebDriver.PhantomJS

由于接口实现的差异,PhantomJS相比于Chrome,可以截取到整个网页。所以获取指定元素的截图也就简单很多

截取网页全图

裁剪指定元素

driver = webdriver.Chrome()

driver.get('http://stackoverflow.com/')

driver.save_screenshot('screenshot.png')

left = element.location['x']

top = element.location['y']

right = element.location['x'] + element.size['width']

bottom = element.location['y'] + element.size['height']

im = Image.open('screenshot.png')

im = im.crop((left, top, right, bottom))

im.save('screenshot.png')

1

2

3

4

5

6

7

8

9

10

11

12

13

driver=webdriver.Chrome()

driver.get('http://stackoverflow.com/')

driver.save_screenshot('screenshot.png')

left=element.location['x']

top=element.location['y']

right=element.location['x']+element.size['width']

bottom=element.location['y']+element.size['height']

im=Image.open('screenshot.png')

im=im.crop((left,top,right,bottom))

im.save('screenshot.png')

优点: 实现简单

缺点: 对于高度太高的页面会导致文件过大,处理会有问题,我测试的最大图片尺寸是12.8M。

解决图片加载不完整的问题

我们先在首页上执行一段 JavaScript 脚本,将页面的滚动条拖到最下方,然后再拖回顶部,最后才截图。这样可以解决像上面那种按需加载图片的情况。

from

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

fromimportwebdriver

importtime

deftake_screenshot(url,save_fn="capture.png"):

browser=webdriver.Firefox()# Get local session of firefox

browser.set_window_size(1200,900)

browser.get(url)# Load page

browser.execute_script("""

(function () {

var y = 0;

var step = 100;

window.scroll(0, 0);

function f() {

if (y < document.body.scrollHeight) {

y += step;

window.scroll(0, y);

setTimeout(f, 100);

} else {

window.scroll(0, 0);

document.title += "scroll-done";

}

}

setTimeout(f, 1000);

})();

""")

foriinxrange(30):

if"scroll-done"inbrowser.title:

break

time.sleep(10)

browser.save_screenshot(save_fn)

browser.close()

if__name__=="__main__":

take_screenshot("http://codingpy.com")

不同wewbdriver对某些方法的实现不同

Chrome和PhantomJS 的接口差异

抓知乎时的坑,

1. Chrome用WebElement.text可以正常得到值,用PhantomJS只能用 WebElement.get_attribute('innerHTML')

2. WebDriver.Chrome截图只能截当前屏幕区域。WebDriver.PhantomJS截图可以获取整个页面的长图。

其它还有一些坑等待发现

python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...相关推荐

  1. python截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  2. python绘制简单城市剪影图_利用Python的folium包绘制城市道路图的实现示例

    写在前面 很长一段时间内,我都在研究在线地图的开发者文档,百度地图和高德地图的开发者中心提供了丰富的在线地图服务,虽然有一定的权限限制,但不得不说,还是给我的科研工作提供了特别方便的工具,在博客前面我 ...

  3. python识图找图_利用python进行识别相似图片(二)

    前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...

  4. python批量生成图_利用Python批量生成任意尺寸的图片

    实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- imp ...

  5. python制作流动图_利用Python生成GIF动图

    一.PIL库 1.PIL库的概括: PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库 ...

  6. python画互动图_利用Python画出运动图像

    题目要求: 首先这里我们需要下载三个库:numpy,scipy,matplotlib 接着看题目,我的思路是依次求出X轴和Y轴的坐标连线并转换成曲线.:mgh=1/2mv2(势能全部转换成动能),另一 ...

  7. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  8. python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码

    利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...

  9. python制作心形照片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

最新文章

  1. cad怎么卸载干净_百度软件中心助手怎么样干净卸载
  2. 基于SSM实现绿色有机产品直营网
  3. 【技术贴】解决 myeclipse打不开报错an error has occurred, see .
  4. 【Python】可视化配色方案自由啦 (Python版)
  5. Shell case esac语句
  6. 服务器被一堆系统登录_WIN10做天高服务器客户端登录出现“操作系统原因无法登录”...
  7. H5添加禁止缩放功能
  8. rpm包安装mysql数据库
  9. 探索MicroPython(三)--基础操作示例
  10. 百度地图2021十一大数据:全国高速拥堵里程超7000公里
  11. 拳王公社:网络引流的“4大核心秘诀“,让客户源源不断地加你
  12. mysql57包解压安装_mysql5.7解压包安装教程
  13. 指针变量本质(四十三)
  14. 别再透支你的社交信用了
  15. extjs tree下拉列表_Extjs中ComboBoxTree实现的下拉框树效果(自写)_extjs
  16. 计算机里面为什么只剩c盘,电脑只剩下C盘了,怎么处理
  17. YoungTalk-STM32入门100步-总篇
  18. 用户研究中的定性研究、定量研究
  19. 吴军《态度》读书笔记
  20. Linux安装Vmware Workstation

热门文章

  1. Java实例-查找数组中的重复元素
  2. JavaFx之使用指定字体样式(二十九)
  3. linux 中的指令
  4. 软件开发需要测试员吗?
  5. fanuc机器人刷机教程_FANUC机器人中文简易教程
  6. python基于PHP+MySQL的物流配送管理系统平台
  7. android版微信打飞机无敌补丁分析及其制作方法
  8. 数值计算方法python实现
  9. VideoPlayer怎么判断视频结束
  10. PTA浙大版《c语言程序设计》答案集