在学习书《Python Web开发 测试驱动方法》一书时
因为数据库无法自动清理
所以第六章提出了使用Django自带LiveServerTestCase,代替Python标准库中的unittest.TestCase
根据书上所述更改代码和相关文件后
因为好奇,运行代码
$ python3 manage.py test Creating test database for alias 'default'... /home/zhuchen233/superlists/superlists/urls.py:21: RemovedInDjango110Warning: Support for string view arguments to url() is deprecated and will be removed in Django 1.10 (got lists.views.home_page). Pass the callable instead. url(r'^$', 'lists.views.home_page', name='home') .......F ====================================================================== FAIL: test_can_start_a_list_and_retrieve_it_later (functional_tests.tests.NewVisitorTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/zhuchen233/superlists/functional_tests/tests.py", line 74, in test_can_start_a_list_and_retrieve_it_later self.fail('Finish the test!') AssertionError: Finish the test! ---------------------------------------------------------------------- Ran 8 tests in 6.366s FAILED (failures=1) Destroying test database for alias 'default'...可以看出,测试前,Django自行建立了一个数据库用于测试
再按照书上所说,运行如下命令,准确启用功能测试
python3 manage.py test functional_tests 但却发生如下错误 Traceback (most recent call last): File "/home/zhuchen233/superlists/functional_tests/tests.py", line 46, in test_can_start_a_list_and_retrieve_it_later self.check_for_row_in_list_table('1: Buy peacock feathers') File "/home/zhuchen233/superlists/functional_tests/tests.py", line 19, in check_for_row_in_list_table rows = table.find_elements_by_tag_name('tr') File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webelement.py", line 237, in find_elements_by_tag_name return self.find_elements(by=By.TAG_NAME, value=name) File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webelement.py", line 528, in find_elements {"using": by, "value": value})['value'] File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webelement.py", line 494, in _execute return self._parent.execute(command, params) File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed. 阅读错误信息发现,是与find_elements_by_tag_name和StaleElementReferenceException有关 搜索了selenium官方文档后发现(其实不用看,错误信息已经报出了)提示页面已经刷新过
根据程序推测,页面实在输入数据并enter后自动刷新的,然而之前并没有这种状况,于是该错误难以解读
于是在
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 check_for_row_in_list_table(self, row_text): table = self.browser.find_element_by_id('id_list_table') print(table.text) time.sleep(5) rows = table.find_elements_by_tag_name('tr') self.assertIn(row_text, [row.text for row in rows]) 并在两次输入数据并enter后同样添加 time.sleep(5)便于观察需要注意的是,请在文件最前添加
import time
修改代码再次运行后
显示
1: Buy peacock feathers 1: Buy peacock feathers 2: Use peacock feathers to make a fly 1: Buy peacock feathers 2: Use peacock feathers to make a fly F ====================================================================== FAIL: test_can_start_a_list_and_retrieve_it_later (functional_tests.tests.NewVisitorTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/zhuchen233/superlists/functional_tests/tests.py", line 83, in test_can_start_a_list_and_retrieve_it_later self.fail('Finish the test!') AssertionError: Finish the test! ---------------------------------------------------------------------- Ran 1 test in 31.603s FAILED (failures=1) Destroying test database for alias 'default'... 功能测试显示成功了这就很搞笑了,因为我只添加了print语句查看信息,以及sleep进行等待,而对功能性语句没有任何改动
于是把多余语句全部删除,再次测试
raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed. 如期失败由上一次测试结果可得,table本身已经获取了文本,可能无需find_elements_by_tag_name
于是把这一句注释掉,并将rows全部改为table
测试接果就不放了,显示table不可读
于是把添加rows = table.text 并把rows全部改回
依然失败
将rows直接换成table.text呢?
还是不可以
为了测试能够运行,暂时添加time.sleep()临时解决问题
此问题已立下flag