selenium总结:通过location 和 size 获取元素所在像素位置和尺寸,截取图片ROI

1.

2.

    #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}

3.结论:

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

4.应用

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

from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWait

from PIL import Imageimport 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 arraypic = 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) 
时间: 2024-11-04 14:01:56

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

获取代码所在的位置信息

要实现获取代码所在的位置信息的功能, 类System.Diagnostics.StackFrame是关键,源码如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Diagnostics; //需要知道源码位置 6   7 namespace ConsoleApplication1 8 { 9     class Progra

获取后台富文本框内容,截取图片

1.split()  分割字符串,转化成数组 (1)分割数据中有某段字符串的数据 ,转化成数组 //拿取富文本框中的图片var div=data[0].text.split("/agriculture/uploads/");//定义一个变量存放字符串数据 var divstr="";//循环div的长度 for(var k=0;k<div.length;k++){ if(k==0){ //第一个k是字符串,文本内容 divstr+=div[k]; }else{

常用获取元素Driver总结

1.在 Windows 设置临时环境变量 cmd命令窗口 输入 path=%path%;E:\soft\python-3.5.2-embed-win32 永久配置,在系统变量下找到path,在Path的最后面添加Python的安装目录 D:\Python34,同样在PATHEXT中添加 .PY;.PYM 然后,输入python 出现版本信息就成功了. 2.CMD命令窗口,清屏的方法 import os os.system('cls') 如果不要返回值0就是: import os i=os.sys

js获取页面的可是宽度,占位宽度,获取元素左上角相对页面左上角的位置,页面左上角相对可是区域的位置,元素是否存在于页面可视范围内

1 var css = (function () { 2 var doEle = document.documentElement, 3 doBody = document.body, 4 elementScrollLeft, 5 elementScrollTop, 6 utils, 7 offsetLeft, 8 offsetTop, 9 offsetParent; 10 11 utils = { 12 13 // 获取页面的可视宽度和高度 14 getAvailPage: function

Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)

通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参阅! 1 /** 2 * Get element position by jquery, and return integer Array [left distance, top distance, width distance, height distance] 3 * 4 * @author A

selenium获取元素后用click()点击没有作用,用Keys.ENTER就可以成功

selenium获取元素后用click()点击没有作用,用键盘输入enter(Keys.ENTER)就可以成功 #coding = utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_xpath(&

selenium获取元素内容,iframe切换,和常用方法

获取元素信息 1. text 属性,显示该元素在web页面显示出来的文本内容 2. get_attribute方法 获取某个属性的值: element.get_attribute(元素属性) element.get_attribute('href') element.get_attribute('style') 获取该元素对应HTML源代码: element.get_attribute('outerHTML') 获取该元素的内部部分的HTML源代码: element.get_attribute(

selenium获取元素

1.获取窗口titledriver.title2.获取urldriver.current_url3.获取窗口截图driver.get_screenshot_as_file('window.png')4.获取元素截图ele.screenshot('ele.png')5.刷新页面driver.refresh()6.窗口最大化driver.maximize_window()7.窗口最小化driver.minimize_window()8.设置窗口大小(宽,高)driver.set_window_siz

获取元素的属性

简要: 通常在做断言之前,都要先获取界面上的元素属性,然后与期望结果进行对比 一.获取页面title 代码: #coding:utf-8from selenium import webdriverimport timedriver=webdriver.Chrome()driver.implicitly_wait(20)driver.get("https://www.baidu.com")time.sleep(2)title=driver.titleprint(title) driver