对WebElement截图

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

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

下面提供几种思路。

方式一

针对WebDriver.Chrome

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

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

获取元素html源码

将html转换为canvas

下载canvas

优点: 截取长图容易实现

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

方式二

针对WebDriver.Chrome

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

获取元素位置、大小

获取窗口大小

截取包含元素的窗口

进行相应的裁剪和拼接。

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

优点: 不需太多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')

**优点**: 实现简单

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

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

参考: [利用 Python + Selenium 自动化快速截图](http://codingpy.com/article/take-screenshot-of-web-page-using-selenium/)

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

from selenium import webdriver

import time

def take_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);

})();

""")

for i in xrange(30):

if "scroll-done" in browser.title:

break

time.sleep(10)

browser.save_screenshot(save_fn)

browser.close()

if __name__ == "__main__":

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

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

Chrome和PhantomJS 的接口差异

抓知乎时的坑,

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

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 Selenium实现自动登陆京东签到领金币功能

    如何自动登陆京东? 我们先来看一下京东的登陆页面,如下图所示: [插入图片,登陆页面] 登陆框就是右面这一个框框了,但是目前我们遇到一个困呐,默认的登陆方式是扫码登陆,如果我们想要以用户民个.密码的形 ...

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

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

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

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

  7. python进行数据分析流程图_利用Python绘制诱人的特定流程图:桑基图

    大家好,我是小z~ 最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" 小z本没有干货,问的人多了,也便有了干货 ...

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

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

  9. python计算面积代码_利用Python求阴影部分的面积实例代码

    利用Python求阴影部分的面积实例代码 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  利用Python求阴影部分的面积实例代码.txt ] (友情提示:右键点 ...

最新文章

  1. linux字符串转为二进制,Linux printf将十进制转换为二进制?
  2. 微信小店 API 手册
  3. 中国一线城市住宅地价同比增幅连续8个季度收窄
  4. UnsatisfiedLinkError解决办法
  5. 算法导论之图的基本算法
  6. Hadoop教程(五):Flume、Sqoop、Pig、Hive、OOZIE
  7. JavaScript中常用的事件代码及实例
  8. c语言二叉树构造与输出,C语言数据结构树状输出二叉树,谁能给详细的解释一下...
  9. Linux下如何手动搭建论坛?
  10. mysql打开闪退 ini_解决MySql客户端秒退(找不到my.ini)
  11. Can you answer these queries? HDU 4027 线段树
  12. 深入理解Nginx:模块开发与架构解析
  13. java出现中文乱码_JAVA中文显示乱码问题
  14. GOF设计模式(概念、原则、场景、优点、缺点、应用)
  15. bootstrap日期插件的使用
  16. ELK-部署Logstash
  17. 英语语法 - the + 形容词 的意义
  18. pandas填充空数组_pandas | DataFrame基础运算以及空值填充
  19. JAVA解析IP地址
  20. 贪心算法-2.找钱问题

热门文章

  1. 2019给自己立个小目标
  2. 安装VS2010sp1显示兼容性问题
  3. DotnetBar控件中一些设置 早前整理
  4. Red Hat Enterprise Linux (RHEL) 8.5 发布(含下载)
  5. python获取视频缩略图_python接收图片变成缩略图
  6. Java学习需要具备什么条件?
  7. XDOJ 1-1 车牌限行
  8. kafka集群配置(三台机器)
  9. Artifactory Maven 使用教程
  10. 虚拟机中安装Ubuntu,详细教程