From 8cdc3ec3192f3a462ffce7a20f9d50b621c3a12c Mon Sep 17 00:00:00 2001 From: JasonHomeWorkstationUbuntu Date: Mon, 9 Nov 2020 16:58:36 +1100 Subject: [PATCH] 6.3 On Implicit and Explicit Waits, and Voodoo time.sleeps --- src/functional_tests/tests.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/functional_tests/tests.py b/src/functional_tests/tests.py index bf5bfe3..ec49aaf 100644 --- a/src/functional_tests/tests.py +++ b/src/functional_tests/tests.py @@ -2,9 +2,12 @@ from django.test import LiveServerTestCase from selenium import webdriver from selenium.webdriver.common.keys import Keys +from selenium.common.exceptions import WebDriverException import time import unittest +MAX_WAIT = 10 + class NewVisitorTest(LiveServerTestCase): def setUp(self): @@ -13,10 +16,18 @@ class NewVisitorTest(LiveServerTestCase): def tearDown(self): self.browser.quit() - def check_for_row_in_list_table(self, row_text): - table = self.browser.find_element_by_id('id_list_table') - rows = table.find_elements_by_tag_name('tr') - self.assertIn(row_text, [row.text for row in rows]) + def wait_for_row_in_list_table(self, row_text): + start_time = time.time() + while True: + try: + table = self.browser.find_element_by_id('id_list_table') + rows = table.find_elements_by_tag_name('tr') + self.assertIn('foo', [row.text for row in rows]) + return + except (AssertionError, WebDriverException) as e: + if time.time() - start_time > MAX_WAIT: + raise e + time.sleep(0.5) def test_can_start_a_list_and_retrieve_it_later(self): # Edith has heard about a cool new online to-do app. She goes @@ -42,19 +53,17 @@ class NewVisitorTest(LiveServerTestCase): # When she hits enter, the page updates, and now the page lists # "1: Buy peacock feathers" as an item in a to-do list inputbox.send_keys(Keys.ENTER) - time.sleep(1) - self.check_for_row_in_list_table('1: Buy peacock feathers') + self.wait_for_row_in_list_table('1: Buy peacock feathers') # There is still a text box inviting her to add another item. She # enters "Use peacock feathers to make a fly" (Edith is very methodical) inputbox = self.browser.find_element_by_id('id_new_item') inputbox.send_keys('Use peacock feathers to make a fly') inputbox.send_keys(Keys.ENTER) - time.sleep(1) # The page updates again, and now shows both items on her list - self.check_for_row_in_list_table('1: Buy peacock feathers') - self.check_for_row_in_list_table('2: Use peacock feathers to make a fly') + self.wait_for_row_in_list_table('1: Buy peacock feathers') + self.wait_for_row_in_list_table('2: Use peacock feathers to make a fly') # Edith wonders whether the site will remember her list. Then she sees # that the site has generated a unique URL for her -- there is some