【发布时间】:2020-06-07 18:11:14
【问题描述】:
我正在使用 Puppeteer 为我的家庭项目制作一个 Facebook Messenger api(某种)。
到目前为止,我可以使用 puppeteer 成功登录我的帐户。
当我想在登录后自动化时,真正的问题就开始了。
我无法点击任何元素。
例如:
我想点击小“i”图标:
然后我复制了像这样的选择器:
我在 console 中收到以下错误:
(node:4771) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError [ERR_ASSERTION]: No node found for selector: #cch_feb64f1b00e628 > div._5742 > ul > li:nth-child(4) > a > div > svg
(node:4771) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
代码:
const puppeteer = require('puppeteer');
(async function() {
// This function is used to login into the account.
async function login() {
console.log('=====In Login=====');
const email = '#email';
const pass = '#pass';
const submit = '#loginbutton';
await page.waitFor(3000);
await page.click(email);
await page.waitFor(2000);
await page.keyboard.type('not_a_real_email@mail.com');
await page.waitFor(2000);
await page.click(pass);
await page.waitFor(2000);
await page.keyboard.type('not_a_real_password');
await page.waitFor(2000);
await page.click(submit);
return 0;
}
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
page.on('load', () => console.log('=====Page loaded!====='));
await page.goto('https://messenger.com');
await login();
await page.waitForNavigation();
await page.waitFor(3000); // I'm waiting just for safe side to make sure the element is loaded.
// This is the line where the 'i' is clicked.
// This is the line error occurs.
await page.click(
'#cch_feb64f1b00e628 > div._5742 > ul > li:nth-child(4) > a > div > svg'
);
})();
所以,根据上面的错误,我知道选择器是错误的。那么正确的选择器是什么?不仅如此,当我在表情符号元素等其他元素上尝试它时,我也遇到了同样的错误。
【问题讨论】:
-
“cch_feb64f1b00e628”或“div._5742”是否可能是动态生成的并且每次运行都不同?编辑:看起来您正在尝试单击 svg 元素而不是父锚标记。你可以试试这个选择器吗?
-
@cadmium 我很快查了一下。
#cch_feb64f1b00e628是为每次登录动态生成的。那么,有没有其他方法可以选择呢? -
我有点生疏了,但你可以用 '[data-testid="info_panel_button"]' 来选择它。那应该返回锚按钮。
-
@cadmium 3 个元素(语音通话、视频通话、“i”)被包裹在
<ul>标签内,并且其选择器是动态生成的。那么,除了那个选择器之外,还有什么方法可以获取元素呢?就像使用正则表达式来获取该元素一样。 -
@cadmium 如何通过 puppeteer 访问
[data-testid="info_panel_button"]?
标签: javascript node.js facebook automation puppeteer