标签: puppeteer

在jest.setTimeout指定的5000ms超时内未调用异步回调

我正在使用木偶戏和开玩笑来进行一些前端测试.

我的测试看起来如下:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async () => {
      await page.waitForSelector(PROFILE.TAB);
      await page.click(PROFILE.TAB);
    }, 30000);
});
Run Code Online (Sandbox Code Playgroud)

有时,当我运行测试时,一切都按预期工作.其他时候,我收到一个错误:

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

      at node_modules/jest-jasmine2/build/queue_runner.js:68:21
      at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为:

  1. 我指定超时为30000

  2. 我是否得到这个错误似乎非常随机

任何人都可以猜到为什么会这样吗?

javascript automated-tests jestjs puppeteer

152
推荐指数
16
解决办法
9万
查看次数

Puppeteer:在.evaluate()中传递变量

我正在尝试将变量传递给Puppeteer中page.evaluate()函数,但是当我使用以下非常简化的示例时,变量是未定义的.evalVar

我是Puppeteer的新手,找不到任何构建的例子,所以我需要帮助将该变量传递给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();

  }

})();
Run Code Online (Sandbox Code Playgroud)

javascript evaluate web-scraping puppeteer

85
推荐指数
5
解决办法
4万
查看次数

JEST - 语法错误:uuid 库出现意外的标记“导出”

我曾经在仅使用 JavaScript 来使用 Jest 时解决了类似的错误,但目前我无法使用 Typescript 来解决类似的错误。

我的所有测试都运行良好,直到我安装了需要@types/jest-environment-puppeteer,@types/puppeteer和的 Puppeteer @types/expect-puppeteer

安装它们后,puppeteer 测试运行完美,但其他测试开始失败并出现以下错误。

  D:\...\api\node_modules\uuid\dist\esm-browser\index.js:1    
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){export { default as v1 } from './v1.js';
                                                                                      ^^^^^^  

    SyntaxError: Unexpected token 'export'

      at Runtime.createScriptFromCode (../node_modules/jest-runtime/build/index.js:1796:14)   
      at Object.require (../node_modules/@nestjs/common/decorators/core/injectable.decorator.js:4:16)
Run Code Online (Sandbox Code Playgroud)

我做了什么?

allowJs: true打开tsconfig.json并设置transformIgnorePatternson jest 配置。这样笑话就可以从node_modules/ 之后编译文件,此错误停止但测试因另一个奇怪的原因失败。更糟糕的是,测试开始时间增加太多。

所以我保留了allowJs原始设置并更新了笑话配置

"transform": {
   "^.+\\.(t|j)s$": "ts-jest"
}
Run Code Online (Sandbox Code Playgroud)

"transform": {
   "^.+\\.(t)s$": "ts-jest"
}
Run Code Online (Sandbox Code Playgroud)

所以目前 ts-jest 不编译 js 文件。但我认为我无法让 babel 选择js文件的转换。这些是我的笑话配置:

{
  "moduleFileExtensions": ["js", "json", "ts"],
  "rootDir": ".",
  "testEnvironment": …
Run Code Online (Sandbox Code Playgroud)

typescript nest jestjs babeljs puppeteer

60
推荐指数
2
解决办法
3万
查看次数

Puppeteer:单击带有文本的元素

是否有任何方法(在API中找不到)或解决方案点击带有文本的元素?

例如我有html:

<div class="elements">
    <button>Button text</button>
    <a href=#>Href text</a>
    <div>Div text</div>
</div>
Run Code Online (Sandbox Code Playgroud)

我想点击包含文字的元素(点击.elements里面的按钮),如:

Page.click('Button text', '.elements')
Run Code Online (Sandbox Code Playgroud)

有解决方案吗

puppeteer

55
推荐指数
7
解决办法
5万
查看次数

表单提交后,Puppeteer等待页面加载

我使用以下代码提交表单,我希望Puppeteer在表单提交后等待页面加载.

await page.click("button[type=submit]");

//how to wait until the new page loads before taking screenshot?
// i don't want this:
// await page.waitFor(1*1000);  //? unwanted workaround
await page.screenshot({path: 'example.png'});
Run Code Online (Sandbox Code Playgroud)

如何与木偶戏等待页面加载?

javascript puppeteer

50
推荐指数
8
解决办法
4万
查看次数

在本地找不到预期的浏览器 chrome

此 Meteor 代码使用“puppeteer 8.0.0”、“puppeteer-core 10.0.0”、puppeteer-extra 3.1.18”和“puppeteer-extra-plugin-stealth 2.7.8”,它给出以下错误:

错误:无法在本地找到所需的浏览器(chrome)。运行npm install以下载正确的 Chromium 修订版 (884014)。

尝试“npm install”无济于事。在线阅读,尝试从 package.json 依赖项中删除 "puppeteer-core": "^10.0.0" 但无济于事。

非常感谢任何帮助。谢谢

const puppeteer = require('puppeteer-extra');
const nameH = require('./NameH');

const puppeteerOptions = {
    headless: true,
    ignoreHTTPSErrors: true,
    args: ['--no-sandbox', '--single-process', '--no-zygote', '--disable-setuid-sandbox']
}

let browser;
let pageNameH;

const init = async () => {
    const StealthPlugin = require('puppeteer-extra-plugin-stealth');
    console.log('1')         //>>>>>>>>>>>> Prints 1
    puppeteer.use(StealthPlugin());
    console.log('2')         //>>>>>>>>>>>> Prints 2
    
    browser = await puppeteer.launch(puppeteerOptions);
    console.log('3') //>>>>>>>>> DID NOT PRINT <<<<<<<<<<<<<<<
    pageNameH = …
Run Code Online (Sandbox Code Playgroud)

node.js meteor puppeteer

43
推荐指数
4
解决办法
9万
查看次数

如何从下拉列表中选择一个选项

我可以点击选择器,但我的问题是如何从下拉列表中选择一个选项?

  await page.click('#telCountryInput > option:nth-child(4)')
Run Code Online (Sandbox Code Playgroud)

单击使用CSS选择器的选项不起作用.

例如,从下面的列表中选择国家/地区代码,

在此输入图像描述

puppeteer

34
推荐指数
5
解决办法
3万
查看次数

加载共享库时出错:libgbm.so.1:无法打开共享对象文件:AWS EC2 实例上 Nodejs 中的 Puppeteer

我正在使用 Puppeteer 模块通过 Node.js抓取一些数据。它在我的 Macbook 上运行良好,但是当我在 AWS EC2 实例上部署构建并点击正在抓取数据的路线时,它开始抛出错误:

加载共享库时出错:libgbm.so.1:无法打开共享对象文件

javascript amazon-ec2 node.js puppeteer

33
推荐指数
1
解决办法
5万
查看次数

puppeteer:在继续下一行之前等待N秒

puppeteer中我想在进入下一行代码之前等待一段确定的时间.

我试图setTimeout在一个评估函数中,但它似乎被忽略了

console.log('before waiting');
await page.evaluate(async() => {
  setTimeout(function(){
      console.log('waiting');
  }, 4000)
});
console.log('after waiting');
Run Code Online (Sandbox Code Playgroud)

此代码不等待,只是在等待之前等待之后写入

你知道怎么做吗?

javascript chromium browser-testing node.js puppeteer

30
推荐指数
5
解决办法
3万
查看次数

puppeteer:等待元素可见?

我想知道我是否可以告诉木偶操作员等到显示的元素.

const inputValidate = await page.$('input[value=validate]');
await inputValidate.click()

//I want to do something like that 
waitElemenentVisble('.btnNext ')

const btnNext = await page.$('.btnNext');
await btnNext.click();
Run Code Online (Sandbox Code Playgroud)

有什么方法可以做到这一点吗?

javascript node.js google-chrome-devtools puppeteer

29
推荐指数
6
解决办法
3万
查看次数