想区域截图,但是在网上找了一圈,没有什么有用的信息,基本都是全屏截图的信息。最后只能自己尝试着摸索了。
已知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()这种方法调用。