我有一个html标签,
<div style="background-image: url("resources/images/test.jpg");"/>
我想使用CSS选择器定位这个元素。我尝试下面的选择器,但它抛出错误,
document.querySelector('*[style*="background-image: url("resources/images/test.jpg")"]')
Error: DOM Exception: SYNTAX_ERR (12)
我不得不转义"resources/images/test.jpg"周围的双引号。请让我知道,如果有任何方法,我可以转义它和目标标签。
问题不仅在于您的选择器字符串,还在于您的标记。url()
值中的引号干扰了style
属性值,导致无效的HTML。(/>
位也是无效的,但这并不真正相关。)
由于您处理的是url()
值,您可以简单地去掉引号:
<div style="background-image: url(resources/images/test.jpg);">
然后相应地修改选择器:
document.querySelector('*[style*="background-image: url(resources/images/test.jpg)"]');
另一方面,我强烈建议尝试以其他方式识别元素,例如通过使用类或基于标记的结构构造选择器,而不是针对style
属性,这是脆弱的。如果您仍然需要测试这个样式,您应该在选择元素后使用window.getComputedStyle()
查询元素的计算样式,因为很可能会使用内联样式。
如果您不能编辑标记,并且您在问题中给出的正是它的外观,那么不幸的是,您有无效的标记,并且即使使用有效的选择器,您也不可能匹配此元素。
如果你绝对必须在url()
值中使用双引号,你有几个选择:
html -编码内引号:
<div style="background-image: url("resources/images/test.jpg");">
或者将外部双引号换成单引号,这样你就不必对任何东西进行html编码了:
<div style='background-image: url("resources/images/test.jpg");'>
在属性选择器中使用双引号:
你需要转义它们两次:一次用于选择器,另一次,这样它就不会破坏JavaScript字符串:
document.querySelector('*[style*="background-image: url(\"resources/images/test.jpg\")"]');
或者,您可以像上面那样交换引号,尽管您仍然需要转义一次内部双引号,以便它们不会破坏字符串:
document.querySelector("*[style*='background-image: url("resources/images/test.jpg")']");
您还可以在url()
值中使用单引号,在这种情况下,您需要遵循上述步骤,根据需要交换引号(除非不需要对任何html编码)。但正如你所看到的,这是非常复杂的;如果你可以编辑标记,我真的会完全去掉引号,避免所有这些。
试着这样做:
<div style="background-image: url(resources/images/test.jpg);"></div>
你不需要在图片的文件路径周围加上引号
你不需要使用引号,但是如果你需要,你总是可以使用单引号
在HTML中显示的div标签不在我的控制之下,所以我不能删除url中的引号。无论如何,基于@Pedro评论下面的选择器为我工作,
document.querySelector("*[style*='background-image: url("resources/images/test.jpg")']")
我在Selenium中编写脚本,因此我有必要根据其源来定位图像div。