多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] 前言 在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据。 在写用例的时候,最后一步是断言,可以把截图的动作放在断言这里,那么如何在断言失败后截图呢? ## **一、截图方法** ``` 1.get_screenshot_as_file(self, filename) --这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。 filename参数是保存文件的路径。 Usage: driver.get_screenshot_as_file('/Screenshots/foo.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() ``` <br /> ## **二、异常后截图** 1. 为了能抛异常,把定位登录按钮的id换了个错的id。 2. 给图片命名时候加个时间戳,避免同一个文件名称被覆盖掉。 3. 文件路径,这里直接写的文件名称,就是跟当前的脚本同一个路径。如果图片输出到其它文件路径,需要些文件的绝对路径了。 4. 截图的结果,如果没截到图返回False,截图成功会返回True。 ``` from selenium import webdriver import time url_login = "https://account.cnblogs.com/signin" driver = webdriver.Chrome() driver.get(url_login) try: driver.find_element_by_id("mat-input-0").send_keys("栀楠") driver.find_element_by_id("mat-input-1").send_keys("xxx") # 登录id是错的,定位会抛异常 driver.find_element_by_id("signin").click() # driver.find_elements_by_css_selector(".mat-button-wrapper:nth-child(0)").click() except Exception as msg: print("异常原因 %s" %msg) # 图片名称可以加个时间戳 nowTime = time.strftime("%Y%m%d.%H.%M.%S") t = driver.get_screenshot_as_file("%s.jpg" % nowTime) print("截图结果: %s" %t) ``` <br /> ## **三、selenium实例** 1. 在unittest框架里写用例的时候,我们希望在断言失败的时候,对当前屏幕截图。 2. 如果加try...except捕获异常后结果,此时所有的测试用例都是通过的了,会影响测试结果。解决办法其实很简单,再把异常抛出来就行了。 3. 参考代码: ``` 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://account.cnblogs.com/signin" self.driver = webdriver.Chrome() self.driver.get(url_login) def test_01(self): '''前面输入账号密码,让正确运行到assert这一步,断言故意设置为False不成功''' try: self.driver.find_element_by_id("mat-input-0").send_keys("栀楠") self.driver.find_element_by_id("mat-input-1").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, "栀楠")(self.driver) except Exception as msg: print("异常原因 %s" %msg) # 图片名称可以加个时间戳 nowTime = time.strftime("%Y%m%d.%H.%M.%S") self.get_screenshot_as_file("%s.jpg" % nowTime) raise def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main() ```