user.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import threading
  2. from asyncio import start_server
  3. from time import sleep
  4. from nicegui import globals as nicegui_globals
  5. from nicegui import ui
  6. from selenium import webdriver
  7. from selenium.webdriver.common.by import By
  8. from selenium.webdriver.remote.webelement import WebElement
  9. class User():
  10. def __init__(self, selenium: webdriver.Chrome):
  11. self.selenium = selenium
  12. self.thread = None
  13. def start_server(self) -> None:
  14. '''Start the webserver in a separate thread. This is the equivalent of `ui.run()` in a normal script.'''
  15. self.thread = threading.Thread(target=ui.run, kwargs={'port': 3392, 'show': False, 'reload': False})
  16. self.thread.start()
  17. sleep(1)
  18. def stop_server(self) -> None:
  19. '''Stop the webserver.'''
  20. nicegui_globals.server.should_exit = True
  21. self.thread.join()
  22. def open(self, path: str = '/') -> None:
  23. if self.thread is None:
  24. self.start_server()
  25. self.selenium.get('http://localhost:3392' + path)
  26. def should_see(self, text: str) -> None:
  27. if text == self.selenium.title:
  28. return
  29. assert self.find(text).text == text
  30. def click(self, target_text: str) -> None:
  31. self.find(target_text).click()
  32. def find(self, text: str) -> WebElement:
  33. return self.selenium.find_element(By.XPATH, f'//*[contains(text(),"{text}")]')