Selenium/Django给出外键错误

Selenium/Django给出外键错误,django,firefox,selenium,functional-testing,selenium-chromedriver,Django,Firefox,Selenium,Functional Testing,Selenium Chromedriver,我正在尝试使用Selenium为Django项目运行功能测试。在Firefox和Chrome上,当我尝试测试超级用户是否可以将普通用户的状态更改为staff时,我发现一个奇怪的外键错误(我假设这都是通过Django的内部测试验证的,但我认为最好将其包括在我的应用程序测试中,因为我的用户场景取决于功能)。看起来Django不喜欢Selenium将任何东西保存到数据库中?这一个错误也会影响到我的其他测试,所以似乎有什么事情在幕后发生了——比如Selenium失去了它的数据库连接。有人知道为什么会这样

我正在尝试使用Selenium为Django项目运行功能测试。在Firefox和Chrome上,当我尝试测试超级用户是否可以将普通用户的状态更改为staff时,我发现一个奇怪的外键错误(我假设这都是通过Django的内部测试验证的,但我认为最好将其包括在我的应用程序测试中,因为我的用户场景取决于功能)。看起来Django不喜欢Selenium将任何东西保存到数据库中?这一个错误也会影响到我的其他测试,所以似乎有什么事情在幕后发生了——比如Selenium失去了它的数据库连接。有人知道为什么会这样吗??我愿意放弃这个测试,转而假设这个功能可以正常工作,但我希望修复这个问题并使用这个测试

一个可能的症状是,在Chrome中,在“checkedthebox”和“clickedthesavebutton”的输出之间,我得到了一个破裂的管道(在Firefox中不会发生)

每当Selenium单击“保存”按钮时,它似乎在这里中断:

# Form looks properly rendered, now click the 'Staff status'
# checkbox and submit it
isStaffCheckbox = self.browser.find_element_by_id('id_is_staff')
isStaffCheckbox.click()               
print 'checked the box'
# Save the form
saveBtn = self.browser.find_element_by_css_selector('input[value="Save"]')
saveBtn.click()
print 'clicked the save button'
我收到的错误消息是:

Traceback (most recent call last):
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/test/testcases.py", line 268, in __call__
    self._post_teardown()
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/test/testcases.py", line 533, in _post_teardown
    self._fixture_teardown()
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/test/testcases.py", line 553, in _fixture_teardown
    skip_validation=True, reset_sequences=False)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/__init__.py", line 161, in call_command
    return klass.execute(*args, **defaults)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/base.py", line 255, in execute
    output = self.handle(*args, **options)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/base.py", line 385, in handle
    return self.handle_noargs(**options)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/commands/flush.py", line 82, in handle_noargs
    emit_post_sync_signal(set(all_models), verbosity, interactive, db)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/sql.py", line 195, in emit_post_sync_signal
    interactive=interactive, db=db)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 170, in send
    response = receiver(signal=self, sender=sender, **named)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 96, in create_permissions
    auth_app.Permission.objects.using(db).bulk_create(perms)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/models/query.py", line 444, in bulk_create
    self._batched_insert(objs_without_pk, fields, batch_size)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/models/query.py", line 902, in _batched_insert
    using=self.db)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/models/manager.py", line 215, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/models/query.py", line 1661, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 937, in execute_sql
    cursor.execute(sql, params)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 122, in execute
    six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 120, in execute
    return self.cursor.execute(query, args)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/cursors.py", line 202, in execute
    self.errorhandler(self, exc, value)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`test_videos2002`.`auth_permission`, CONSTRAINT `content_type_id_refs_id_d043b34a` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`))')
===== 用代码更新

  • 还要注意的是,test_admin_可以使_成为用户_staff会导致我的其他测试出现相同的错误——但是当我从该测试中取出“save”命令时,它们是可以的
  • 我想有两件事我真的不明白:1)为什么内置Django admin视图会出现这种情况(认为它应该可以正常工作),2)为什么一个测试错误会级联到我的其他测试?我以为他们是独立的
谢谢你看这个

从我的functional_tests.test.py(借用自):

来自我的admin_django.py(测试用例集)


正如我在评论中提到的,这似乎是Django中的一个有文档记录的bug。这是官方的错误报告。如第二个链接中所述,一种解决方法是在
已安装的应用程序中交换
django.contrib.auth
django.contrib.contenttypes
的顺序,例如:

这本来是什么:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'testapp'
)
应成为:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'testapp'
)

我猜这是因为它试图拯救一个不存在的FK。您可能想用fixture填充测试数据库。对不起,您能更具体一点吗?我现在正在对它进行更多的研究,但它似乎应该与我在setUp()中预填充数据库一样。我本以为FKs是存在的,因为用户已经存在了-谢谢代码被更新了…不确定一个测试是如何导致级联错误的,因为我认为它们是独立的,并且仍然因为无法保存而感到困惑…错误是关于auth_权限的。在您的回溯中,它还试图创建权限。不知道为什么。啊,谢谢@dan klasson!您对auth_权限的评论显示了这一点。似乎这是一个记录在案的问题…有一些建议的解决办法,我将不得不尝试…为我工作,谢谢!顺便说一句,我在django 1.6.1中遇到了问题。django 1.10中仍然存在这个问题。此修复仍然有效。Django 1.11.1中仍然存在此问题。这个修正仍然有效。谢谢(Django 1.11.2),我不得不这么做,同时删除所有的内容类型来修复我的SetupDjango 1.11.5。Contenttypes必须在进行身份验证之前。
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'testapp'
)
INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'testapp'
)