pyautogui 配合 selenium 实现桌面坐标系定位元素坐标,模拟真实鼠标行为。
场景:当我需要点击某个元素,或者触发浏览器的自动填充账号密码时,自动化点击无效。但是想要模拟真实鼠标点击又需要元素的坐标通过pyautogui来实现。通过selenium node.location获取的坐标是相当于浏览器实际内容窗口的坐标系,不能满足pyautogui 直接去自动化操作。这时可以通过浏览器js 获取菜单等实际边框大小计算出 实际的node.location零点位置相对于桌面坐标的坐标系,从而得出元素在桌面坐标系的位置。这样不管怎么操作一般都不会相差太多。
注:未考虑滑动条存在的情况
代码如下:
def get_node_position(driver, node):
"""
获取元素相对于window窗口上的绝对坐标
:param driver: 浏览器自动化对象
:param node: 定位到的元素对象
:return:
"""
window_rect = driver.get_window_rect()
menu = driver.execute_script("return window.outerHeight - window.innerHeight")
border = driver.execute_script("return window.outerWidth - window.innerWidth")
origin_y = window_rect['y'] + menu - (border / 2)
origin_x = window_rect['x'] + (border / 2)
return {"x":node.location['x']+origin_x,"y":node.location['y']+origin_y}
// pyautogui 左键点击
import pyautogui as gui
gui.click(100, 100)