util.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import asyncio
  2. import signal
  3. import subprocess
  4. import sys
  5. from selenium import webdriver
  6. from pywebio.utils import wait_host_port
  7. default_chrome_options = webdriver.ChromeOptions()
  8. default_chrome_options.add_argument('--no-sandbox')
  9. default_chrome_options.add_argument('--disable-extensions')
  10. default_chrome_options.add_argument('--disable-dev-shm-usage')
  11. default_chrome_options.add_argument('--disable-setuid-sandbox')
  12. USAGE = """
  13. python {name}
  14. 启动PyWebIO服务器
  15. python {name} auto
  16. 使用无头浏览器进行自动化测试,并使用coverage检测代码覆盖率
  17. python {name} debug
  18. 使用带界面的浏览器自动化测试
  19. """
  20. def run_test(server_func, test_func, port=8080, chrome_options=None):
  21. """
  22. :param server_func: 启动PyWebIO服务器的函数
  23. :param test_func: 测试的函数。人工测试时不会被运行 (server_proc, browser)
  24. :param port: 启动的PyWebIO服务器的端口
  25. """
  26. if len(sys.argv) not in (1, 2) or (len(sys.argv) == 2 and sys.argv[-1] not in ('server', 'auto', 'debug')):
  27. print(USAGE.format(name=sys.argv[0]))
  28. return
  29. if len(sys.argv) != 2:
  30. try:
  31. server_func()
  32. except KeyboardInterrupt:
  33. pass
  34. sys.exit()
  35. if chrome_options is None:
  36. chrome_options = default_chrome_options
  37. if sys.argv[-1] == 'auto':
  38. default_chrome_options.add_argument('--headless')
  39. proc = subprocess.Popen(['coverage', 'run', '--source', 'pywebio',
  40. sys.argv[0]], stdout=sys.stdout, stderr=subprocess.STDOUT, text=True)
  41. elif sys.argv[-1] == 'debug':
  42. proc = subprocess.Popen(['python3', sys.argv[0]], stdout=sys.stdout, stderr=subprocess.STDOUT, text=True)
  43. browser = None
  44. try:
  45. browser = webdriver.Chrome(chrome_options=chrome_options)
  46. browser.set_window_size(1000, 900)
  47. asyncio.run(wait_host_port('localhost', port))
  48. browser.get('http://localhost:%s?_pywebio_debug=1' % port)
  49. browser.implicitly_wait(10)
  50. test_func(proc, browser)
  51. finally:
  52. if browser:
  53. if sys.argv[-1] == 'debug':
  54. input('press ENTER to exit')
  55. browser.quit()
  56. # 不要使用 proc.terminate() ,因为coverage会无法保存分析数据
  57. proc.send_signal(signal.SIGINT)
  58. print("Closed browser and PyWebIO server")