diff --git a/conftest.py b/conftest.py index 2cce12b..a3a90df 100644 --- a/conftest.py +++ b/conftest.py @@ -23,13 +23,13 @@ def driver(): def pytest_addoption(parser): """Command line parser.""" parser.addoption(f'--{Config.BASE_URL}', - default='https://s57.ivazh.ru/styles/r14/#12.13/71.2832/72.13405', + default='https://s57map.ivazh.ru/', dest=Config.BASE_URL, action='store', metavar='str', help='Environment for run tests.') parser.addoption(f'--{Config.STAGING}', - default='s57.ivazh.ru', + default='s57map.ivazh.ru', dest=Config.STAGING, action='store', metavar='str', diff --git a/screenshot_tests/tests/simple_test.py b/screenshot_tests/tests/simple_test.py index 354e96e..8eb6eac 100644 --- a/screenshot_tests/tests/simple_test.py +++ b/screenshot_tests/tests/simple_test.py @@ -1,3 +1,5 @@ +import os + from selenium.webdriver.common.by import By from screenshot_tests.utils.screenshots import TestCase @@ -6,15 +8,27 @@ import time class TestExample(TestCase): def test_main_page(self): - self.driver.get("https://s57.ivazh.ru/styles/r14/#12.13/71.2832/72.13405") + self.driver.get("https://s57map.ivazh.ru/") def action(): - time.sleep(5) + time.sleep(2) self.check_by_screenshot(None, full_page=True, action=action) - # def test_search_block(self): - # self.driver.get("https://s57.ivazh.ru/styles/r14/#12.13/71.2832/72.13405") - # self.driver.implicitly_wait(5) - # - # self.check_by_screenshot((By.CSS_SELECTOR, ".ol-mouse-position")) + def test_search_block(self): + self.driver.get("https://s57.ivazh.ru/styles/r14/#12.13/71.2832/72.13405") + + def action(): + time.sleep(2) + + self.check_by_screenshot_file(None, screenshot_path=f'test_search_block.png', + full_page=True, action=action) + + def test_save_screenshot(self): + self.driver.get("https://s57.ivazh.ru/styles/r14/#12.13/71.2832/72.13405") + + def action(): + time.sleep(2) + + self.save_screenshot('test_search_block.png', full_page=True, action=action) + diff --git a/screenshot_tests/tests/test_search_block.png b/screenshot_tests/tests/test_search_block.png new file mode 100644 index 0000000..aa9295e Binary files /dev/null and b/screenshot_tests/tests/test_search_block.png differ diff --git a/screenshot_tests/utils/screenshots.py b/screenshot_tests/utils/screenshots.py index 2995aea..72abd75 100644 --- a/screenshot_tests/utils/screenshots.py +++ b/screenshot_tests/utils/screenshots.py @@ -191,6 +191,50 @@ class TestCase(common.TestCase): return diff, saved_url, prod_url + def _get_screenshot_diff(self, element=None, screenshot_path=None, action=None, full_screen=True, + full_page=False, finalize=None, scroll_and_screen=True): + """Получит скриншот с текущей страницы, поблочно сравнит с эталонным и вернет количество отличающихся блоков. + :param screenshot_path: путь к файлу с изображением. + :param element: tuple с типом локатора и локатором. + :param action: функция, которая подготовит страницу к снятию скриншота. + :param full_screen: resize ли браузер до максимума. + :param full_page: скринить всю страницу, а не только переданный элемент. + :param finalize: финализация после сравнения скриншотов. + :param scroll_and_screen: скролить страницу (сверху к низу) и склеивать участки в один скриншот. + """ + if full_screen: + self._use_full_screen() + + if full_page: + locator_type, query_string = (By.XPATH, "//body") + scroll_and_screen = False + else: + locator_type, query_string = element[0], element[1] + + saved_url = urlparse(self.driver.current_url) + test_url = self.base_url + + self.driver.get(test_url) + test_image, coords_prod = self._get_element_screenshot(locator_type, query_string, action, finalize, scroll_and_screen) + logging.info('Done screen on test stand') + + # Возращаемся на тестовый стенд. Всегда нужно возвращаться на тестовый стенд. На это завязаны тесты и отчеты + self.driver.get(saved_url.geturl()) + + second_image = Image.open(screenshot_path, formats=['PNG']) + + # Для добавления в отчет (https://github.com/allure-framework/allure2/tree/master/plugins/screen-diff-plugin) + # noinspection PyUnboundLocalVariable + allure.attach(self.image_processor.image_to_bytes(test_image), 'actual', allure.attachment_type.PNG) + # noinspection PyUnboundLocalVariable + allure.attach(self.image_processor.image_to_bytes(second_image), 'expected', allure.attachment_type.PNG) + + # noinspection PyUnboundLocalVariable + diff, result = self.image_processor.get_images_diff(test_image, second_image) + allure.attach(result, 'diff', allure.attachment_type.PNG) + + return diff, test_url + def get_diff(self, *args, **kwargs): diff, _, _ = self._get_diff(*args, **kwargs) return diff @@ -198,3 +242,29 @@ class TestCase(common.TestCase): def check_by_screenshot(self, element, *args, **kwargs): diff, saved_url, prod_url = self._get_diff(element, *args, **kwargs) assert diff == 0, f"Элемент отличается на страницах:\n{saved_url.geturl()}\nи\n{prod_url.geturl()}" + + def check_by_screenshot_file(self, element, *args, **kwargs): + diff, test_url = self._get_screenshot_diff(element, *args, **kwargs) + assert diff == 0, f"Элемент отличается на странице:\n{test_url.geturl()}\n" + + def save_screenshot(self, screenshot_path, element=None, action=None, full_screen=True, full_page=False, finalize=None, scroll_and_screen=True): + if full_screen: + self._use_full_screen() + + if full_page: + locator_type, query_string = (By.XPATH, "//body") + scroll_and_screen = False + else: + locator_type, query_string = element[0], element[1] + + saved_url = urlparse(self.driver.current_url) + test_url = self.base_url + + self.driver.get(test_url) + test_image, coords_prod = self._get_element_screenshot(locator_type, query_string, action, finalize, scroll_and_screen) + + self.driver.get(saved_url.geturl()) + + test_image.save(screenshot_path, format='png') + + return coords_prod