我如何传递这个变量以从我的模块中使用它?
How I can pass this variable to use it from my module?
我已经设置了一个基本的木偶操作代码来实现自动化 chrome。我正在尝试使用 mymodule.foo(page)
将 page
变量作为参数传递给我的模块方法,但它无法抛出如下所示的错误:
目标是能够使用其他模块中的 page
等人偶对象。
E:\scripts\node\myproject\mymodule.js:3
await page.evaluateOnNewDocument(() => {
^^^^
SyntaxError: Unexpected identifier
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:607:28)
at Object.Module._extensions..js (module.js:654:10)
at Module.load (module.js:556:32)
at tryModuleLoad (module.js:499:12)
at Function.Module._load (module.js:491:3)
at Module.require (module.js:587:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (E:\scripts\node\myproject\app.js:3:18)
PS E:\scripts\node\myproject>
这是文件 app.js
:
// app.js
const puppeteer = require('puppeteer');
const mymodule = require('./mymodule');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await mymodule.foo(page);
await browser.close();
})();
这是文件 mymodule.js
:
更新: 我已更新此文件以将 async
添加到 foo
函数。但是如果我尝试将 await page.goto('http://www.google.com');
与 await 一起使用,我会得到同样的错误。所以我尝试添加另一个异步执行 page.evaluateOnNewDocument(async ()
然后它运行,打开浏览器,但它不导航到页面,也不等待。
// mymodule.js
module.exports = {
foo: async function (page) {
await page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000); // That's Evil, I know
});
}
};
更新 2: 这是我正在使用的实际代码(由@Hongah建议),它不会抛出错误,但还不能工作。
module.exports = {
foo: function (page) {
return page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000); // That's Evil, I know
});
}
};
另一种方法是可以接受的,同时我们可以使用 ie。 page.goto(<url>)
在 mymodule
的 foo
函数内部。能用就好了
您需要标记您的函数是 async
才能使用 await
。
试试这个:
// mymodule.js
module.exports = {
foo: async function (page) {
await page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000);
});
}
};
此代码将修复您代码的语法,但逻辑错误。
mymodule.js
的 module.exports.foo
中不需要 await
。
async
没有权限使用其中的功能。
你可以试试:
// mymodule.js
module.exports = {
foo: function (page) {
return page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000);
});
}
};
让我们面对现实吧,以下函数将 运行 浏览器上下文 上的代码
page.evaluateOnNewDocument
错误不在于模块本身,而在于您如何使用它。 page
对象在浏览器上下文中不可用。所以调用它不是解决方案。
如果要使用页面。在另一个模块中,你可以安全地这样做,
// mymodule.js
module.exports = {
foo: async function (page) {
await page.goto('http://www.google.com');
await page.waitFor(10000);
}
};
还要确保您的节点版本为 7.6 或更高版本。
我已经设置了一个基本的木偶操作代码来实现自动化 chrome。我正在尝试使用 mymodule.foo(page)
将 page
变量作为参数传递给我的模块方法,但它无法抛出如下所示的错误:
目标是能够使用其他模块中的 page
等人偶对象。
E:\scripts\node\myproject\mymodule.js:3
await page.evaluateOnNewDocument(() => {
^^^^
SyntaxError: Unexpected identifier
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:607:28)
at Object.Module._extensions..js (module.js:654:10)
at Module.load (module.js:556:32)
at tryModuleLoad (module.js:499:12)
at Function.Module._load (module.js:491:3)
at Module.require (module.js:587:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (E:\scripts\node\myproject\app.js:3:18)
PS E:\scripts\node\myproject>
这是文件 app.js
:
// app.js
const puppeteer = require('puppeteer');
const mymodule = require('./mymodule');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await mymodule.foo(page);
await browser.close();
})();
这是文件 mymodule.js
:
更新: 我已更新此文件以将 async
添加到 foo
函数。但是如果我尝试将 await page.goto('http://www.google.com');
与 await 一起使用,我会得到同样的错误。所以我尝试添加另一个异步执行 page.evaluateOnNewDocument(async ()
然后它运行,打开浏览器,但它不导航到页面,也不等待。
// mymodule.js
module.exports = {
foo: async function (page) {
await page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000); // That's Evil, I know
});
}
};
更新 2: 这是我正在使用的实际代码(由@Hongah建议),它不会抛出错误,但还不能工作。
module.exports = {
foo: function (page) {
return page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000); // That's Evil, I know
});
}
};
另一种方法是可以接受的,同时我们可以使用 ie。 page.goto(<url>)
在 mymodule
的 foo
函数内部。能用就好了
您需要标记您的函数是 async
才能使用 await
。
试试这个:
// mymodule.js
module.exports = {
foo: async function (page) {
await page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000);
});
}
};
此代码将修复您代码的语法,但逻辑错误。
mymodule.js
的module.exports.foo
中不需要await
。async
没有权限使用其中的功能。
你可以试试:
// mymodule.js
module.exports = {
foo: function (page) {
return page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000);
});
}
};
让我们面对现实吧,以下函数将 运行 浏览器上下文 上的代码
page.evaluateOnNewDocument
错误不在于模块本身,而在于您如何使用它。 page
对象在浏览器上下文中不可用。所以调用它不是解决方案。
如果要使用页面。在另一个模块中,你可以安全地这样做,
// mymodule.js
module.exports = {
foo: async function (page) {
await page.goto('http://www.google.com');
await page.waitFor(10000);
}
};
还要确保您的节点版本为 7.6 或更高版本。