Document.getElementById 返回 “undefined”,即使该元素存在 [closed]

Document.getElementById returns "undefined", even though the element exists [closed]

提问人:Vuimov Nikita 提问时间:11/10/2023 最后编辑:Mister JojoVuimov Nikita 更新时间:11/10/2023 访问量:55

问:


这个问题似乎与帮助中心定义的范围内的编程无关。

12天前关闭。

我目前正在处理我的项目,我需要从网站上解析一些信息。我正在使用 Node.Js 库“puppeteer”。我需要单击该元素,但 Document.getElementById 返回“undefined”。你可以帮我吗?

我需要点击这个元素:它位于页面底部的很多元素下:

<div data-v-55c47311="" id="VikaWidget">

<script type="text/javascript">
<script type="text/javascript">
<script type="text/javascript">
<script src="/widget/script.js?theme=left" type="text/javascript"></script>
<link href="https://vi.admhmao.ru/assets/vi_widget_2/css/app.4291e2e8.css" rel="stylesheet">
<div data-v-55c47311="" id="VikaWidget">
<div id="widget_main" style="display: block;">
</body>

这是一个小部件,单击它会打开一个带有虚拟助手的窗口。 我已经成功地从页面中解析了一些元素,因此我确信与网站的连接没有问题。 这是我的代码:

const puppeteer = require('puppeteer');

let scrape = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();

    await page.goto('https://admhmao.ru');

    const result = await page.evaluate(() => {
        return document.getElementById('VikaWidget')
    });

    await browser.close();
    return result;
};

scrape().then((value) => {
    console.log(value); // The result is 'undefined'
});

你知道问题可能是什么吗?

JavaScript 节点.js 解析 DOM 傀儡器

评论

2赞 Rory McCrossan 11/10/2023
如果document.getElementById有一个基本的错误,如你所描述的那样,那么整个网络上就会有广泛的问题。更有可能的是,当您尝试访问该元素时,该元素不存在,但在页面生命周期的后期会添加到 DOM 中。我建议你调查使用加载事件处理程序来确保你的代码在 DOM 准备好时运行,或者如果目标元素是在 Web 请求/AJAX 等之后添加的,或者甚至你正在询问的页面写得很糟糕,并且在 DOM 中有多个元素具有相同的元素。id
1赞 Mister Jojo 11/10/2023
为什么 3 次没有?这意味着您需要在脚本中使用脚本?<script type="text/javascript"></script>
0赞 chrslg 11/10/2023
创建元素的 html 被解释为脚本。因此,控制台中可能会有一些消息告诉您这不是有效的 javascript 语法。但它甚至没有尝试解释它有 HTML(顺便说一句,3 innner 也是如此。当你编写 时,第一个开始 javascript 语法。第二个应该是一些javascript。所以它会引发一个错误,例如<script><script><script><script>Uncaught SyntaxError: expected expression, got '<')
0赞 chrslg 11/10/2023
所以,简短的回答:删除那些多余的.它们不仅毫无用处。它们是您遇到问题的原因。<script>
0赞 ggorlen 11/11/2023
问题是 Puppeteer 无法从 evaluate 块返回 DOM 节点。用。如果这不起作用,请确保先这样做。如果这不起作用,请分享一个最小的可重现示例。谢谢。return document.getElementById('VikaWidget').textContentawait page.waitForSelector("#VikeWidget")

答:

2赞 Fatorice 11/10/2023 #1

看起来,您在渲染 DOM 之前调用了该函数。尝试像这样修改调用:document.getElementByIdpage.goto()

await page.goto('https://admhmao.ru', {waitUntil: 'domcontentloaded'});

当您尝试获取的元素是动态添加的时,您还可以添加以下调用:

await page.waitForSelector('#VikaWidget', {
  visible: true,
});

评论

0赞 ggorlen 11/11/2023
感谢您的回答,但不幸的是,这并不能解决问题。 实际上不如 OP 使用的默认事件那么宽松。请参阅这篇博文了解移植情况。OP 的代码也存在无法正常工作的问题。domcontentloadedloadreturn document.getElementById('VikaWidget')
1赞 Vuimov Nikita 11/11/2023
它现在起作用了!非常感谢!