zoukankan      html  css  js  c++  java
  • Selenium3+python3自动化(三十八)--异常后截图(screnshot)、只截某个元素的图

    前言

    在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望对当前屏幕截图,留下证据。

    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")
    

     运行结果: 

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    line-height 行高
    CSS菜单横竖布局要点
    鬼吹灯之精绝古城迅雷下载
    sublime less高亮插件
    Swiper说明&&API手册
    jQuery的deferred对象详解
    js中typeof与instanceof的不同用法
    js中apply方法的使用
    Javascript获取当前时间戳的方法
    json对象和json字符串转换方法
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13608438.html
Copyright © 2011-2022 走看看