javascript - Puppeteer JS 等待能够选择多个下拉列表

标签 javascript puppeteer

目前我正在尝试从动态网页中选择多个下拉菜单。我必须选择每个选项才能获得我需要的值。

当我加载页面并尝试选择如下下拉菜单时:

  await page.evaluate(() => {
  document.querySelector('#paper > option:nth-child(2)').selected = true;
  document.querySelector('#color > option:nth-child(3)').selected = true;
  document.querySelector('#coating > option:nth-child(2)').selected = true;
  })

我无法选择下拉菜单。我认为这是因为页面尚未加载。为了尝试解决这个问题,我添加了名为 sleep 的阳极模块。

我像这样导休眠眠模块:

const sleep = require('sleep');

然后我尝试在每个选择器之间休眠一秒钟,以便有时间加载。

  sleep.sleep(1);
  await page.evaluate(() => {
  document.querySelector('#paper > option:nth-child(2)').selected = true;
  sleep.sleep(1);
  document.querySelector('#color > option:nth-child(3)').selected = true;
  sleep.sleep(1);
  document.querySelector('#coating > option:nth-child(2)').selected = true;
  })

我的问题是第一次 sleep 有效。然而,await page.evaluate 中的 sleep.sleep(1) 表示 sleep 未定义。我不确定为什么会发生这种情况,因为 const sleep 是在我的文档顶部声明的,所以它应该是全局范围的。谁能指导我为什么 sleep 不起作用?

最佳答案

您应该使用page.waitForSelector()确保在尝试更改相应的 selected 属性之前元素已加载:

await Promise.all([
  page.waitForSelector('#paper > option:nth-child(2)'),
  page.waitForSelector('#color > option:nth-child(3)'),
  page.waitForSelector('#coating > option:nth-child(2)'),
]);

await page.evaluate(() => {
  document.querySelector('#paper > option:nth-child(2)').selected = true;
  document.querySelector('#color > option:nth-child(3)').selected = true;
  document.querySelector('#coating > option:nth-child(2)').selected = true;
});

您的sleep功能在page.evaluate()内部不起作用的原因因为函数内部的代码是在页面DOM环境中执行的,而不是在Node.js/Puppeteer环境中执行的。

您可以将参数传递给 page.evaluate(),但参数必须是 serializable :

const example = 'Hello, world!';
const result = await page.evaluate(passed_argument => passed_argument, example);

console.log(result); // 'Hello, world!'

关于javascript - Puppeteer JS 等待能够选择多个下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489107/

相关文章:

javascript - Puppeteer 集群示例抛出错误 : Unable to get browser page

javascript - BS Modal - 没有背景,没有覆盖和显示时聚焦输入字段的能力?

javascript - 如何从模态更新行每列的值?

javascript - 防止源加载两次

javascript - 如何将大量文本发送到可编辑的 ="true"元素中?

javascript - 如何在 page.goto 函数中为每个请求设置超时选项

javascript - 如何在 MaterialUI 的 TextField 中禁用粘贴 (Ctrl+V) 和复制(Ctrl+C)

javascript - 嵌套 JavaScript 数组的分隔列表

node.js - 在 Jenkins CI 和 Debian 上使用 ChromeHeadless 的 Karma

node.js - 如何配置 Puppeteer 以正确呈现外部 JS 页面?仅适用于本地主机 URL