test_javascript.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. async def compute() -> None:
  38. response = await ui.run_javascript('1 + 41')
  39. ui.label(response)
  40. ui.button('compute', on_click=compute)
  41. screen.open('/')
  42. screen.click('compute')
  43. screen.should_contain('42')
  44. def test_async_javascript(screen: Screen):
  45. async def run():
  46. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 100)); return 42')
  47. ui.label(result)
  48. ui.button('run', on_click=run)
  49. screen.open('/')
  50. screen.click('run')
  51. screen.should_contain('42')
  52. def test_simultaneous_async_javascript(screen: Screen):
  53. async def runA():
  54. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 500)); return 1')
  55. ui.label(f'A: {result}')
  56. async def runB():
  57. result = await ui.run_javascript('await new Promise(r => setTimeout(r, 250)); return 2')
  58. ui.label(f'B: {result}')
  59. ui.button('runA', on_click=runA)
  60. ui.button('runB', on_click=runB)
  61. screen.open('/')
  62. screen.click('runA')
  63. screen.click('runB')
  64. screen.should_contain('A: 1')
  65. screen.should_contain('B: 2')