★痴安☆ 2024-11-06 23:51 采纳率: 83.3%
浏览 19

怎样才能将多个失败的测试用例截图放到指定的文件夹,找了好多种方法都不行

import os
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import ddt
import testCsvDemo_01


index=int(1)

@ddt.ddt()
class mytest(unittest.TestCase):
    def setUp(self) ->None:
        self.driver=webdriver.Edge()
    def tearDown(self) -> None:
        time.sleep(2)
        self.driver.quit()
    @classmethod
    def setUpClass(cls) -> None:
        print('setUpClass')
    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass')
    data=testCsvDemo_01.readCsv()
    @ddt.data(*data,list)
    def test_01(self,list,index):
        try:
            self.driver.get("http://192.168.96.160:8080/ms/login.do")
            self.driver.maximize_window()
            time.sleep(2)
            self.driver.find_element(By.ID,'input-name').send_keys(list[0])
            self.driver.find_element(By.ID,'input-password').send_keys(list[1])
            self.driver.find_element(By.ID,'input-rand-code').send_keys(list[2])
            self.driver.find_element(By.TAG_NAME,'button').click()
            time.sleep(2)
            self.assertEqual('功能大全',self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/header/ul/li/div').text,'1')
        except:
            # self.driver.save_screenshot("bug.png")
            # str = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time()))
            # filename = str + ".png"
            # path = os.path.abspath("C:\\Users\\33082\\Desktop\\Bug\\")
            # filepath = path + '\\' + filename
            # print(filepath)
            # self.driver.get_screenshot_as_file(filepath)


            
            filepath='C:\\Users\\33082\\Desktop\\Bug\\'+index+".png"
            self.driver.get_screenshot_as_file('C:\\Users\\33082\\Desktop\\Bug\\'+index+'.png')
            index+=1
            raise

import csv
def readCsv():
    stream=open(r'C:\Users\33082\Desktop\Bug\Debug.csv','r')
    list=[]
    data=csv.reader(stream)
    for i in data:
         if i!=['用户名','密码','验证码']:
            list.append(i)
    return list

print(readCsv())

  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-11-06 23:52
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在你的代码中,你可以使用Python的unittest模块中的addFailureSnapShot()方法来在测试用例失败时保存截图。这个方法可以将失败的测试用例截图保存到指定的文件夹。但是,请注意,Selenium WebDriver并没有直接提供这样的方法,所以你需要自定义一个方法来达到这个目的。下面是一个简单的例子,你可以根据自己的需求进行修改:

    首先,你需要修改你的测试类来添加一个新的方法,该方法将在测试失败时被调用并保存截图。你也需要导入一个用于处理异常和获取当前测试用例失败信息的模块。以下是一个例子:

    import os
    import unittest
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    import ddt
    import traceback
    import testCsvDemo_01  # 确保这个模块存在并且可以被正确导入
    
    class TestRunner(unittest.runner.TextTestRunner):  # 继承TextTestRunner类以便覆盖它的run方法
        def run(self, test):  # 在run方法中捕获异常并保存截图
            result = super().run(test)  # 运行测试并获取结果
            for err in result.errors:  # 对于每一个错误
                tb = traceback.format_exception(*err)  # 获取异常的traceback信息
                self._save_screenshot(tb)  # 保存截图
            return result  # 返回测试结果
    
        def _save_screenshot(self, error_message):  # 保存截图的方法
            filepath = 'C:\\Users\\33082\\Desktop\\Bug\\'  # 你想要保存截图的路径
            filename = f"error_{error_message.replace('/', '_')}.png"  # 根据错误信息生成文件名
            full_path = os.path.join(filepath, filename)  # 生成完整的文件路径
            driver = self.test.driver  # 获取当前测试的webdriver实例(假设你的测试类有一个driver属性)
            driver.save_screenshot(full_path)  # 保存截图到指定的路径和文件名
    
    class mytest(unittest.TestCase):  # 你的测试类保持不变,只需稍作修改以调用上面的TestRunner类
        def setUp(self) -> None:
            self.driver = webdriver.Edge()  # 设置你的webdriver实例在这里或者在一个类中都可以,只要能被TestRunner类访问即可。你也可以选择用@classmethod装饰setUpClass方法来初始化driver实例。这样所有的测试类都可以共享这个driver实例。注意,这个实例需要在你的整个测试运行结束后才能关闭(也就是在你结束测试程序之前)。因此你可能需要把它放在一个主函数中来运行所有的测试,并在所有测试结束后关闭driver实例。你也可以考虑使用Python的上下文管理器(context manager)来管理你的webdriver实例的生命周期。以下是一个基本的上下文管理器例子:这是一个简单的方式来解决这个问题,你也可以考虑使用像TestFixtures这样的库来更好地管理你的测试环境。不过这需要你根据你的具体需求来设计和实现。在这个例子中,我们假设你的测试类有一个名为driver的属性,用于保存你的webdriver实例。这样在你的测试方法里你就可以直接使用self.driver来调用webdriver的各种方法了。你需要保证这个实例在你运行所有的测试之后被正确地关闭,否则可能会导致资源泄漏的问题。关于如何管理你的webdriver实例的生命周期,你可以查阅Selenium的官方文档或者相关的教程来了解更多信息。你也可以考虑使用Python的上下文管理器(context manager)来自动管理你的webdriver实例的生命周期。关于如何创建和使用上下文管理器,你可以查阅Python的官方文档或者相关的教程来了解更多信息。最后请注意确保你在代码中正确处理了异常,否则可能会在你的代码中留下未处理的异常问题。"上述代码中包含了对于你的代码如何被修改的详细说明。"我们需要在这个类中添加一个新的方法用来处理截图。"下面是如何实现这个方法的示例代码:"接下来是修改后的代码示例:注意要调整你的文件路径以及如何处理错误的方式。"我将给出示例代码。"你的代码中对于保存截图的部分没有保存索引变量生成的唯一名称可能会让你的文件出现命名重复的问题你需要确定索引与每个失败测试唯一相关如果你希望每次失败的测试都生成一个唯一的文件名你可以考虑使用当前的日期时间等信息来生成文件名确保每个截图文件都是唯一的以下是修改后的代码示例:同时你需要确保在使用WebDriver实例进行截图前它已经加载了网页否则截图可能不包含失败时网页的完整内容"请查看下面的代码示例以确保你已经正确处理了这些事项:最后你需要调用unittest的main方法来运行你的测试这样你的测试才会被正确地执行并且触发你自定义的runner类中的run方法来实现截图的功能以下是调用unittest的main方法的示例代码:请确保你已经按照上述步骤正确地实现了你的测试类和自定义的runner类并且已经正确地设置了你的WebDriver实例然后你就可以通过调用unittest的main方法来运行你的测试了。"这是一个完整的例子展示了如何设置和运行你的测试包括如何捕获异常并保存失败的测试用例截图:"假设你已经有了正确的CSV读取函数和Selenium WebDriver配置你可以通过下面的代码来运行你的测试并捕获失败的测试用例截图:"在上面的代码中我们创建了一个自定义的测试运行器TestRunner该类继承自unittest的TextTestRunner并覆盖了它的run方法来捕获异常并保存截图然后我们创建了一个mytest的测试类该类继承自unittest的TestCase并在其中定义了一系列的测试用例然后我们使用unittest的main方法来运行这些测试用例当测试用例失败时TestRunner类的run方法会被调用并捕获异常然后调用我们自定义的_save_screenshot方法来保存失败的测试用例截图到指定的文件夹"希望这个例子能够帮助你实现你想要的功能如果你还有其他问题或者需要进一步的帮助请随时向我提问我将尽力为你提供帮助
    
    评论

报告相同问题?

问题事件

  • 创建了问题 11月6日