meliz
meliz

Reputation: 91

Not able to click on a button using puppeteer

I am using puppeteer.

await page.type('#guestEmail', email);
await page.click("#checkoutGuest");

so how the site works is, the user will need to input the email 1st, then the button will be available to select. Weirdly the code above does not work. I have tried doing a timeout of a couple of seconds to wait till the button is available but nope. Heres the link to the page. Can anyone help?

Upvotes: 1

Views: 1630

Answers (2)

user16133158
user16133158

Reputation:

You can give this a try.

let browser, page;
let pageUrl = 'https://www.jdsports.com.sg/checkout/login/';
let email = '[email protected]';

try {
  browser = await puppeteer.launch({ headless: true });
  page = await browser.newPage();
  await page.goto(pageUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });
  await page.type('#guestEmail', email);
  await page.waitForSelector('button#checkoutGuest:not([disabled])');
  await page.click("#checkoutGuest");

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

Or you can try page.evaluate.

let browser, page;
let pageUrl = 'https://www.jdsports.com.sg/checkout/login/';
let email = '[email protected]';

try {
  browser = await puppeteer.launch({ headless: true });
  page = await browser.newPage();
  await page.goto(pageUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });
  await page.type('#guestEmail', email);            
  await page.evaluate(() => {
    if (!document.getElementById('checkoutGuest').disabled) {
      await page.click("#checkoutGuest");
    }
  });
        
} catch (err) {
  console.log(err.message);
} finally {
  if (browser) {
    await browser.close();
    console.log('closing browser');
  }
}

Or you can try and use waitForFunction.

let browser, page;
let pageUrl = 'https://www.jdsports.com.sg/checkout/login/';
let email = '[email protected]';

try {
  browser = await puppeteer.launch({ headless: true });
  page = await browser.newPage();
  await page.goto(pageUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });
  await page.type('#guestEmail', email);            
  await page.waitForFunction('document.getElementById("checkoutGuest").className != "btn btn-level1 large disabled"');
        
} catch (err) {
  console.log(err.message);
} finally {
  if (browser) {
    await browser.close();
    console.log('closing browser');
  }
}

Upvotes: 2

Lrazerz
Lrazerz

Reputation: 164

Maybe your trouble was with popup. You always can debug your puppeteer session by running puppeteer in headful mode or by making screenshots. Certainly there is a better way to do with popup, but you got the idea.

const checkForPopup = () => {
    const item = myPage.$('.countryselector');
    if(item) {
        myPage.click('.close');
    }
}

const main = async () => {
    const browser = await puppeteer.launch({headless: false});
    myPage = await browser.newPage();

    // visit page with product
    await myPage.goto('https://www.jdsports.com.sg/product/white-nike-waffle-one/16139953_jdsportssg/');

    // select product
    await myPage.click("button[title=\"Select Size 6.5\"]");
    checkForPopup();
    await myPage.click("#addToBasket");
    checkForPopup();

    // add product to cart
    await myPage.waitForSelector('.addToCatPopupDesignCheckout');
    checkForPopup();
    await myPage.click(".addToCatPopupDesignCheckout");
    checkForPopup();

    // type email and checkout
    await myPage.waitForSelector('#guestEmail');
    checkForPopup();
    await myPage.click('#guestEmail');
    checkForPopup();
    await myPage.keyboard.type('someEmail');
    checkForPopup();
    await myPage.click("#checkoutGuest");
}

Upvotes: 1

Related Questions