准备着手研究简单验证码的识别,需要用到pyAutoGui库。
使用过程中发现moveTo方法直接用location取得的元素的坐标位置不一致,网上的方法说的也很模糊,于是打算自己做个简单的测试。
结论:
moveTo拿到的坐标后,以电脑屏幕的左上角为原点进行定位。
而selenium中的location与rect(rect实际上就是location与size的组合)的坐标是以网页界面左上角为原点。
以下为探究过程与具体图示。
个人探索不一定准确,恳请大佬们指出错误。
简单的测试用html页面如下:只有一个盒子和一组复选框。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="one" hidden="hidden">1111</div>
<div id="two">2222</div>
<form action="" method="get">
<label><input name="Fruit" type="checkbox" value="" />苹果 </label>
<label><input name="Fruit" type="checkbox" value="" />桃子 </label>
<label><input name="Fruit" type="checkbox" value="" />香蕉 </label>
<label><input name="Fruit" type="checkbox" value="" />梨 </label>
</form>
</body>
</html>
完整的python测试代码如下:
from selenium import webdriver
from time import sleep
import os
import pyautogui
class Addition:
def __init__(self):
self.driver = webdriver.Chrome()
path = 'file:///'+os.path.abspath('Elements.html')
self.driver.get(path)
# self.driver.maximize_window()
sleep(1)
def PyAutoGui(self):
elem = self.driver.find_element_by_xpath('/html/body/form/label[2]/input')
# elem.location是纯位置 elem.rect是size+location
rect = elem.rect
#rect是个字典
# pyautogui.moveTo(rect['x'], rect['y']+120)
# moveTo的坐标系原点是 电脑屏幕的左上角
pyautogui.moveTo(20,20)
sleep(3)
pyautogui.click()
# 有没有最大化窗口 元素的坐标值都是一样的
print(elem.rect)
def last(self):
self.driver.quit()
if __name__ == '__main__':
test = Addition()
test.PyAutoGui()
test.last()
(对于没办法截图截到鼠标而用拍照展示表示抱歉)
1.moveTo方法定位原点探究
关键代码如下:
self.driver.maximize_window()
pyautogui.moveTo(20,20)
通过鼠标所在位置可以看出究竟以哪处为原点
前者为未最大化窗口时的鼠标位置
后者为最大化窗口之后的情况
2.location属性坐标原点探究
我获取了桃子复选框的rect值,打印出其数据为
{‘height’: 13, ‘width’: 13, ‘x’: 68.734375, ‘y’: 33}
通过截图软件看出:
所以要想使moveTo方法可以准确定位到元素,还应该加上竖直方向多出的菜单栏的距离。