当 DOM 元素已经可见时,document.querySelector() returns null

document.querySelector() returns null when DOM elements are already visible

我正在尝试构建一个自动化的 Puppeteer 脚本来从我的银行网站下载我每月的银行交易。

但是,我遇到了一个奇怪的错误(有关此行为的图片,请参阅随附的 Imgur)

https://imgur.com/a/rSwCAxj

问题:DOM 元素上的 querySelector returnnull 清晰可见:

截图:https://imgur.com/d540E6p

(1) 用户名​​输入框在网站上清晰可见(https://internet.ocbc.com/internet-banking/), (2) 但是,当我运行document.querySelector('#access-code'),console returns null.

我想知道为什么会这样,以及当 DOM 节点清晰可见时,浏览器在 querySelector(#id) query 上 return 为空的情况是什么。

# 编辑:有效的奇怪解决方法

我继续玩浏览器,并使用 DevTools 检查 DOM 元素并用它来复制 JS 路径。

奇怪的是,在使用 Chrome Devtools 复制 JS 路径后,document.querySelector('#access-code') return 编辑了正确的元素。

它的屏幕截图return输入正确的元素https://imgur.com/a/rSwCAxj

在这两种情况下,完全相同的搜索字符串用于 document.querySelector

我相信您无法使用 document.querySelector('#access-code') 获得适当的价值,因为网站使用框架集。

在网站中有带 src 的框架来加载内容

<frame src="/internet-banking/Login/Login">

DOMContentLoading 在加载主文档时执行,而不是等待加载框架内容。

首先你需要有加载事件的监听器。

window.addEventListener("load",function() {
   ...
 });

以后你不能简单地使用 document.querySelector('#access-code') 因为你想要得到的输入在框架内。您将需要找到一种访问框架内容的方法,而不是在其中使用简单的 querySelector。

所以像这样:

window.addEventListener("load",function() {
   console.log(window.frames[0].document.querySelector('#access-code'));
 });

顺便说一句,请查看:查看源代码:https://internet.ocbc.com/internet-banking/ 看起来网站主要是在客户端呈现的。