Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将jQuery与Puppeter上的页面一起使用?_Javascript_Jquery_Node.js_Puppeteer - Fatal编程技术网

Javascript 如何将jQuery与Puppeter上的页面一起使用?

Javascript 如何将jQuery与Puppeter上的页面一起使用?,javascript,jquery,node.js,puppeteer,Javascript,Jquery,Node.js,Puppeteer,我正试图在我用Puppeter加载的页面上使用jQuery,我想知道如何才能做到这一点?我的代码结构如下: const puppeteer = require('puppeteer'); let browser = null; async function getSelectors() { try{ browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sand

我正试图在我用Puppeter加载的页面上使用jQuery,我想知道如何才能做到这一点?我的代码结构如下:

const puppeteer = require('puppeteer');
let browser = null;
async function getSelectors() {
        try{
            browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
            const page = await browser.newPage();
            await page.setViewport({width: 1024, height: 1080});
            await page.goto('https://www.google.com/');
            await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.2.1.min.js'});
            var button = $('h1').text();
            console.log(button);
        } catch (e) {
            console.log(e);
        }
}
getSelectors();
此外,我将导航到Puppeter中的许多页面,所以有没有一种方法可以只添加一次jQuery,然后在整个页面中使用它?本地jquery文件实现也会有所帮助

我尝试实现来自的答案,但无法使代码正常工作。我将要做的事情比上面演示的要复杂得多,所以我需要的是jQuery而不是普通的JS解决方案。

我终于从 这帮助我理解了Puppeter
page.evaluate
函数可以让您直接访问刚才在Puppeter中启动的页面的DOM。要使以下代码正常工作,您应该知道我在开玩笑地运行此测试。此外,您还需要一个合适的URL,指向具有ID的表元素的页面。显然,您可以更改页面的详细信息和要尝试的jQuery函数。我处于一个jQuery数据项项目的中间,所以我需要确保我有一个表元素,jQuery可以找到它。这种环境的好处在于,浏览器只是一个真正的浏览器,因此,如果我向实际的HTML页面添加一个脚本标记,而不是通过Puppeter添加它,它的工作原理是一样的

test('Check jQuery datatables', async () => {
   const puppeteer = require('puppeteer');
   let browser = await puppeteer.launch();
   let page = await browser.newPage();
   await page.goto('http://localhost/jest/table.html');
   await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.3.1.slim.min.js'});
   const result = await page.evaluate(() => {
       try {
           var table = $("table").attr("id");
           return table;
       } catch (e) {
           return e.message;
       }
   });
   await console.log("result", result);
   await browser.close();
});

我的主要发现是:在
page.evaluate
函数中,您的JavaScript代码在您刚刚在浏览器中打开的页面的熟悉上下文中运行。我继续为使用jQuery插件和
页面创建的复杂对象创建测试。评估它们的行为是否符合预期。尝试使用JSDOM让我抓狂,因为它的行为有点像浏览器,但在我测试应用程序时使用的关键点上有所不同。

var-button=$('h1').text()在node.js的上下文中调用它,而不是在puppeter内的实例中调用它。尝试放置在
页面内。评估
。@Keith谢谢,这似乎很管用,有没有办法添加jQuery的本地副本?还有,我如何使它能够在Puppeter中导航到的所有页面中使用jQuery,而不是将脚本注入每个页面。不,没有办法注入jQuery的“本地”副本,因为代码(对于Puppeter)是在浏览器的上下文中计算的。请参阅Node.js的备选方案。@Keith抱歉,刚刚意识到您在评论中基本上回答了这个问题。你让我想起了我的数学老师,他跳过了他认为我不需要别人告诉就可以算出的关键行。page.evaluate的木偶师文档对我来说没有意义,您的快速评论也不足以帮助我理解这一点。我希望你把它写在回信里。“你肯定会得到我的一票。”大卫约戈。我经常用手机回复,所以有时候我的回复可能很短。希望我的评论有助于将OP推向正确的方向。但如果需要澄清,如果OP要求,我通常会提供更多细节。