在 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()
我不熟悉使用 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()