test_javascript.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. assert screen.selenium.title == 'A New Title'
  13. assert screen.selenium.title != 'NiceGUI'
  14. def test_run_javascript_on_value_change(screen: Screen):
  15. @ui.page('/')
  16. async def main_page(client: Client):
  17. async def set_title(e: ValueChangeEventArguments) -> None:
  18. await ui.run_javascript(f'document.title = "{e.value}"')
  19. ui.radio(['Page Title A', 'Page Title B'], on_change=set_title)
  20. await client.connected()
  21. await ui.run_javascript('document.title = "Initial Page Title"')
  22. screen.open('/')
  23. screen.wait(0.3)
  24. assert screen.selenium.title == 'Initial Page Title'
  25. screen.click('Title B')
  26. screen.wait(0.3)
  27. assert screen.selenium.title == 'Page Title B'
  28. screen.click('Title A')
  29. screen.wait(0.3)
  30. assert screen.selenium.title == 'Page Title A'
  31. def test_run_javascript_before_client_connected(screen: Screen):
  32. @ui.page('/')
  33. async def page():
  34. ui.label('before js')
  35. with pytest.raises(RuntimeError):
  36. await ui.run_javascript('document.title = "A New Title"')
  37. ui.label('after js')
  38. screen.open('/')
  39. assert screen.selenium.title == 'NiceGUI'
  40. screen.should_contain('before js')
  41. screen.should_contain('after js')
  42. def test_response_from_javascript(screen: Screen):
  43. async def compute() -> None:
  44. response = await ui.run_javascript('1 + 41')
  45. ui.label(response)
  46. ui.button('compute', on_click=compute)
  47. screen.open('/')
  48. screen.click('compute')
  49. screen.should_contain('42')
  50. def test_async_javascript(screen: Screen):
  51. async def run():
  52. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 100)); return 42')
  53. ui.label(result)
  54. ui.button('run', on_click=run)
  55. screen.open('/')
  56. screen.click('run')
  57. screen.should_contain('42')
  58. def test_simultaneous_async_javascript(screen: Screen):
  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')