selenium相關:通過location 和 size 獲取元素所在像素位置和尺寸,截取圖片ROI


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM