首页 > 解决方案 > 为 Firefox 和 Chrome 编写 selenium 测试时避免代码重复

问题描述

如果您为 Selenium 编写测试以检查例如 Firefox 和 Chrome,则测试看起来非常相似,除了设置,参见例如https://gist.github.com/devinmancuso/54904c005f8d237f6fec,它具有相同的功能test_search_in_python_chrometest_search_in_python_firefox. 有一些模式可以避免 selenium 中的代码重复,例如 Page Object Pattern

有没有办法避免这种巨大的代码重复?

标签: seleniumgoogle-chromefirefoxdesign-patternsdry

解决方案


setUp您提供的链接中的内容是driver初始化。您可以在另一个类中处理此问题并从属性文件中读取浏览器类型

def get_driver(self):
    browser = get_value_from_configurations_file()
    url = get_value_from_configurations_file()

    driver = None
    if browser == 'chrome':
         driver = webdriver.Chrome()
    elif browser == 'firefox':
         driver = webdriver.Firefox()

    driver.maximize_window()
    driver.get(url)

    return driver

我通常在驱动程序工厂和测试之间使用“中间人”来处理driver操作并获取 PO 起点

class WebApplication:

    def __init__(self):
        self.__driver = WebDriverFactory().get_driver()

    def get_driver(self):
        return self.__driver

    def get_home_page(self):
        return HomePage(self.__driver)        

并从基础测试类中使用它

@pytest.mark.usefixtures("run_for_test")
class AbstractTest(ABC):

    web_application = None

    @pytest.fixture()
    def run_for_test(self, request):
        AbstractTest.web_application = WebApplication()
        # set up for all tests
        yield
        # tear down for all tests

示例测试:

class TestExample(AbstractTest):

    def test_example(self):
        home_page = \
            (self.web_application
             .get_home_page())

这样,您只需更改配置文件即可编写一次测试并在不同的浏览器上运行它。


推荐阅读