有没有办法点击 headless chrome?

Is there a way to click in headless chrome?

我正在尝试点击 Linkedin 个人资料中的 "my network" 按钮。我可以使用 'goto' 方法直接转到 url,但我希望能够单击它。

我试过使用 'copy selector' 但它似乎不起作用。

const BUTTON_SELECTOR = '#mynetwork-nav-item';
    await page.click(BUTTON_SELECTOR);

我可以登录,但之后就不能用了。

完整代码-

const puppeteer = require('puppeteer');
(async () => {
  /* Initiate the Puppeteer browser */
  const browser = await puppeteer.launch({ headless: false, defaultViewport: { width: 1366, height: 768 }});
  const page = await browser.newPage();

  await page.goto(`https://www.linkedin.com`, { waitUntil: 'networkidle0' });

  let element, formElement, tabs;
  element = await page.$x(`//a[contains(text(),'Sign in')]`);
    await element[0].click();
    await page.waitForNavigation();

    element = await page.$x(`//*[@id="username"]`);
    await element[0].type(`some_id@example.com`);

    element = await page.$x(`(.//*[normalize-space(text()) and normalize-space(.)='Welcome Back'])[1]/following::div[3]`);
    await element[0].click();

    element = await page.$x(`//*[@id="password"]`);
    await element[0].click();

    element = await page.$x(`//*[@id="password"]`);
    await element[0].type(`some_password`);

    await page.keyboard.press(`Enter`)

    const MY_NETWORK_BUTTON = '#mynetwork-tab-icon';
    await page.waitForSelector(MY_NETWORK_BUTTON, {visible: true});
    const [response] = await Promise.all([
    page.waitForNavigation(), // The promise resolves after navigation has finished
    page.click(MY_NETWORK_BUTTON), // Clicking the link will indirectly cause a navigation
    ]);

    console.log('CURRENT URL IS: ', response.url());
})();

首先尝试等待选择器,然后您应该更改选择器,然后点击它。

更新:

const MY_NETWORK_BUTTON = '#mynetwork-tab-icon';
await page.waitForSelector(MY_NETWORK_BUTTON, {visible: true});
const [response] = await Promise.all([
  page.waitForNavigation(), // The promise resolves after navigation has finished
  page.click(MY_NETWORK_BUTTON), // Clicking the link will indirectly cause a navigation
]);

console.log('CURRENT URL IS: ', response.url());

输出:

CURRENT URL IS: https://www.linkedin.com/mynetwork/

只需等待导航完成就足以正确更改标签页

await Promise.all([
    page.waitForNavigation(),
    page.click(MY_NETWORK_BUTTON)
]);

但是问题可能出在其他方面,例如,当我最初创建帐户时,网页提示我在登录后立即添加我的 phone 号码,所以您可能无法单击网络选项卡,因为这由于某些其他原因,选择器不存在。

通常不建议使用表单登录,因为很多网页都有针对抓取/非人类用户的反制措施。特别是 Linkedin 可以要求您在登录后完成验证码以证明您不是机器人。

如果您真的想以这种方式登录,您可以通过将这些选择器更改为简单的方式来改进您负责的代码

await page.goto("https:\/\/www.linkedin.com", { waitUntil: 'networkidle0' });

await page.type("input[name='session_key']",email);
await page.type("input[name='session_password']",password);
await page.keyboard.press(`Enter`);

否则我会建议使用 cookie 登录,这样会更加简化代码。

您可以通过调用

获取 puppeteer 接受的格式的 cookie 列表
await page.cookies();

然后将它们设置为

await page.setCookie(cookie)

我不太确定 linkedin 用于在 cookie 中存储用户信息的格式,但似乎只加载名为 li_at 的 cookie 就足够了,例如

await page.setCookie({
    "name": "li_at",
    "value": INSERT VALUE HERE,
    "domain": ".www.linkedin.com",
    "path": "/",
    "size": 157,
    "httpOnly": true,
    "secure": true,
    "session": false
})