如何使用 Puppeteer 单击随机跨度元素

How to click a random span element with Puppeteer

提问人:Julian Singh 提问时间:9/7/2023 最后编辑:ggorlenJulian Singh 更新时间:9/7/2023 访问量:49

问:

我正在尝试自动化机器人,以便在每次加载或刷新页面时在我的页面“KRC SEO TOOLS”上随机选择一个工具/链接,其中包含所有相同的跨度元素。我尝试了很多方法,但一直失败。任何帮助将不胜感激。请看一下图像元素。

图像

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({
    headless: false, slowMo: 100, // Uncomment to visualize test
  });
  const page = await browser.newPage();

  // Load "https://www.krcinfo.com/"
  await page.goto('https://www.krcinfo.com/');

  // Resize window to 1920 x 923
  //await page.setViewport({ width: 1920, height: 923 });

  // Scroll wheel by X:0, Y:300
  await page.evaluate(() => window.scrollBy(0, 300));

  // Click on a random link or tool
await page.waitForSelector('.tool_des')
  await Promise.all([
    page.click('.tool_des'),
    page.waitForNavigation()
  ]);

  await page.waitForTimeout(5_000)


  await browser.close();
})();
JavaScript HTML Puppeteer 元素 WebAutomation

评论

0赞 ggorlen 9/7/2023
代码通常看起来比您的上一个问题更好,但这里的反馈相同:您尝试了什么,您的具体问题是什么?如果要选择一个随机元素,可以从 开始。为了正确使用,您需要获取以下元素的数组:.之后,它与从 JavaScript 数组中获取随机值基本相同。Math.random()Math.random()const elements = await page.$$(".tool-des")
0赞 Julian Singh 9/7/2023
我以前试过这个,但似乎我没有输入正确的变量。嗯。 , , .tool-des(${randomNumber}) 一个await page.waitForSelector('.tool_des')const elements = await page.$$(".tool-des")const randomNumber = Math.floor(Math.random() * elements.length - 1);await page.$().click()
0赞 ggorlen 9/7/2023
很酷,这是正确的想法,尽管我会删除它,因为它跳过了最后一个元素,然后查询应该有点不同。你能把它编辑到你的帖子中吗?我会添加一个答案。谢谢。- 1
0赞 Julian Singh 9/7/2023
嘿,伙计,你能教我编码吗哈哈......我是新手......我知道这些事情是有代价的

答:

1赞 ggorlen 9/7/2023 #1

您可以使用从 JavaScript 数组中获取随机值,对提取的 ElementHandles 数组进行提取:page.$$

const puppeteer = require("puppeteer"); // ^21.0.2

const url = "https://www.krcinfo.com/";

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  await page.goto(url, {waitUntil: "domcontentloaded"});
  const els = await page.$$(".tool_des");
  const navP = page.waitForNavigation({waitUntil: "domcontentloaded"});
  const i = Math.floor(Math.random() * els.length);
  await els[i].click();
  await navP;
  console.log(await page.url());
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

我不能不提随机数和非确定性不是引入测试的好东西,如果这是你的用例的话。

评论

0赞 Julian Singh 9/7/2023
哇,伙计,你真棒......非常感谢,伙计