felvieira
3/14/2019 - 9:17 PM

Puppeter Click by Text

const puppeteer = require('puppeteer');

const escapeXpathString = str => {
  const splitedQuotes = str.replace(/'/g, `', "'", '`);
  return `concat('${splitedQuotes}', '')`;
};

const clickByText = async function(page, text, element) {
    element = element || 'a';
    const escapedText = escapeXpathString(text);
    xpath = `//*[text()[contains(., ${escapedText})]]`;
    const elements = await page.$x(xpath);
    if(elements.length > 0) {
        for(i in elements) {
            e = elements[i];
            if(await e.isIntersectingViewport()) {
                await e.click();
                return;
            }
        }
    }
    else {
        console.log(xpath);
    }
    throw new Error(`Link not found: ${text}`);
};

const run = async () => {
  const browser = await puppeteer.launch({args: ['--no-sandbox'], headless: true});
  const page = await browser.newPage();
  await page.goto('https://en.wikipedia.org/wiki/List_of_The_Sandman_characters');
  await clickByText(page, `Fiddler's Green`);
  await page.waitForNavigation({waitUntil: 'load'});
  console.log("Current page:", page.url());
  return browser.close();
};

const logErrorAndExit = err => {
  console.log(err);
  process.exit();
};

run().catch(logErrorAndExit);
const puppeteer = require('puppeteer');

const escapeXpathString = str => {
  const splitedQuotes = str.replace(/'/g, `', "'", '`);
  return `concat('${splitedQuotes}', '')`;
};

const clickByText = async (page, text) => {
  const escapedText = escapeXpathString(text);
  const linkHandlers = await page.$x(`//a[contains(text(), ${escapedText})]`);
  
  if (linkHandlers.length > 0) {
    await linkHandlers[0].click();
  } else {
    throw new Error(`Link not found: ${text}`);
  }
};

const run = async () => {
  const browser = await puppeteer.launch({args: ['--no-sandbox'], headless: true});
  const page = await browser.newPage();
  await page.goto('https://en.wikipedia.org/wiki/List_of_The_Sandman_characters');
  await clickByText(page, `Fiddler's Green`);
  await page.waitForNavigation({waitUntil: 'load'});
  console.log("Current page:", page.url());
  return browser.close();
};

const logErrorAndExit = err => {
  console.log(err);
  process.exit();
};

run().catch(logErrorAndExit);