FabricioG
FabricioG

Reputation: 3320

pupppeteer js element not clicking even thou it is available in console

I have the following element in html.

<a title="Download photo" href="https://example.com/photos/GXqvtQh1N9A/download?force=true" rel="nofollow" download="" target="_blank" class="_1QwHQ _1l4Hh _1CBrG _1zIyn xLon9 _1Tfeo _2L6Ut _2Xklx"><svg class="Apljk _11dQc" version="1.1" viewBox="0 0 32 32" width="32" height="32" aria-hidden="false"></a>

From the console when Chromium is open. I can query it like so:

document.querySelector('a[title="Download photo"]');

I can create a reference to it:

var link = document.querySelector('a[title="Download photo"]');

I then can click on it like so:

link.click();

I try the same exact thing in Puppeteer.js in code. Same page.

  for (const handle of getAllElements) {
    try {
      await handle.click();
    const downloadButton = await page.$('a[title="Download photo"]');
      downloadButton.click();
      await sleep.sleep(2000);
    } catch (e) {
      console.error(e);
    }
  }

The initial handle.click() works and it opens me to the page I'm discussing here. But then downloadButton.click() doesn't function. I've also tried page.click(downloadButton). I've also tried:

const downloadButton = await page.$('a[title="Download photo"]'); await downloadButton.click();

To ensure I'm working with the same page I visually do it while the page is on the screen.

Any ideas what's gong on?

Upvotes: 0

Views: 45

Answers (1)

mbit
mbit

Reputation: 3013

As you mentioned it opens a layer on top each time you click on the image. Also, a[title="Download photo"] needs to be relative to the handle not page. Here is the working code:

for (const handle of getAllElements) {
    await handle.click();
    await handle.$eval('a[title="Download photo"]', el => el.click());
    //allow download
    await page._client.send('Page.setDownloadBehavior', {
        behavior: 'allow',
        downloadPath: './'
    });
    await new Promise(resolve => setTimeout(resolve, 2000));
    //click on X to close the layer
    await page.click('._1NHYN');
}

Upvotes: 1

Related Questions