编程语言
首页 > 编程语言> > Python+uiautomator2指定区域截图

Python+uiautomator2指定区域截图

作者:互联网

想区域截图,但是在网上找了一圈,没有什么有用的信息,基本都是全屏截图的信息。最后只能自己尝试着摸索了。

已知d.screenshot()是截取整个屏幕,尝试根据元素截图d(resourceId="xx.xx.xx").screenshot截图,发现可以截取指定元素区域,具体代码如下

d = u2.connect("192.168.10.10")
d(resourceId="com.xxx.xxx:id/tv_close").screenshot().save("test.png")

既然能截取元素区域的图片,那肯定能够截取指定区域的图片,遂查看screenshot的实现逻辑(在_selector.py里),代码如下

def screenshot(self) -> Image.Image:
    im = self.session.screenshot()
    return im.crop(self.bounds())

主要就是self.bounds()这个函数,继续点进去查看,发现截图区域的坐标是调用元素的info信息获取的

def bounds(self):
    """
    Returns:
        left_top_x, left_top_y, right_bottom_x, right_bottom_y
    """
    info = self.info
    bounds = info.get('visibleBounds') or info.get("bounds")
    lx, ly, rx, ry = bounds['left'], bounds['top'], bounds['right'], bounds['bottom'] # yapf: disable
    return (lx, ly, rx, ry)

所以,我们只需要重写一下screenshot函数即可,传入我们指定的坐标。

(只简单重写,本着能用就行的原则,部分异常未做处理)

    def screenshot(self,bounds=None) -> Image.Image:
        im = self.session.screenshot()
        if isinstance(bounds, tuple) and len(bounds)==4:
            try:
                ret = im.crop(bounds)
            except:
                raise "poition error"
                return False
            else:
                return ret
        return im.crop(self.bounds())

截图时传入 (lx, ly, rx, ry)  4个坐标即可

缺点就是,调用的时候只能用  d.(元素定位信息).screenshot((lx, ly, rx, ry)).save("xx.png"),不能直接使用d.screenshot()这种方法调用。

标签:info,截图,return,screenshot,Python,self,bounds,uiautomator2
来源: https://blog.csdn.net/ourjaycn/article/details/120096780