在 python 中创建一个函数或 class 来为每个网络元素截取不同名称的屏幕截图?

Creating a function or class in python to take screenshots with different names for each web element?

我不熟悉使用 selenium webdriver (Python 3) 进行自动浏览器测试。我已经在使用以下方法进行测试和截屏:

from selenium import webdriver
from selenium.webdriver.support.events import EventFiringWebDriver
from selenium.webdriver.support.events import AbstractEventListener
import unittest

class ScreenshotListener(AbstractEventListener):
    def on_exception(self, exception, driver):
        driver.get_screenshot_as_file("C:/Error.png")

class Test1_Chrome(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()                    # Set chrome browser
        self.driver1 = EventFiringWebDriver(self.driver, ScreenshotListener())
        self.driver.maximize_window()                       # Maximize window
        time.sleep(0.30)                                    # Wait 30 seconds

    def test_port(self):
        driver = self.driver1
        driver.get("http://")              # Opens url into chrome
        driver.get_screenshot_as_file("C:/Chrome_screenshots/Screenshot1.png")
        driver.find_element_by_css_selector("a[name*='']").click()
        driver.get_screenshot_as_file("C:/Chrome_screenshots/Screenshot2.png")
        driver.find_element_by_css_selector("b[name*='']").click()
        driver.get_screenshot_as_file("C:/Chrome_screenshots/Screenshot3.png")
        driver.find_element_by_css_selector("a[href*='']").click()
        driver.get_screenshot_as_file("C:/Chrome_screenshots/Screenshot4.png")

    def tearDown(self):
        time.sleep(2)
        driver = self.driver1
        driver.close()

class Test2_IE(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Ie()                    # Set IE browser
        self.driver2 = EventFiringWebDriver(self.driver, ScreenshotListener())
        self.driver.maximize_window()                       # Maximize window
        time.sleep(0.30)                                    # Wait 30 seconds

    def test_port(self):
        driver = self.driver2
        driver.get("http://")              # Opens url into IE
        driver.get_screenshot_as_file("C:/IE_screenshots/Screenshot1.png")
        driver.find_element_by_css_selector("a[name*='']").click()
        driver.get_screenshot_as_file("C:/IE_screenshots/Screenshot2.png")
        driver.find_element_by_css_selector("b[name*='']").click()
        driver.get_screenshot_as_file("C:/IE_screenshots/Screenshot3.png")
        driver.find_element_by_css_selector("c[href*='']").click()
        driver.get_screenshot_as_file("C:/IE_screenshots/Screenshot4.png")

    def tearDown(self):
        time.sleep(2)
        driver = self.driver2
        driver.close()

class Test3_Firefox(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()                    # Set Firefox browser
        self.driver3 = EventFiringWebDriver(self.driver, ScreenshotListener())
        self.driver.maximize_window()                       # Maximize window
        time.sleep(0.30)                                    # Wait 30 seconds

    def test_port(self):
        driver = self.driver3
        driver.get("http://")              # Opens url into FireFox
        driver.get_screenshot_as_file("C:/FF_screenshots/Screenshot1.png")
        driver.find_element_by_css_selector("a[name*='']").click()
        driver.get_screenshot_as_file("C:/FF_screenshots/Screenshot2.png")
        driver.find_element_by_css_selector("b[name*='']").click()
        driver.get_screenshot_as_file("C:/FF_screenshots/Screenshot3.png")
        driver.find_element_by_css_selector("c[href*='']").click()
        driver.get_screenshot_as_file("C:/FF_screenshots/Screenshot4.png")

    def tearDown(self):
        time.sleep(2)
        driver = self.driver3
        driver.close()

if __name__ == '__main__':
    unittest.main()

问题:我想为这些屏幕截图创建一些循环或函数一种方式:将所有三个浏览器元素屏幕截图保存在具有所有不同名称的不同文件夹中。示例:ChromeSreenshots- Screenshot1、screenshot2 等; IESreenshots- Screenshot1、screenshot2 等; FirefoxSreenshots- Screenshot1、screenshot2 等。如何创建调用相同或不同 python 文件的函数?

我使用的代码已经具有 "test_port(self)" 功能,除了屏幕截图(位置和名称)外,这三个浏览器都通用。我想通过调用所有三个浏览器测试来使用 "test_port(self)" 函数,但问题是我希望屏幕截图位于不同的位置和不同的名称。我在网上搜索但没有找到解决这个问题的好方法。

我查看了您的代码,所有三个 classes,Test1-3,除了浏览器实例之外都是相同的。这告诉我的是,您应该在测试之前实例化 WebDriver 实例并将其传递到 class。一旦进入 class,您可以检测您正在使用的 WebDriver 实例(使用 .isinstance()see this question),然后您可以为 Chrome vs Firefox vs IE 创建一个子文件夹等,并将所有屏幕截图放在那里。完成后,每个浏览器都应该有一个文件夹,其中包含 4 个屏幕截图,例如c:\chrome\ss1.png, c:\chrome\ss2.png, c:\ff\ss1.png, c:\ff\ss2.png, c:\ie\ss1.png, c:\ie\ss2.png,等等.


注意:python 不是我编写程序所用的语言,因此此代码可能不是最佳的。一些示例代码

def test_port(self):
    driver = self.driver1
    driver.get("http://")              # Opens url
    path = get_screenshot_path()
    driver.get_screenshot_as_file(path + "Screenshot1.png")
    driver.find_element_by_css_selector("a[name*='']").click()
    driver.get_screenshot_as_file(path + "Screenshot2.png")
    driver.find_element_by_css_selector("b[name*='']").click()
    driver.get_screenshot_as_file(path + "Screenshot3.png")
    driver.find_element_by_css_selector("a[href*='']").click()
    driver.get_screenshot_as_file(path + "Screenshot4.png")

def get_screenshot_path(self)
    path_root = "c:\"
    if isinstance(self.driver, webdriver.Chrome())
        # the driver is a instance of the Chrome driver
        path = path_root + "chrome\"
    if isinstance(self.driver, webdriver.Firefox())
        # the driver is a instance of the Firefox driver
        path = path_root + "firefox\"
    # create the subfolder if it doesn't exist
    os.makedirs(path, exist_ok=True)
    return path

通过使用 isinstance()(来自 JeffC 的回答),驱动程序未关闭 teardown()。因此我找到了一些更简单的解决方案。有谁知道使此代码看起来更短的一些方法示例:设置和拆卸功能正在重复。我看到了其他关于 desiredCapabities 的问题。我真的不知道它在我的情况下和 python.

是如何工作的
import..

class ScreenshotListener(AbstractEventListener):
    def on_exception(self, exception, driver):
        driver.get_screenshot_as_file("C:/Error.png")

class Test1_Chrome(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()                    # Set chrome browser
        self.driver1 = EventFiringWebDriver(self.driver, ScreenshotListener())
        self.driver.maximize_window()                       # Maximize window
        time.sleep(0.30)                                    # Wait 30 seconds

    def test_port1(self):
        driver = self.driver1
        driver.get("http://")              # Opens url into chrome
        global directory
        directory = 'C:/Chrome_screenshots/'
        test_port(self)

    def tearDown(self):
        time.sleep(2)
        driver = self.driver1
        driver.close()

class Test2_IE(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Ie()                    # Set IE browser
        self.driver2 = EventFiringWebDriver(self.driver, ScreenshotListener())
        self.driver.maximize_window()                       # Maximize window
        time.sleep(0.30)                                    # Wait 30 seconds

    def test_port2(self):
        driver = self.driver2
        driver.get("http://")              # Opens url into IE
        global directory
        directory = 'C:/IE_screenshots/'
        test_port(self)

    def tearDown(self):
        time.sleep(2)
        driver = self.driver2
        driver.close()

class Test3_Firefox(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()                    # Set Firefox browser
        self.driver3 = EventFiringWebDriver(self.driver, ScreenshotListener())
        self.driver.maximize_window()                       # Maximize window
        time.sleep(0.30)                                    # Wait 30 seconds

    def test_port3(self):
        driver = self.driver3
        driver.get("http://")              # Opens url into FireFox
        global directory
        directory = 'C:/Firefox_screenshots/'
        test_port(self)

    def tearDown(self):
        time.sleep(2)
        driver = self.driver3
        driver.close()

def test_port()
    driver.get_screenshot_as_file( directory + "Screenshot1.png")
    driver.find_element_by_css_selector("a[name*='']").click()
    driver.get_screenshot_as_file( directory + "Screenshot2.png")
    driver.find_element_by_css_selector("b[name*='']").click()
    driver.get_screenshot_as_file("directory + Screenshot3.png")
    driver.find_element_by_css_selector("c[href*='']").click()
    driver.get_screenshot_as_file( directory + "Screenshot4.png")


if __name__ == '__main__':
    unittest.main()