user254694
user254694

Reputation: 1612

How do I pass this string value into my page.evaluate in a reasonable way?

my code is pretty straightforward, the crawler object is a puppeteer instance:

crawler.selectorReturner = async function(page, selector) {
  await page.waitForSelector(selector);
  var returnSelector = async function(){
    return selector;
  }
  await page.exposeFunction('returnSelector', returnSelector);
  var getSelections = await page.evaluate(
        () => {
            var resultsobj = {
                selections: []
            };
            var selector = returnSelector();
            var selections = Array.from(document.body.querySelectorAll(selector), ({ selected }) => { return selected; });
            resultsobj.selections = selections;
            return resultsobj;
        }
    );
  return getSelections;

}

an example of how I use crawler.selectorReturner

 const initialhrefsObj = await crawler.selectorReturner(page,"a[href]");

but in all the various ways I have tried I am not able to get document.body.querySelectorAll(selector) to work

Evaluation failed: DOMException: Failed to execute 'querySelectorAll' on 'Element': '[object Promise]' is not a valid selector.

I obviously don't want to have a bunch of functions with the selectors hard coded I want to pass it in to the page evaluate. How can I pass a string in and have that string be available inside of my page.evaluate?

Upvotes: -1

Views: 691

Answers (1)

browserless
browserless

Reputation: 2132

The #evaluate takes a variadic parameter in position 2 onward, so you're free to pass in selectors that way. This should look like:

var getSelections = await page.evaluate(
    (selectorString) => {
        var resultsobj = {
            selections: []
        };
        var selector = returnSelector(selectorString);
        var selections = Array.from(document.body.querySelectorAll(selector), ({ selected }) => { return selected; });
        resultsobj.selections = selections;
        return resultsobj;
    },
    '.my-selector' // Selector argument here
);

Upvotes: 1

Related Questions