util.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import subprocess
  2. import sys
  3. from selenium import webdriver
  4. from pywebio.utils import wait_host_port
  5. import asyncio
  6. default_chrome_options = webdriver.ChromeOptions()
  7. default_chrome_options.add_argument('--no-sandbox')
  8. default_chrome_options.add_argument('--disable-extensions')
  9. default_chrome_options.add_argument('--disable-dev-shm-usage')
  10. default_chrome_options.add_argument('--disable-setuid-sandbox')
  11. USAGE = """
  12. python {name}
  13. 启动PyWebIO服务器
  14. python {name} auto
  15. 使用无头浏览器自动化测试
  16. python {name} debug
  17. 使用带界面的浏览器自动化测试
  18. """
  19. def run_test(server_func, test_func, port=8080, chrome_options=None):
  20. """
  21. :param server_func: 启动PyWebIO服务器的函数
  22. :param test_func: 测试的函数。人工测试时不会被运行 (server_proc, browser)
  23. :param port: 启动的PyWebIO服务器的端口
  24. """
  25. if len(sys.argv) not in (1, 2) or (len(sys.argv) == 2 and sys.argv[-1] not in ('server', 'auto', 'debug')):
  26. print(USAGE.format(name=sys.argv[0]))
  27. return
  28. if len(sys.argv) != 2:
  29. server_func()
  30. sys.exit()
  31. proc = subprocess.Popen(['python3', sys.argv[0]], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  32. # proc = subprocess.Popen(['python3', sys.argv[0]], stdout=sys.stdout, stderr=subprocess.STDOUT)
  33. if chrome_options is None:
  34. chrome_options = default_chrome_options
  35. if sys.argv[-1] == 'auto':
  36. default_chrome_options.add_argument('--headless')
  37. if sys.argv[-1] in ('auto', 'debug'):
  38. browser = webdriver.Chrome(chrome_options=chrome_options)
  39. asyncio.run(wait_host_port('localhost', port))
  40. browser.get('http://localhost:%s' % port)
  41. browser.implicitly_wait(10)
  42. try:
  43. test_func(proc, browser)
  44. finally:
  45. browser.quit()
  46. proc.terminate()
  47. print("Closed browser and PyWebIO server")