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)