【学习日志】Python Web开发xTDD方法/unittest.TestCase转移LiveServerTestCase发生错误

在学习书《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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值