如果我们要了解某个元素在整个屏幕中的位置,例如滑动验证码的滑块之类的。这就像是在网页上画了个直角坐标系,找到它在网页或者电脑屏幕的横坐标和纵坐标的位置,就像是在地图上找到我们所在的位置一样,定位到那个元素的位置。
上图是打个比方~
1. 获取某个元素在电脑的【绝对】位置
可以使用下面的方法:
button_ = driver.find_element(By.CSS_SELECTOR, '# button')
x_= button_ .rect['x']
y_= button_ .rect['y']
print("按钮在网页上的相对位置 x: ", x_, " y: ", y_)
这样就可以知道某个网页元素,例如按钮在网页中的位置了。
但是这个有个前提,需要网页放大至最大化,几乎是电脑屏幕那么大,执行效果就像是按下了F11, 这样这个元素才是上面相对位置的大小。
如果没有放大,那么这个位置是不准的,如果使用pyautogui
去点击这个位置,就会发现点错了。
这是因为电脑屏幕尺寸、屏幕像素、以及网页尺寸三者不一样的时候,使用网页位置定位出来的元素位置信息,就会跟电脑屏幕的位置匹配不上了。
上一期写了,【Python】selenium获取定位元素大小、电脑屏幕的像素、屏幕尺寸信息、以及网页尺寸的方法
下面的各个对象的计算方法可以参考上面的文章~
2. 获取某元素相对于整个屏幕上的【相对】位置
如果我们想计算某些网页元素相对于整个屏幕上的位置,(例如滑动验证码的滑块按钮的位置),然后再计算出像素位置,这样可以排除像素和物理长度的差别 公式:
某元素在网页上的相对位置= (按钮的图片像素+ 电脑屏幕的像素 - 网页尺寸) * (电脑屏幕的像素 / 屏幕尺寸)
PositionX = (button_.rect['x'] + screenx - documentx) * (windowx / screenx)
PositionY = (button_.rect['y'] + screeny - documenty) * (windowy / screeny)
print("的相对位置 x: ", PositionX, " y: ", PositionY)
print (PositionX, PositionY)
如果是 拉动滑块按钮,类似是得出了下面的滑块按钮在网页上的相对位置
如果要拖动验证码移动的话,就要加上滑块大小的位置(例如下图的蓝色箭头的大小)
3. 计算滑块的距离长度
计算距离的方法:
from selenium import webdriver
import pyautogui
import time
driver = webdriver.Chrome(options=option)
time.sleep(3)
driver.maximize_window() # 最大化窗口
time.sleep(6)
current_position = pyautogui.position()
print(f"目标移动位置:X={xx}, Y={y}")
print(f"当前鼠标位置:X={current_position.x}, Y={current_position.y}")
可以运行上面的代码,然后再休息期间,鼠标放在滑块中心,分别计算出两个滑块的位置,然后计算长度(例如上面红色箭头),从而可以计算滑块中心的距离,假设滑块的距离是25,则滑块的x坐标和y坐标的位置是:
SLIDE_X_POSITION = PositionX+ 25 # 抓取滑块的中心
SLIDE_Y_POSITION = PositionY+ 25 # 抓取滑块的中心
后面的写法就是,抓住按钮的位置(SLIDE_X_POSITION ,SLIDE_Y_POSITION ),然后拖动红色箭头的长度,就可以完成拖拽的过程了!