在学习书《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.
提示页面已经刷新过
根据程序推测,页面实在输入数据并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])
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