test_javascript.py 2.8 KB

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