test_javascript.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from nicegui import Client, ui
  2. from nicegui.testing import Screen
  3. def test_run_javascript_on_button_press(screen: Screen):
  4. ui.button('change title', on_click=lambda: ui.run_javascript('document.title = "A New Title"'))
  5. screen.open('/')
  6. assert screen.selenium.title == 'NiceGUI'
  7. screen.click('change title')
  8. screen.wait(0.5)
  9. screen.should_contain('A New Title')
  10. def test_run_javascript_on_value_change(screen: Screen):
  11. @ui.page('/')
  12. async def page(client: Client):
  13. ui.radio(['A', 'B'], on_change=lambda e: ui.run_javascript(f'document.title = "Page {e.value}"'))
  14. await client.connected()
  15. ui.run_javascript('document.title = "Initial Title"')
  16. screen.open('/')
  17. screen.wait(0.5)
  18. screen.should_contain('Initial Title')
  19. screen.click('A')
  20. screen.wait(0.5)
  21. screen.should_contain('Page A')
  22. screen.click('B')
  23. screen.wait(0.5)
  24. screen.should_contain('Page B')
  25. def test_run_javascript_before_client_connected(screen: Screen):
  26. @ui.page('/')
  27. def page():
  28. ui.label('before js')
  29. ui.run_javascript('document.title = "New Title"')
  30. ui.label('after js')
  31. screen.open('/')
  32. screen.should_contain('before js')
  33. screen.should_contain('after js')
  34. screen.should_contain('New Title')
  35. def test_response_from_javascript(screen: Screen):
  36. async def compute() -> None:
  37. response = await ui.run_javascript('1 + 41')
  38. ui.label(response)
  39. ui.button('compute', on_click=compute)
  40. screen.open('/')
  41. screen.click('compute')
  42. screen.should_contain('42')
  43. def test_async_javascript(screen: Screen):
  44. async def run():
  45. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 100)); return 42')
  46. ui.label(result)
  47. ui.button('run', on_click=run)
  48. screen.open('/')
  49. screen.click('run')
  50. screen.should_contain('42')
  51. def test_simultaneous_async_javascript(screen: Screen):
  52. async def runA():
  53. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 500)); return 1')
  54. ui.label(f'A: {result}')
  55. async def runB():
  56. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 250)); return 2')
  57. ui.label(f'B: {result}')
  58. ui.button('runA', on_click=runA)
  59. ui.button('runB', on_click=runB)
  60. screen.open('/')
  61. screen.click('runA')
  62. screen.click('runB')
  63. screen.should_contain('A: 1')
  64. screen.should_contain('B: 2')