test_auto_context.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. ui.label('ready')
  25. with ui.card() as cardA:
  26. ui.timer(1.0, add_a, once=True)
  27. with ui.card() as cardB:
  28. ui.timer(1.1, add_b, once=True)
  29. screen.open('/')
  30. screen.wait_for('ready')
  31. screen.should_contain('A')
  32. screen.should_contain('B')
  33. cA = screen.selenium.find_element(By.ID, cardA.id)
  34. cA.find_element(By.XPATH, './/*[contains(text(), "A")]')
  35. cB = screen.selenium.find_element(By.ID, cardB.id)
  36. cB.find_element(By.XPATH, './/*[contains(text(), "B")]')
  37. def test_autoupdate_after_connected(screen: Screen):
  38. @ui.page('/')
  39. async def page(client: Client):
  40. ui.label('before connected')
  41. await client.connected()
  42. ui.label('after connected')
  43. await asyncio.sleep(1)
  44. ui.label('one')
  45. await asyncio.sleep(1)
  46. ui.label('two')
  47. await asyncio.sleep(1)
  48. ui.label('three')
  49. screen.open('/')
  50. screen.should_contain('before connected')
  51. screen.should_contain('after connected')
  52. screen.should_not_contain('one')
  53. screen.wait_for('one')
  54. screen.should_not_contain('two')
  55. screen.wait_for('two')
  56. screen.should_not_contain('three')
  57. screen.wait_for('three')
  58. def test_autoupdate_on_async_event_handler(screen: Screen):
  59. async def open():
  60. with ui.dialog() as dialog, ui.card():
  61. l = ui.label('This should be visible')
  62. dialog.open()
  63. await asyncio.sleep(1)
  64. l.text = 'New text after 1 second'
  65. ui.button('Dialog', on_click=open)
  66. screen.open('/')
  67. screen.click('Dialog')
  68. screen.should_contain('This should be visible')
  69. screen.should_not_contain('New text after 1 second')
  70. screen.should_contain('New text after 1 second')
  71. def test_autoupdate_on_async_timer_callback(screen: Screen):
  72. async def update():
  73. ui.label('1')
  74. await asyncio.sleep(2.0)
  75. ui.label('2')
  76. ui.label('0')
  77. ui.timer(2.0, update, once=True)
  78. screen.open('/')
  79. screen.should_contain('0')
  80. screen.should_not_contain('1')
  81. screen.wait_for('1')
  82. screen.should_not_contain('2')
  83. screen.wait_for('2')
  84. def test_adding_elements_from_different_tasks(screen: Screen):
  85. card1 = ui.card()
  86. card2 = ui.card()
  87. async def add_label1() -> None:
  88. with card1:
  89. await asyncio.sleep(0.5)
  90. ui.label('1')
  91. async def add_label2() -> None:
  92. with card2:
  93. ui.label('2')
  94. await asyncio.sleep(0.5)
  95. screen.open('/')
  96. background_tasks.create(add_label1())
  97. background_tasks.create(add_label2())
  98. screen.should_contain('1')
  99. screen.should_contain('2')
  100. c1 = screen.selenium.find_element(By.ID, card1.id)
  101. c1.find_element(By.XPATH, './/*[contains(text(), "1")]')
  102. c2 = screen.selenium.find_element(By.ID, card2.id)
  103. c2.find_element(By.XPATH, './/*[contains(text(), "2")]')