我正在使用木偶戏和开玩笑来进行一些前端测试.
我的测试看起来如下:
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)
这很奇怪,因为:
我指定超时为30000
我是否得到这个错误似乎非常随机
任何人都可以猜到为什么会这样吗?
我正在尝试将变量传递给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 来使用 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
并设置transformIgnorePatterns
on 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) 是否有任何方法(在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在表单提交后等待页面加载.
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)
如何与木偶戏等待页面加载?
此 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) 我可以点击选择器,但我的问题是如何从下拉列表中选择一个选项?
await page.click('#telCountryInput > option:nth-child(4)')
Run Code Online (Sandbox Code Playgroud)
单击使用CSS选择器的选项不起作用.
例如,从下面的列表中选择国家/地区代码,
我正在使用 Puppeteer 模块通过 Node.js抓取一些数据。它在我的 Macbook 上运行良好,但是当我在 AWS EC2 实例上部署构建并点击正在抓取数据的路线时,它开始抛出错误:
加载共享库时出错:libgbm.so.1:无法打开共享对象文件
在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)
此代码不等待,只是在等待之前和等待之后写入
你知道怎么做吗?
我想知道我是否可以告诉木偶操作员等到显示的元素.
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)
有什么方法可以做到这一点吗?
puppeteer ×10
javascript ×6
node.js ×4
jestjs ×2
amazon-ec2 ×1
babeljs ×1
chromium ×1
evaluate ×1
meteor ×1
nest ×1
typescript ×1
web-scraping ×1