有没有办法点击无头铬?

时间:2019-08-04 18:59:07

标签: node.js puppeteer google-chrome-headless

我试图单击Linkedin个人资料中的“我的网络”按钮。我可以使用“ goto”方法直接转到该网址,但我希望能够单击它。

我尝试使用“复制选择器”,但它似乎不起作用。

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());
})();

2 个答案:

答案 0 :(得分:0)

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

已更新

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());

输出:

  

当前URL为:https://www.linkedin.com/mynetwork/

答案 1 :(得分:0)

只需等待导航完成就足以正确更改选项卡

gridOptions.getRowStyle = function(params) {
   if (params.node.rowIndex === 'the index of row you want to change color ') {
      return { background: 'red' }
   }
}

但是问题可能出在其他地方,例如,当我最初创建帐户时,网页提示我登录后立即添加电话号码,因此也许您无法单击“网络”标签,因为某些情况下此选择器不存在其他原因。

通常不建议使用该表单登录,因为许多网页都有针对报废/非人类用户的对策。特别是Linkedin,可以要求您完成验证码输入,以证明您不是机器人。

如果您确实想以这种方式登录,则可以通过将这些选择器更改为简单的

来提高代码的责任感。
await Promise.all([
    page.waitForNavigation(),
    page.click(MY_NETWORK_BUTTON)
]);

否则,我建议使用cookie登录,这将进一步简化代码。

您可以通过致电获取伪造者接受的格式的Cookie列表

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`);

然后再用

进行设置
await page.cookies();

我不太确定linkedin用于在cookie内存储用户信息的格式,但是似乎仅加载名为await page.setCookie(cookie) 的cookie就足够了。

li_at
相关问题