前言html
在执行用例过程当中因为是无人值守的,用例运行报错的时候,咱们但愿能对当前屏幕截图,留下证据。web
在写用例的时候,最后一步是断言,能够把截图的动做放在断言这里,那么如何在断言失败后截图呢?框架
1、截图方法测试
1.get_screenshot_as_file(self, filename)ui
--这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。编码
filename参数是保存文件的路径。
Usage:
driver.get_screenshot_as_file('/Screenshots/foo.png')url
2.get_screenshot_as_base64(self)htm
--这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。blog
好比,想把截图放到html测试报告里。
Usage:
driver.get_screenshot_as_base64()图片
3.get_screenshot_as_png(self)
--这个是获取屏幕截图,保存的是二进制数据,不多用到.
Usage:
driver.get_screenshot_as_png()
2、异常后截图
1.为了能抛异常,把定位登陆按钮的id换了个错的id。
2.给图片命名时候加个时间戳,避免同一个文件名称被覆盖掉。
3.文件路径,这里直接写的文件名称,就是跟当前的脚本同一个路径。若是图片输出到其它文件路径,须要些文件的绝对路径了。
4.截图的结果,若是没截到图返回False,截图成功会返回True。
3、selenium实例
1.在unittest框架里写用例的时候,咱们但愿在断言失败的时候,对当前屏幕截图。
2.若是加try...except捕获异常后结果,此时全部的测试用例都是经过的了,会影响测试结果。解决办法其实很简单,再把异常抛出来就好了。
3.参考代码:
# coding:utf-8
from selenium import webdriver
import time,unittest
from selenium.webdriver.support import expected_conditions as EC
class Login(unittest.TestCase):
def setUp(self):
url_login = "https://passport.cnblogs.com/user/signin"
self.driver = webdriver.Firefox()
self.driver.get(url_login)
def test_01(self):
'''前面输入帐号密码,让正确运行到assert这一步,断言故意设置为False不成功'''
try:
self.driver.find_element_by_id("input1").send_keys(u"上海-悠悠")
self.driver.find_element_by_id("input2").send_keys("xxx")
# 登陆id是错的,定位会抛异常
self.driver.find_element_by_id("signin").click()
# 判断登陆成功页面是否有帐号:"上海-悠悠"
time.sleep(3)
locator = ("id", "lnk_current_user")
result = EC.text_to_be_present_in_element(locator,u"上海-悠悠")(self.driver)
self.assertFalse(result)
except Exception as msg:
print(u"异常缘由%s"%msg)
# 图片名称能够加个时间戳
nowTime = time.strftime("%Y%m%d.%H.%M.%S")
self.driver.get_screenshot_as_file('%s.jpg' % nowTime)
raise
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
unittest.main()
4.运行结果:
异常缘由True is not falseFailureTraceback (most recent call last): File "D:\test\yoyot\ketang\test01.py", line 22, in test_01 self.assertFalse(result)AssertionError: True is not false