test_javascript.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from nicegui import 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():
  13. ui.radio(['A', 'B'], on_change=lambda e: ui.run_javascript(f'document.title = "Page {e.value}"'))
  14. await ui.context.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.wait(0.5)
  35. screen.should_contain('New Title')
  36. def test_response_from_javascript(screen: Screen):
  37. @ui.page('/')
  38. def page():
  39. async def compute() -> None:
  40. response = await ui.run_javascript('1 + 41')
  41. ui.label(response)
  42. ui.button('compute', on_click=compute)
  43. screen.open('/')
  44. screen.click('compute')
  45. screen.should_contain('42')
  46. def test_async_javascript(screen: Screen):
  47. @ui.page('/')
  48. def page():
  49. async def run():
  50. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 100)); return 42')
  51. ui.label(result)
  52. ui.button('run', on_click=run)
  53. screen.open('/')
  54. screen.click('run')
  55. screen.should_contain('42')
  56. def test_simultaneous_async_javascript(screen: Screen):
  57. @ui.page('/')
  58. def page():
  59. async def runA():
  60. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 500)); return 1')
  61. ui.label(f'A: {result}')
  62. async def runB():
  63. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 250)); return 2')
  64. ui.label(f'B: {result}')
  65. ui.button('runA', on_click=runA)
  66. ui.button('runB', on_click=runB)
  67. screen.open('/')
  68. screen.click('runA')
  69. screen.click('runB')
  70. screen.should_contain('A: 1')
  71. screen.should_contain('B: 2')
  72. def test_raise_on_auto_index_page(screen: Screen):
  73. async def await_answer():
  74. await ui.run_javascript('return 42')
  75. ui.button('Ask', on_click=await_answer)
  76. screen.open('/')
  77. screen.click('Ask')
  78. screen.assert_py_logger('ERROR', 'Cannot await JavaScript responses on the auto-index page. '
  79. 'There could be multiple clients connected and it is not clear which one to wait for.')