পুতুল: .ভ্যালুয়েটে () পরিবর্তনশীল পাস


128

আমি পপিটারে একটি page.evaluate()ফাংশনে একটি ভেরিয়েবল পাস করার চেষ্টা করছি , কিন্তু যখন আমি নিম্নলিখিত খুব সরল উদাহরণ ব্যবহার করি তখন ভেরিয়েবল অপরিজ্ঞাত হয়।evalVar

আমি পপিটারে নতুন এবং এটির জন্য কোনও উদাহরণ খুঁজে পাচ্ছি না, সুতরাং আমার সেই পরিবর্তনশীলটি page.evaluate()ফাংশনে অতিক্রম করার জন্য সাহায্য প্রয়োজন যাতে আমি এটি ভিতরে ব্যবহার করতে পারি।

const puppeteer = require('puppeteer');

(async() => {

  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();

  const evalVar = 'WHUT??';

  try {

    await page.goto('https://www.google.com.au');
    await page.waitForSelector('#fbar');
    const links = await page.evaluate((evalVar) => {

      console.log('evalVar:', evalVar); // appears undefined

      const urls = [];
      hrefs = document.querySelectorAll('#fbar #fsl a');
      hrefs.forEach(function(el) {
        urls.push(el.href);
      });
      return urls;
    })
    console.log('links:', links);

  } catch (err) {

    console.log('ERR:', err.message);

  } finally {

    // browser.close();

  }

})();

উত্তর:


188

আপনি pageFunctionএই মত একটি যুক্তি হিসাবে পরিবর্তনশীল পাস করতে হবে :

const links = await page.evaluate((evalVar) => {

  console.log(evalVar); // 2. should be defined now
  

}, evalVar); // 1. pass variable as an argument

যুক্তিগুলিও সিরিয়ালাইজ করা যায়: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args


3
হ্যালো, আপনি কীভাবে একাধিক ভেরিয়েবলগুলি পাস করবেন?
চিৎজুই

4
এছাড়াও, আমি সত্যিই কোনও ফাংশন পাস করতে পারছি না: var myFunction = ফাংশন () so কনসোল.লগ ("হ্যালো")}; পেজ.ইভ্যালুয়েট (ফানক => ফানক (), মাই ফাংশন) অপেক্ষা করুন; আমাকে দেয়: Evaluation failed: TypeError: func is not a function.. কেন?
চিৎজুই

1
evalVarফাংশন আর্গুমেন্ট স্বাক্ষর এবং evaluateকোড পাসওয়ার্ড হিসাবে (কোড উদাহরণের শেষে) উভয় টাইপ করতে ভুলবেন না ।
ফ্লিম 15 ই

2
@ চিৎজুই: আপনি কোনও ফাংশন পাস করতে পারবেন না pate.evaluate()। আপনি এটি দিয়ে 'এক্সপোজ' করতে পারেন page.exposeFunction। আরও তথ্যের জন্য, স্ট্যাকওভারফ্লো . com/a/58040978 দেখুন
নক করুন

যেহেতু এটি সর্বাধিক উন্নতি করেছে, কেউ কি এর সাথে আবরণ ত্রুটির অভিজ্ঞতা পেয়েছেন? বিশেষত প্যারামিটারটি ইতিমধ্যে উপরের স্কোপটিতে ঘোষণা করা হয়েছে। এই ত্রুটিটি বাদ দিয়ে, এটি কাজ করে।
মাস্টার মাইক মিক্স করুন

61

আমি আপনাকে এই স্টাইলটি আটকে রাখতে উত্সাহিত করি, কারণ এটি আরও সুবিধাজনক এবং পাঠযোগ্য

let name = 'jack';
let age  = 33;
let location = 'Berlin/Germany';

await page.evaluate(({name, age, location}) => {

    console.log(name);
    console.log(age);
    console.log(location);

},{name, age, location});

40

একক চলক:

আপনি পাস করতে পারেন এক পরিবর্তনশীল করতে page.evaluate()নিম্নলিখিত সিনট্যাক্স ব্যবহার করছে:

await page.evaluate(example => { /* ... */ }, example);

দ্রষ্টব্য: আপনি ভেরিয়েবলটি আবদ্ধ করতে হবে না (), যদি না আপনি একাধিক ভেরিয়েবল পাস করে যাচ্ছেন।

একাধিক চলক:

আপনি পাস করতে পারেন একাধিক ভেরিয়েবল থেকে page.evaluate()নিম্নলিখিত সিনট্যাক্স ব্যবহার করছে:

await page.evaluate((example_1, example_2) => { /* ... */ }, example_1, example_2);

দ্রষ্টব্য: আপনার ভেরিয়েবলের মধ্যে অন্তর্ভুক্ত করার {}প্রয়োজন নেই।


12

এটা আমার বেশ কিছুটা সময় লেগেছিল জিনিসটা যে console.log()মধ্যে evaluate()নোড কনসোলে দেখাতে পারি না।

রেফ: https://github.com/GoogleChrome/puppeteer/issues/1944

পৃষ্ঠার ভিতরে যে সমস্ত কিছু চালিত হয় সেগুলি ব্রাউজার পৃষ্ঠার প্রেক্ষাপটে সম্পন্ন হয় function স্ক্রিপ্টটি নোড.জেজে নেই ব্রাউজারে চলছে তাই আপনি লগ করলে এটি ব্রাউজার কনসোলে প্রদর্শিত হবে যা আপনি যদি মাথাছাড়া চালাচ্ছেন তবে আপনি দেখতে পাবেন না। আপনি ফাংশনের ভিতরে নোড ব্রেকপয়েন্টও সেট করতে পারবেন না।

আশা করি এটি সাহায্য করতে পারে।


6

পাস করার জন্য function, দুটি উপায় আছে যা আপনি এটি করতে পারেন।

// 1. Defined in evaluationContext
await page.evaluate(() => {
  window.yourFunc = function() {...};
});
const links = await page.evaluate(() => {
  const func = window.yourFunc;
  func();
});


// 2. Transform function to serializable(string). (Function can not be serialized)
const yourFunc = function() {...};
const obj = {
  func: yourFunc.toString()
};
const otherObj = {
  foo: 'bar'
};
const links = await page.evaluate((obj, aObj) => {
   const funStr = obj.func;
   const func = new Function(`return ${funStr}.apply(null, arguments)`)
   func();

   const foo = aObj.foo; // bar, for object
   window.foo = foo;
   debugger;
}, obj, otherObj);

আপনি devtools: trueপরীক্ষার জন্য লঞ্চ বিকল্পগুলিতে যোগ করতে পারেন


এবং আমি একটি জিনিস পাস করতে চান?
ট্রমাডা

আপনি কীভাবে ২ য় মামলায় যুক্তি যুক্ত করবেন? উদাহরণস্বরূপ, আমি আপনার ফাঙ্কে একটি স্ট্রিং যুক্ত করতে চাই
ব্যবহারকারীর 3568719

yourFuncআপনার সম্পত্তি কোনও ফাংশন না হলে আপনি অবজেক্টের সাথে প্রতিস্থাপন করতে পারেন । @ ট্রামাডা
নেকড়ে

ফানক আপনার মতই ফান , যাতে আপনি ফানকে (স্ট্রিংআরজি) কল করতে পারেন ঠিক আপনার এক্সিকিউটিভের মতো @Func @ user3568719
নেকড়ে

আপনি কীভাবে কোনও বস্তুকে উইন্ডোতে পাস করবেন এবং তারপরে এটি অ্যাক্সেস করবেন তা দেখানোর বিষয়ে কি আপত্তি হবে?
wuno

2

আমার কাছে একটি টাইপ স্ক্রিপ্ট উদাহরণ রয়েছে যা টাইপস্ক্রিপ্টে নতুন কাউকে সহায়তা করতে পারে।

const hyperlinks: string [] = await page.evaluate((url: string, regex: RegExp, querySelect: string) => {
.........
}, url, regex, querySelect);

আপনি কী puppeteerটাইপস্ক্রিপ্ট চালায় ? আপনি প্রত্যেকবার নিজের কোডটি সংশোধন করে আপনি কি জেএস-এ স্থানান্তরিত করবেন?
হিমস্রোত 1

হ্যাঁ. আপনি এই প্রকল্পটি এখানে একবার দেখে নিতে পারেন - github.com/srinivasreddy/companies-list
শ্রীনিবাস রেড্ডি থাটিপার্থী

-1

পৃষ্ঠা সহ $$

//..
const page = await browser.newPage();
const hrefs = await page.$$eval('#fbar #fsl a', as => as.map(a => a.href));
console.log(hrefs);
//..

[ পৃষ্ঠাতেও দেখুন $ একক নির্বাচকের জন্য স্পষ্ট ]


কিভাবে যে প্রশ্নের উত্তর দেয়? আপনি পরীক্ষার প্রসঙ্গ থেকে ব্রাউজার প্রসঙ্গে যাচ্ছেন এমন কোনও ভেরিয়েবল আমি দেখতে পাচ্ছি না।
এম্ব্রয়েজ রাবিয়ের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.