conftest.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import importlib
  2. import os
  3. from typing import Dict, Generator
  4. import icecream
  5. import pytest
  6. from selenium import webdriver
  7. from selenium.webdriver.chrome.service import Service
  8. from webdriver_manager.chrome import ChromeDriverManager
  9. from nicegui import Client, globals
  10. from nicegui.page import page
  11. from .screen import Screen
  12. icecream.install()
  13. @pytest.fixture
  14. def chrome_options(chrome_options: webdriver.ChromeOptions) -> webdriver.ChromeOptions:
  15. chrome_options.add_argument('headless')
  16. chrome_options.add_argument('disable-gpu')
  17. chrome_options.add_argument('window-size=600x600')
  18. return chrome_options
  19. @pytest.fixture
  20. def capabilities(capabilities: Dict) -> Dict:
  21. capabilities['goog:loggingPrefs'] = {'browser': 'ALL'}
  22. return capabilities
  23. @pytest.fixture
  24. def selenium(selenium: webdriver.Chrome) -> webdriver.Chrome:
  25. selenium.implicitly_wait(Screen.IMPLICIT_WAIT)
  26. selenium.set_page_load_timeout(4)
  27. return selenium
  28. @pytest.fixture(autouse=True)
  29. def reset_globals() -> Generator[None, None, None]:
  30. for path in {'/'}.union(globals.page_routes.values()):
  31. globals.app.remove_route(path)
  32. globals.app.middleware_stack = None
  33. globals.app.user_middleware.clear()
  34. # NOTE favicon routes must be removed separately because they are not "pages"
  35. [globals.app.routes.remove(r) for r in globals.app.routes if r.path.endswith('/favicon.ico')]
  36. importlib.reload(globals)
  37. globals.app.storage.clear()
  38. globals.index_client = Client(page('/'), shared=True).__enter__()
  39. globals.app.get('/')(globals.index_client.build_response)
  40. @pytest.fixture(scope='session', autouse=True)
  41. def remove_all_screenshots() -> None:
  42. if os.path.exists(Screen.SCREENSHOT_DIR):
  43. for name in os.listdir(Screen.SCREENSHOT_DIR):
  44. os.remove(os.path.join(Screen.SCREENSHOT_DIR, name))
  45. @pytest.fixture(scope="function")
  46. def driver(chrome_options: webdriver.ChromeOptions) -> webdriver.Chrome:
  47. s = Service(ChromeDriverManager().install())
  48. driver = webdriver.Chrome(service=s, options=chrome_options)
  49. driver.implicitly_wait(Screen.IMPLICIT_WAIT)
  50. driver.set_page_load_timeout(4)
  51. yield driver
  52. driver.quit()
  53. @pytest.fixture
  54. def screen(driver: webdriver.Chrome, request: pytest.FixtureRequest, caplog: pytest.LogCaptureFixture) \
  55. -> Generator[Screen, None, None]:
  56. screen = Screen(driver, caplog)
  57. yield screen
  58. if screen.is_open:
  59. screen.shot(request.node.name)
  60. logs = screen.caplog.get_records('call')
  61. assert not logs, f'There were unexpected logs:\n-------\n{logs}\n-------'
  62. screen.stop_server()