pyautogui.moveTo方法与selenium location属性关于坐标原点位置的探究过程

准备着手研究简单验证码的识别,需要用到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方法可以准确定位到元素,还应该加上竖直方向多出的菜单栏的距离。

def get_stock_minute_price_in_one_day_by_sina_pyautogui_new(str_date,tscode): newdf={} x = 81 y = 635 while True: try: pyautogui.click(pyautogui.center(pyautogui.locateOnScreen(r"C:\PycharmProjects\my_backtest\img\browser.png", confidence=0.9)),duration=0.25) waiting_time=time.time() while True: if(pyautogui.locateOnScreen(r"C:\PycharmProjects\my_backtest\img\browser_plus.png", confidence=0.8)!=None): pyautogui.click(pyautogui.center( pyautogui.locateOnScreen(r"C:\PycharmProjects\my_backtest\img\browser_plus.png", confidence=0.8)), duration=0.25) break if(time.time()-waiting_time>10): raise BaseException time.sleep(1) pyautogui.typewrite("https://finance.sina.com.cn/h5charts/tchart.html?symbol="+tscode+"&date="+str_date+"&rangeselector=true&indicator=tvol",interval=0.05) time.sleep(1) pyautogui.press("enter") time.sleep(2) # if(pyautogui.locateOnScreen(r"C:\PycharmProjects\my_backtest\img\void_line.png", confidence=0.8)==None): # raise BaseException pyautogui.moveTo(x, y, duration=0.25) while True: x=x+7 pyautogui.moveTo(x,y) img1 = pyautogui.screenshot(region=(2279 - 24,237- 66, 214, 154)) img2 = pyautogui.screenshot(region=(117 - 24, 238 - 66, 214, 154)) pool.submit(gsmpiodbspn_thread, newdf, img1,img2) if (("15:00" in newdf) == True or x >= 2475): break pyautogui.click(pyautogui.center( pyautogui.locateOnScreen(r"C:\PycharmProjects\my_backtest\img\close_browser.png", confidence=0.8)), duration=0.25) if(("15:00" in newdf)==True or x>=2475): break except BaseException as e: print(e) pyautogui.click(pyautogui.center( pyautogui.locateOnScreen(r"C:\PycharmProjects\my_backtest\img\close_browser.png", confidence=0.8)), duration=0.25) return newdf。 请问上面这段个函数,在不改变原来功能的情况下,如何提高运行速度
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值