test_auto_context.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import asyncio
  2. from selenium.webdriver.common.by import By
  3. from nicegui import Client, background_tasks, ui
  4. from .screen import Screen
  5. def test_adding_element_to_shared_index_page(screen: Screen):
  6. ui.button('add label', on_click=lambda: ui.label('added'))
  7. screen.open('/')
  8. screen.click('add label')
  9. screen.should_contain('added')
  10. def test_adding_element_to_private_page(screen: Screen):
  11. @ui.page('/')
  12. def page():
  13. ui.button('add label', on_click=lambda: ui.label('added'))
  14. screen.open('/')
  15. screen.click('add label')
  16. screen.should_contain('added')
  17. def test_adding_elements_with_async_await(screen: Screen):
  18. async def add_a():
  19. await asyncio.sleep(0.1)
  20. ui.label('A')
  21. async def add_b():
  22. await asyncio.sleep(0.1)
  23. ui.label('B')
  24. with ui.card() as cardA:
  25. ui.timer(1.0, add_a, once=True)
  26. with ui.card() as cardB:
  27. ui.timer(1.1, add_b, once=True)
  28. screen.open('/')
  29. screen.wait_for('A')
  30. screen.wait_for('B')
  31. cA = screen.selenium.find_element(By.ID, cardA.id)
  32. cA.find_element(By.XPATH, f'.//*[contains(text(), "A")]')
  33. cB = screen.selenium.find_element(By.ID, cardB.id)
  34. cB.find_element(By.XPATH, f'.//*[contains(text(), "B")]')
  35. def test_autoupdate_after_connected(screen: Screen):
  36. @ui.page('/')
  37. async def page(client: Client):
  38. ui.label('before connected')
  39. await client.connected()
  40. ui.label('after connected')
  41. await asyncio.sleep(1)
  42. ui.label('one')
  43. await asyncio.sleep(1)
  44. ui.label('two')
  45. await asyncio.sleep(1)
  46. ui.label('three')
  47. screen.open('/')
  48. screen.should_contain('before connected')
  49. screen.should_contain('after connected')
  50. screen.should_not_contain('one')
  51. screen.wait_for('one')
  52. screen.should_not_contain('two')
  53. screen.wait_for('two')
  54. screen.should_not_contain('three')
  55. screen.wait_for('three')
  56. def test_autoupdate_on_async_event_handler(screen: Screen):
  57. async def open():
  58. with ui.dialog() as dialog, ui.card():
  59. l = ui.label('This should be visible')
  60. dialog.open()
  61. await asyncio.sleep(1)
  62. l.text = 'New text after 1 second'
  63. ui.button('Dialog', on_click=open)
  64. screen.open('/')
  65. screen.click('Dialog')
  66. screen.should_contain('This should be visible')
  67. screen.should_not_contain('New text after 1 second')
  68. screen.wait_for('New text after 1 second')
  69. def test_autoupdate_on_async_timer_callback(screen: Screen):
  70. async def update():
  71. ui.label('1')
  72. await asyncio.sleep(2.0)
  73. ui.label('2')
  74. ui.label('0')
  75. ui.timer(2.0, update, once=True)
  76. screen.open('/')
  77. screen.should_contain('0')
  78. screen.should_not_contain('1')
  79. screen.wait_for('1', timeout=3.0)
  80. screen.should_not_contain('2')
  81. screen.wait_for('2', timeout=3.0)
  82. def test_adding_elements_from_different_tasks(screen: Screen):
  83. card1 = ui.card()
  84. card2 = ui.card()
  85. async def add_label1() -> None:
  86. with card1:
  87. await asyncio.sleep(1.0)
  88. ui.label('1')
  89. async def add_label2() -> None:
  90. with card2:
  91. ui.label('2')
  92. await asyncio.sleep(1.0)
  93. screen.open('/')
  94. background_tasks.create(add_label1())
  95. background_tasks.create(add_label2())
  96. screen.wait_for('1')
  97. screen.wait_for('2')
  98. c1 = screen.selenium.find_element(By.ID, card1.id)
  99. c1.find_element(By.XPATH, f'.//*[contains(text(), "1")]')
  100. c2 = screen.selenium.find_element(By.ID, card2.id)
  101. c2.find_element(By.XPATH, f'.//*[contains(text(), "2")]')