conftest.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import datetime
  2. import importlib
  3. import os
  4. from typing import Callable, Generator
  5. import icecream
  6. import pytest
  7. if True: # NOTE: prevent formatter from sorting the imports (nicegui must come before justpy)
  8. from nicegui import ui, globals
  9. from justpy.htmlcomponents import JustpyBaseComponent, WebPage
  10. from selenium import webdriver
  11. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  12. from .screen import Screen
  13. icecream.install()
  14. @pytest.fixture
  15. def chrome_options(chrome_options: webdriver.ChromeOptions) -> webdriver.ChromeOptions:
  16. chrome_options.add_argument('headless')
  17. chrome_options.add_argument('disable-gpu')
  18. chrome_options.add_argument('window-size=600x600')
  19. #chrome_options.add_experimental_option('w3c', False)
  20. return chrome_options
  21. @pytest.fixture
  22. def capabilities(capabilities):
  23. capabilities['goog:loggingPrefs'] = {'browser': 'ALL'}
  24. return capabilities
  25. @pytest.fixture
  26. def selenium(selenium: webdriver.Chrome) -> webdriver.Chrome:
  27. selenium.implicitly_wait(0.1)
  28. selenium.set_page_load_timeout(1)
  29. return selenium
  30. @pytest.fixture(autouse=True)
  31. def reset_globals() -> Generator[None, None, None]:
  32. WebPage.sockets.clear()
  33. WebPage.instances.clear()
  34. WebPage.next_page_id = 0
  35. JustpyBaseComponent.instances.clear()
  36. JustpyBaseComponent.next_id = 0
  37. importlib.reload(globals)
  38. @pytest.fixture()
  39. def screen(selenium: webdriver.Chrome) -> Generator[Screen, None, None]:
  40. screen = Screen(selenium)
  41. yield screen
  42. screen.stop_server()
  43. @pytest.fixture
  44. def screenshot(selenium: webdriver.Chrome) -> Callable[[str], None]:
  45. # original taken from https://github.com/theserverlessway/pytest-chrome/blob/master/tests/conftest.py
  46. def shot(name: str = '') -> None:
  47. directory = 'screenshots'
  48. if not os.path.exists(directory):
  49. os.makedirs(directory)
  50. identifier = datetime.datetime.now().isoformat()
  51. if name:
  52. identifier = f'{identifier}-{name}'
  53. filename = f'{directory}/{identifier}.png'
  54. print(f'Storing Screenshot to {filename}')
  55. selenium.get_screenshot_as_file(filename)
  56. return shot