1.实验

    #https://captcha.luosimao.com/demo/
chrome
default:
location 不滚动,直接返回相对整个html的坐标 {'x': 15.0, 'y': 129.0}
location_once_scrolled_into_view 返回相对可视区域的坐标(改变浏览器高度,可以观察到底部元素底部对齐后y的变化)
顶部/底部元素 完全可见不滚动,{u'x': 15, u'y': 60}
顶部元素部分可见或完全不可见都会滚动到 顶部对齐 {u'x': 15, u'y': 0} account-wall
底部元素部分可见或完全不可见都会滚动到 底部对齐 {u'x': 15, u'y': 594} theme-list
frame:
location 不滚动,直接返回相对frame即当前相应内层html的坐标{'x': 255.0, 'y': 167.0} captcha_frame 的 lc-refresh
location_once_scrolled_into_view 返回相对可视区域的坐标
完全可见不滚动{u'x': 273, u'y': 105}
部分可见或完全不可见滚动到 顶部对齐 {u'x': 273, u'y': 0} firefox
default:
顶部元素 底部元素
location 不滚动,直接返回相对整个html的坐标 {'x': 15.0, 'y': 130.0} {'x': 15.0, 'y': 707.0}
location_once_scrolled_into_view 返回相对可视区域的坐标(y=1足以说明)
可见不可见 都滚动到顶部对齐 {'x': 15.0, 'y': 1.0} {'x': 15.0, 'y': 1.0}
如果下拉条直到底部,底部元素仍然无法顶部对齐 {'x': 15.0, 'y': 82.0}
frame:
location 不滚动,都是相对frame即当前相应html的坐标{'x': 255.0, 'y': 166.0}
location_once_scrolled_into_view 可见不可见都会滚动到顶部对齐,('y'依旧是166.0)
结果也是相对frame即当前相应html的坐标{'x': 255.0, 'y': 166.0}

2.总结

location
    始终不滚动,返回相对整个html或者对应frame的坐标
location_once_scrolled_into_view
    chrome完全可见不滚动,firefox始终会滚动;而且chrome底部元素会底部对齐,其余情况两者都是顶部对齐。
    一般返回相对可视区域坐标,但是firefox的frame依旧返回相对frame的坐标

3.应用

对浏览器可视区域截图后,截取某一frame的pic roi

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait from PIL import Image
import numpy as np WebDriverWait(driver, 5).until(lambda x: x.find_element_by_id('captcha_frame'))
driver.switch_to.frame('captcha_frame')
WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@class="captcha-list"]/div[last()]').is_displayed()) # 通过拼图的最后一块确认图片roi加载完毕
driver.switch_to.default_content() #处于frame截图,chrome为可视区域,firefox为当前frame,所以统一到default
driver.execute_script("window.scrollTo(0,0)")
driver.save_screenshot(pic1_path) # 无论元素是否在可视区域,滚动条始终不动,返回相对整个html或者对应frame的坐标 {u'y': 225, u'x': 13}
captcha_frame_abs_xy = driver.find_element_by_id('captcha_frame').location

# 通过size确认roi的尺寸 {'height': 160, 'width': 300} 
elem_roi_full = driver.find_element_by_class_name('captcha-list')
roi_size_wh = elem_roi_full.size 
# 读取图形,灰度处理,转为numpy array
pic = Image.open(pic1_path)
pic_gray = pic.convert('L')   
pic_array = np.array(pic_gray)
# 截取pic roi,注意pic_array.shape为(h,w),firefox取得的location和size为小数 
pic_array = pic_array[int(captcha_frame_abs_xy['y']) : int(captcha_frame_abs_xy['y']+roi_size_wh['height']),
                            int(captcha_frame_abs_xy['x']) : int(captcha_frame_abs_xy['x']+roi_size_wh['width'])]
# 通过阈值二值化
pic_array = np.where(pic_array==255,255,0)
Image.fromarray(pic_array).save(pic_bilevel_path)

selenium相关:通过location 和 size 获取元素所在像素位置和尺寸,截取图片ROI的更多相关文章

  1. Python+Appium自动化测试(11)-location与size获取元素坐标

    appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作.appium中提供了location方法获取控件元素左上角的坐标,再通过size方法获取控件元素的宽高,就可以得到控件元素 ...

  2. 原生js获取元素的各种位置(大全)

    加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...

  3. 详细解析 JavaScript 获取元素的坐标

    引言 最近突然看到了有关图片懒加载的问题,大致意思就是初始状态下页面只加载浏览器可视区域的图片,剩余图片在当浏览器可视区域滚动到其位置时才开始加载.貌似现在许多大型网站都有实现懒加载,所以我便就此问题 ...

  4. selenium自动化之js处理滚动条和元素聚焦

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 当我们页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见异常的.这时候需要借助滚动 ...

  5. jquery获取元素在文档中的位置信息以及滚动条位置(转)

    jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886     原文链接 原创 201 ...

  6. 获取元素位置信息和所占空间大小(via:js&jquery)

    工作中有一个很常见的需求,hover或者click某元素后,在该元素旁边出现弹框,主要就是获取该元素的位置坐标以及元素所占区块的大小.最近工作中就遇到了,发现js和jquery的实现方法有很大的区别, ...

  7. 获取元素在页面中位置 getBoundingClientRect()

    DOM 原生方法getBoundingClientRect()获取元素相对视口位置 DOMRect 对象包含了一组用于描述边框的只读属性--left.top.right和bottom,单位为像素.除了 ...

  8. 如何在 Windows Phone 8 中获取手机的当前位置

    原文 如何在 Windows Phone 8 中获取手机的当前位置 适用于:仅限于 Windows Phone 8. 本主题演示如何使用 Windows Phone 位置 API 确定手机的当前位置. ...

  9. selenium获取元素

    1.获取窗口titledriver.title2.获取urldriver.current_url3.获取窗口截图driver.get_screenshot_as_file('window.png')4 ...

随机推荐

  1. C++ URLencode library

    I need a library that can URLencode a string/char array. Now, I can hex encode an ASCII array like h ...

  2. unity开发笔记

    debug代码       Debug.Log("普通信息");         Debug.LogWarning("警告信息");         Debug ...

  3. 神经网络中的偏置项b到底是什么?

    原文地址:https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/81074408 前言        很多人不明白为什么要在神经网络.逻 ...

  4. [1]字符串按中文符占3位进行指定长度剪切[2]Double类型截取指定长度(指定长度=整数位+小数位)

    /** 将中文字符串剪切为在当前db2(编码GBK)中所占用的长度*/ public String cutStringForDb2(String src,Integer size) { int len ...

  5. maven:打包时报错,报’找不到符号’

    参考文章:https://www.cnblogs.com/kelly-one/p/7349930.html 问题描述: 工程开发调试都没有问题,就是不能导出WAR包,用mvn clean packag ...

  6. GZip、deflate和sdch压缩(网摘整理)

    GZip和deflate: gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代 ...

  7. HAProxy从零开始到掌握

    转自:https://www.jianshu.com/p/c9f6d55288c0 目录: HAProxy是什么 HAProxy的核心能力和关键特性 HAProxy的安装和运行 使用HAProxy搭建 ...

  8. SwipeRefreshLayout详解和自定义上拉加载更多

    个人主页 演示Demo下载 本文重点介绍了SwipeRefreshLayout的使用和自定View继承SwipeRefreshLayout添加上拉加载更多的功能. 介绍之前,先来看一下SwipeRef ...

  9. hadoop环境配置

    0. Hadoop源码包下载 http://mirror.bit.edu.cn/apache/hadoop/common/   1. 集群环境 Master 172.16.11.97 Slave1 1 ...

  10. ORACLE in与exists语句的区别

    select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与 ...