前言
在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望对当前屏幕截图,留下证据。
selenium可以实现截取全图,那么如何截取某个元素的图?不要全部的,只要某个元素。。
一、selenium截图(截取全屏)方法
1.get_screenshot_as_file(self,filename)、save_screenshot(self, filename)
--这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True.
filename参数是保存文件的路径。
如,driver.get_screenshot_as_file("D:\a.png")
driver.save_screenshot("D:/b.png")
driver.get_scrrenshot_as_file("c.png") #当前脚本所在目录下
2.get_screenshot_as_base64(self)
--这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。
比如,想把截图放到html测试报告里。
Usage:
driver.get_screenshot_as_base64()
3.get_screenshot_as_png(self)
--这个是获取屏幕截图,保存的是二进制数据,很少用到.
Usage:
driver.get_screenshot_as_png()
二、异常后截图
1.为了能抛出异常,把定位“百度一下”按钮的id换个错的id。
2.给图片命名时候加上时间,避免同一文件名称被覆盖掉。
3.文件路径,相对路径或绝对路径。执行代码后,在相应位置查看图片
4.运行的结果,如果没截到图返回False,截图成功会返回True。
参考代码:
# coding:utf-8 from selenium import webdriver import time driver=webdriver.Chrome() driver.get("https://www.baidu.com") try: driver.find_element_by_id("kw").send_keys("xixi") driver.find_element("id","suxx").click() except Exception as msg: print("报错信息:{}".format(msg)) ctime=time.strftime("%Y%m%d_%H%M%S",time.localtime()) pic=driver.get_screenshot_as_file("{}.png".format(ctime)) pic1=driver.get_screenshot_as_file("{}.png".format("d:\a")) pic2=driver.get_screenshot_as_file("{}.png".format("D:/b")) #盘符(d,D)大小写都可以 print("截图结果:{},{},{}".format(pic,pic1,pic2))
运行结果:
报错信息:Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="suxx"]"} (Session info: chrome=84.0.4147.89) 截图结果:True,True,True
三、get_screenshot_as_file源码如下
def get_screenshot_as_file(self, filename): """ Saves a screenshot of the current window to a PNG image file. Returns False if there is any IOError, else returns True. Use full paths in your filename. :Args: - filename: The full path you wish to save your screenshot to. This should end with a `.png` extension. :Usage: driver.get_screenshot_as_file('/Screenshots/foo.png') """ if not filename.lower().endswith('.png'): warnings.warn("name used for saved screenshot does not match file " "type. It should end with a `.png` extension", UserWarning) png = self.get_screenshot_as_png() try: with open(filename, 'wb') as f: f.write(png) except IOError: return False finally: del png return True
四、截取某个元素的图
4.1 安装pillow
cmd打开,输入:pip install pillow
4.2 location获取元素坐标
a. 以百度的搜索框为例,打印搜索框所在的位置:
# coding:utf-8 from selenium import webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com") driver.save_screenshot("a0904.png") s=driver.find_element_by_id("kw") #打印元素坐标 print(s.location)
b.运行结果:{'x': 298, 'y': 209},结果可以看出,返回的是一个字典类型的数据,x代表横坐标,y代表纵坐标(每个人的电脑窗口大小不一样,得到的结果也不一样,不用纠结)
4.3 size获取元素大小
a.获取元素的大小,用s.size接口与获取到了
print(s.size)
b.运行结果:{'height': 44, 'width': 548},这个也是字典类型,width是宽度,height是高度
参考代码:
# coding:utf-8 from selenium import webdriver from PIL import Image driver=webdriver.Chrome() driver.get("https://www.baidu.com") driver.save_screenshot("a0904.png") s=driver.find_element_by_id("kw") #打印元素坐标 print(s.location) #打印元素大小 print(s.size) left=s.location['x'] top=s.location['y'] right=s.location['x']+s.size['width'] bottom=s.location['y']+s.size['height'] im=Image.open("a0904.png") im=im.crop((left,top,right,bottom)) im.save('a09041.png')
运行结果:
{'x': 298, 'y': 209} {'height': 44, 'width': 548}
五、可以直接定位元素,.screenshot(“图片路径名称”)
参考代码:
from selenium import webdriver from PIL import Image driver=webdriver.Chrome() driver.get("https://www.baidu.com") # driver.save_screenshot("E:\990.png") s=driver.find_element_by_id("kw") s.screenshot("E:\991.png")
运行结果: