您不能选择这些元素,因为它们位于阴影DOM中。
你可以试试穿影后代组合器
/deep/
尽管它的命运是不确定的,因为它是v0的一部分,而不是v1影子dom。(例如,您只能从
querySelector
但是,Chrome暂时支持它。
> document.querySelectorAll('* /deep/ button#showPasswordButton[title="Show password"]')
NodeList(41)
(过滤掉那些标题是
Hide password
)
通过devtools API,我们还可以访问chrome的
queryObjects
函数,它将在内存中查找特定类型的所有实例。
> queryObjects(HTMLButtonElement)
undefined
Array(122)
评估
查询对象
有点奇怪,
undefined
中间是一条线索),所以我们必须
右键单击“存储为全局变量”
将它绑定到一个名称(两个
temp1
和
$_
,方便)。
temp1
> $_.filter(b => b.id=='showPasswordButton' && b.title=='Show password')
(41)
您可能会注意到按钮的数量比列表的实际大小要小得多,因为当您滚动时,聚合物会快速呈现它们。当单击此按钮以发现基础数据模型时,可以暂停计算,您可以在调试器或源代码中四处查看以发现它正在执行的操作,但我将在这里留下一些表达式来使用:
> passwordManager = document.querySelector('* /deep/ passwords-section').passwordManager_
PasswordManagerImpl {}
> await new Promise(resolve => passwordManager.getPlaintextPassword(0, resolve))
{index: 0, plaintextPassword: "cisco"}
或
queryObjects(PasswordManagerImpl)
,再次绕过DOM,更自由地在堆中查找对象。
如果
深/
不用任何替换,我们可以尝试使用treewalker/nodeiterator接口打开
shadowRoot
反过来,递归地。