首页 > 解决方案 > 尝试使用 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 浏览器中执行了相同的代码,并且可以毫无问题地运行它。

在运行测试时我应该添加什么?我应该包括任何所需的功能吗?

请建议。

标签: javascriptselenium-webdriveraccessibility

解决方案


我怀疑您收到此错误,因为您正在测试的网站具有内容安全策略

内容安全策略 (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,因此您将无法注入脚本。


推荐阅读