Избегайте дублирования кода при написании тестов селена для Firefox и Chrome - PullRequest
0 голосов
/ 29 апреля 2019

Если вы пишете тесты для Selenium для проверки, например, Firefox и Chrome, тесты выглядят очень похоже, за исключением setUp, см., Например, https://gist.github.com/devinmancuso/54904c005f8d237f6fec,, который имеет идентичные функции test_search_in_python_chrome и test_search_in_python_firefox.Существуют шаблоны, позволяющие избежать дублирования кода в селене, например Шаблон объекта страницы .

Есть ли способ избежать такого огромного дублирования кода?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Содержимое 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 и запуска ПО.укажите

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())

Таким образом, вы можете написать тест один раз и запустить егоразные браузеры, просто изменив файл конфигурации.

0 голосов
/ 02 мая 2019

@ Ответ Гая показал направление. Решение , которое немного проще, состоит в использовании MixIns:

class DuckMixin(object):
    def testDuckLoads(self):
        self.browser.get("https://duckduckgo.com")
        self.assertIn("duckduckgo", self.browser.title.lower())

    def testDuckSafe(self):
        self.browser.get("https://duckduckgo.com")
        (self.browser
         .find_element_by_id("search_form_input_homepage")
         .send_keys("porn" + webdriver.common.keys.Keys.RETURN))
        # click to disable temporarily, then wait, then see if available
        self.browser.implicitly_wait(10)
        self.browser.find_element_by_class_name("js-safe-search-temp").click()
        # assert that browser.find_element_by_class_name("js-safe-search-temp") still exists, else throws exception
        self.browser.find_element_by_class_name("js-safe-search-temp")


class DuckDuckGoTestCaseFirefox(unittest.TestCase, DuckMixin):
    def setUp(self):
        profile = webdriver.FirefoxProfile()
        profile.add_extension(extension=os.path.join(DIR, "..", "addon"))
        self.browser = webdriver.Firefox(firefox_profile=profile)

    def tearDown(self):
        self.browser.close()

class DuckDuckGoTestCaseChromium(unittest.TestCase, DuckMixin):
    def setUp(self):
        profile = webdriver.chrome.options.Options()
        profile.add_extension(extension=os.path.join(DIR, "..", "safe.zip"))
        self.browser = webdriver.Chrome(chrome_options=profile)

    def tearDown(self):
        self.browser.close()
...