我正在研究的项目使用了一个RGBField,它将这个脚本插入到模板中(因为我无法找到它所在的位置,所以在某个地方的django深处):
<script type="text/javascript">
(function($){
$(document).ready(function(){
$('#id_color').each(function(i, elm){
// Make sure html5 color element is not replaced
if (elm.type != 'color') $(elm).colorPicker({"colors": ["f1c40f", "2ecc71", "9b59b6", "e74c3c", "34495e", "3498db", "1abc9c", "f39c12", "d35400"]});
});
});
})('django' in window && django.jQuery ? django.jQuery: jQuery);
</script>
在控制台中我收到一个错误:Uncaught ReferenceError: jQuery is not defined
我无法检查错误发生的位置,但删除RGBField可以防止出现问题。
在项目中使用Jquery,如果我在模板中使用jQuery,它工作正常(因此模板本身不是问题)。
我已经将django-jquery添加到项目中,并在模板的开头包含了{% load staticfiles %}
。不解决问题。
我一直在忽略整件事,但现在我需要用这个页面编写一个cypress测试,错误阻止了测试。
柏树有办法忽略这个错误吗?或者有没有办法防止错误发生在一开始? RGBField是否有一个标志可以关闭jquery的检查?
运行'django' in window
会产生false
,并且运行django.jQuery
会产生错误。运行'django' in window && django.jQuery
产生false
所以理论上这应该采取第二个选项,当我在控制台中运行时很好(但显然我遗漏了一些东西)。
编辑:
已安装的应用列表:
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.humanize',
'whitenoise.runserver_nostatic',
'storages',
'django.contrib.staticfiles',
'django.contrib.flatpages',
'jquery',
'django.contrib.sites',
'django_activeurl',
'webpack_loader',
'widget_tweaks',
'argonauts',
'rest_framework',
'main',
该错误很可能与这行代码有关:
'django' in window && django.jQuery ? django.jQuery: jQuery
理解和考虑ternary conditional可能会有所帮助。
开箱即用,Django Admin在全局窗口上设置了一个'django'变量,并将jQuery引入它。这是因为管理员使用了jQuery。在管理员之外,在自定义模板中,由开发人员决定如何在需要时包含jQuery。
所以语句'django' in window && django.jQuery
将在Django Admin页面和三元组的“真实”方面评估true
,该片段继续并引用它。或者在三元组的假方面,假设jQuery已经出现在全球范围内。然后将对jQuery的引用作为参数传递给IIFE。
我会仔细查看您的页面源,以确定是否/在哪里引用jQuery模块,并确保在该片段之前正确加载它。
默认情况下,当抛出未捕获的异常时,赛普拉斯会失败测试。这种行为对许多用户都很有用,并且经常会向开发人员发出他们不知道的错误。
话虽这么说,有时会抛出未捕获的异常并且您想忽略它并继续进行测试(特别是如果它是从第三方插件中抛出的)。你可以通过using Cypress events来做到这一点。
要关闭所有未捕获的异常处理:
Cypress.on('uncaught:exception', (err, runnable) => {
// returning false here prevents Cypress from failing the test
return false
})
您可能希望在支持文件(cypress/support/index.js
)中执行此操作,以便将其应用于所有规范文件。