更糟糕的是,我的测试使用Chrome 77和Chromedriver 77通过(测试通过,数据加载到网页中等(。 只有当我手动拉起Chrome 77浏览器并对其进行测试时,它才会失败。
这基本上是我的代码正在做的事情:
// Get the query parameter "operation" from the URL
let match = new RegExp("[?&]operation=([^&]*)").exec(window.location.search);
let param = match && decodeURIComponent(match[1].replace(/+/g, " "));
// Sanitize the URL from XSS Injection
let param = param ? window.DOMPurify.sanitize(param) : param;
if(param === "View") {
// Load data from the server
}
问题是在 Chrome 77 中param === "View"
是错误的! 但是,单独使用Chrome 77时,这并不是错误的。
我想通了! 问题是Chrome 77默认打开TrustedType API。 但是,如果Chrome 77通过Chromedriver启动,它就会关闭,这是一个非常令人讨厌的错误。
让Chrome 77/Chromedriver 77像手动点击页面时一样失败的解决方法是启用此chrome功能:
--enable-blink-features=TrustedDOMTypes
你会把它放在你看到--no-sandbox
或--disable-infobars
的同一个地方。
伟大! 现在,您的测试按预期失败。接下来,要修复错误,请更改以下行:
// Sanitize the URL from XSS Injection
let param = param ? window.DOMPurify.sanitize(param) : param;
对此:
// Sanitize the URL from XSS Injection
let param = param ? (window.DOMPurify.sanitize(param) || "").toString() : param;
toString()
是最重要的部分。现在返回的是 TrustedType 对象,而不是 String。