javascript - 尝试使用 Axe-Core 进行可访问性测试时出现错误“org.openqa.selenium.JavascriptException: javascript error: eval is disabled”
问题描述
我正在尝试使用使用 Java 作为编程语言的 Axe-Core 工具进行可访问性测试。我能够从我的应用程序中的许多页面获得结果,但是对于其中一个页面,我收到错误
org.openqa.selenium.JavascriptException: javascript error: eval is disabled
(Session info: chrome=81.0.4044.138)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'XXXX', ip: 'XXXX', os.name: 'Windows 10', os.arch: 'amd64',
os.version: '10.0', java.version: '1.8.0_131'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 81.0.4044.138, chrome:
{chromedriverVersion: 81.0.4044.138 (8c6c7ba89cc9..., userDataDir: C:\Users\NASEEM~1.AHM\AppDa...},
goog:chromeOptions: {debuggerAddress: localhost:52030}, javascriptEnabled: true,
networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS,
proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0,
pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:virtualAuthenticators: true}
Session ID: cbdfe9de190b8224da1ec675bef90966
我在代码中收到上述错误
JSONObject responseJSON = new AXE.Builder(driver, scriptUrl).analyze();
在 Chrome 浏览器中运行测试时出现此错误。我在 Firefox 浏览器中执行了相同的代码,并且可以毫无问题地运行它。
在运行测试时我应该添加什么?我应该包括任何所需的功能吗?
请建议。
解决方案
我怀疑您收到此错误,因为您正在测试的网站具有内容安全策略
内容安全策略 (CSP) 允许网站所有者通过确保没有恶意的第三方 JS、CSS 图像等被注入网站来保护其最终用户。允许 CSP 中包含的任何内容,阻止任何未包含的内容。
在 CSP 中,它将阻止eval
您的程序中需要的 JavaScript 函数。
站点所有者必须通过添加作为其 CSP 上的规则之一来明确允许eval
在其站点上(因为如果您的 CSP 中有任何 JS 规则,则默认情况下它会被阻止) 。unsafe-eval
取自我在 CSP 上链接的页面:-
'不安全评估'
允许使用 eval() 和类似的方法从字符串创建代码。您必须包含单引号。
解决此问题的唯一方法是要求网站所有者将其添加到他们的 CSP 中,或者更改注入eval
到他们网站中的任何功能。
如果您希望另一个站点进行测试以确认是 CSP 阻止了您的脚本,您可以尝试我的https://klu.io,因为我的 CSP 非常严格。
对话后更新
看来我的问题是正确的,但不是原因。
这是由网站覆盖window.eval
引发错误(基本上禁用它)引起的。下面的小提琴以最基本的形式演示了这种行为。
window.eval = function(){
throw new Error("window.eval is disabled");
}
eval(1);
如果不重写 Axe-Core 以使其不使用,此时您将无能为力,eval
因为它显然会在某个时候将其注入正在测试的 Window 中。
我唯一的想法(如果其他人偶然发现这个问题)解决这个问题的方法是将有问题的脚本替换为具有覆盖的功能window.eval
的副本,该副本具有克隆的所有其他功能,而不是阻止脚本运行的功能. 但是,如果他们正在禁用window.eval
,那么他们很可能也在使用 CSP,因此您将无法注入脚本。
推荐阅读
- c# - 请帮助我将列表框项目转换为 C# 中的字符串数组列表
- kotlin - 为什么 Kotlin 不能推断此示例中的类型?
- python-3.x - Pandas中2个文件的区别
- java - 仅当输入 xml 没有命名空间时,Java 中的 XSLT 转换才有效
- apache - 安装 2.3.6 问题 apache 后出现内部服务器错误
- ios - 获取与运行 react-native run-ios 相关的构建错误
- php - 在 Prestashop 中:如何根据查看的国家/地区为同一产品提供不同价格的目录?
- batch-file - 如何将 echo 和脚本组合在同一行中?
- android - 如何从范围存储在 android 11 中打开 Pdf
- swift - 为什么这个 ForEach 循环不断导致错误?