Puppeteer 获得第一个可见按钮

Puppeter get first visible button

我在一个页面上有两个按钮,有时第一个可见,有时第二个,有时两个都可见。

我想要select最后一个可见的按钮,然后点击它。

<div class="button-area">
   <a class="button">first</a>
   <a class="button hide">second</a>
</div>

例如此处:“第二个”按钮。

我试过:

var btnSelector='.button-area .button:visible:last';
await page.waitForSelector(btnSelector, { timeout: 6000 });
var [btn] = await page.$(btnSelector);
await Promise.all([
  btn.click(),
  page.waitForNavigation({ waitUntil: 'domcontentloaded' })
]);

但是不行,看来我的selector没有正确处理:/

你可以试试这个。

(async () => {
  let browser, page;
  let url = 'https://example.com';

  try {
    browser = await puppeteer.launch({ headless: true });
    page = await browser.newPage();

    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
    await page.waitForSelector('.button-area .button', { visible: true, timeout: 60000 });

    const buttonElement = await page.$('.button-area .button');
    if (await buttonElement.isIntersectingViewport()) {
      buttonElement.click();
      page.waitForNavigation({ waitUntil: 'domcontentloaded' });
    }

  } catch (error) {
    console.log(error.message);
  } finally {
    if (browser) {
      await browser.close();
      console.log('closing browser');
    }
  }
})();

或者你也可以这样试试

(async () => {
  let browser, page;
  let url = 'https://example.com';

  try {
    browser = await puppeteer.launch({ headless: true });
    page = await browser.newPage();

    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
    const buttonElement = await page.waitForSelector('.button-area .button', { visible: true, timeout: 60000 });
    await buttonElement.click();
    await page.waitForNavigation();

  } catch (error) {
    console.log(error.message);
  } finally {
    if (browser) {
      await browser.close();
      console.log('closing browser');
    }
  }
})();

如果其中 none 个有效,您可以尝试。

(async () => {
  let browser, page;
  let url = 'https://example.com';

  try {
    browser = await puppeteer.launch({ headless: true });
    page = await browser.newPage();

    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
    await page.waitForSelector('.button-area .button', { visible: true, timeout: 60000 });
        
    await page.evaluate(() => {
      Array.from(document.querySelectorAll('.button-area .button')).filter((buttons) => {
        return buttons.className != 'button hide'
      }).forEach(button => {
        if (button) button.click();
      });
    });

    await page.waitForNavigation();
  } catch (error) {
    console.log(error.message);
  } finally {
    if (browser) {
      await browser.close();
      console.log('closing browser');
    }
  }
})();