首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Node.js
Express
PPA for Ubuntu
ppa:chris-lea/node.js
Coding
V2EX  ›  Node.js

请问,为什么 puppeteer 向页面注入 jquery 代码, jquery 却不能立即起作用?

  •  
  •   hgjian · 151 天前 · 3101 次点击
    这是一个创建于 151 天前的主题,其中的信息可能已经有所发展或是发生改变。

    const puppeteer = require('puppeteer');

    void(async () => {
    	
    		const browser = await puppeteer.launch({
    			headless: false,
    			devtools: true
    		});
    		
    		const page = await browser.newPage();
    		
    		const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3835.0 Safari/537.36";  //  UserAgent   ;
    		
    		await Promise.all ( [
    			page.setUserAgent ( UA ) , 		
    			page.setJavaScriptEnabled ( true ) ,	//  允许执行 js 脚本										
    		] ) ;  
    		
    		await page.goto( "http://www.gewara.com/" , { waitUntil : "networkidle0" ,  timeout : 3600000 } ) ;		
    		
    		await page
    			.mainFrame()
    			.addScriptTag({
    			url: 'https://code.jquery.com/jquery-3.4.1.min.js'
    		});
    		
    		await page.waitFor(2000);
    		
    		page.on( 'console' , msg => console.log( "var result = await page.evaluate( ( ) =>{  ***  函数内的 console.log:" , msg.text() ) );		
    		
    		const result = await page.evaluate(() => {
    				const watchDog = ( window.$ !== undefined );
    				console.log( "window.$ !== undefined    JQ:" + watchDog ) ;  //  应该显示  true ;实际测试却显示  false ;但是,浏览器运行打开网页后,在控制面板测试,就显示为 true 了 ;	  
    				return 
    		});
    		
    		console.log(result);
    		
    })();
    
    27 回复  |  直到 2019-07-26 23:32:09 +08:00
        1
    hgjian   151 天前
    console.log( "window.$ !== undefined JQ:" + watchDog ) ; // 应该显示 true ;实际测试却显示 false ;但是,浏览器运行打开网页后,在控制面板测试,就显示为 true 了 ;
        2
    2DaYe   150 天前
    jQuery 库引用晚了吧?页面都 load 完了再引,jQuery 就没法初始化了吧?
        3
    hgjian   150 天前
    @2DaYe 请问怎么解决啊?
        4
    learnshare   150 天前
    const page = await browser.newPage();

    await page.addScriptTag({
    path: './node_modules/jquery/dist/jquery.js',
    });

    await page.goto()
        5
    hgjian   150 天前
    @learnshare 安装 jq 库?
        6
    hgjian   150 天前
    @learnshare 你好,我按照你的代码试了一下,还是不行哦
        7
    learnshare   150 天前
    @hgjian 大概你测试的网站不允许 jQuery,测试本站是可以的

        8
    hgjian   150 天前
    @learnshare 应该是可以的吧,puppeteer 打开 chrome 浏览器运行网页后,jquery 就生效了 ;
        9
    learnshare   150 天前
    @hgjian 但实际测下来就是没有 $
        10
    hgjian   150 天前
    @learnshare 那好奇怪啊,在浏览器控制台执行 window.$(".city-current").innerText 可以取得结果
        11
    hgjian   150 天前
    我中间有成功过一次,后来改乱了,不知道成功的代码是什么样的了,
        12
    Melting   150 天前
    好像是因为 http 的关系,而且话说 chrome 命令行也有$这个命令,可能冲突了
        13
    hgjian   150 天前
    @Melting 有什么解决办法吗?
        14
    hgjian   150 天前
    @Melting 或者也没有什么办法可以判断页面的 js 是不是全部执行完毕了啊?
        15
    shinpei   150 天前
    这个就涉及到 jQuery 源码的问题了;

    jquery 在代码尾部全局注册:
    if ( !noGlobal ) {
    window.jQuery = window.$ = jQuery;
    }


    // 这个是开始的代码,由于这个网站 module 是存在的,所以 noGlobal 为 true,
    ( function( global, factory ) {

    "use strict";

    if ( typeof module === "object" && typeof module.exports === "object" ) {

    // For CommonJS and CommonJS-like environments where a proper `window`
    // is present, execute the factory and get jQuery.
    // For environments that do not have a `window` with a `document`
    // (such as Node.js), expose a factory as module.exports.
    // This accentuates the need for the creation of a real `window`.
    // e.g. var jQuery = require("jquery")(window);
    // See ticket #14549 for more info.
    module.exports = global.document ?
    factory( global, true ) :
    function( w ) {
    if ( !w.document ) {
    throw new Error( "jQuery requires a window with a document" );
    }
    return factory( w );
    };
    } else {
    factory( global );
    }

    // Pass this if window is not defined yet
    } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {...}
        16
    shinpei   150 天前   ♥ 1
    简单点就是你去修改下 jquery 源码,把 if (!noGlobal) 判断去掉
        17
    hgjian   150 天前
    @shinpei 感谢
        18
    hgjian   150 天前
    @shinpei 请问,去掉判断以后,那 jq 没有全局注册,怎么调用 jq 呢?
        19
    hgjian   150 天前
    @shinpei 直接使用 jQuery ?
        20
    hgjian   150 天前
    @shinpei 请问有没有不修改 jq 源码 的 方法呢?
        21
    shinpei   150 天前
    @hgjian 我的意思是把
    if ( !noGlobal ) {
    window.jQuery = window.$ = jQuery;
    }
    直接写成
    window.jQuery = window.$ = jQuery;
        22
    hgjian   150 天前
    @shinpei 刚刚试过,好像不行
        23
    hgjian   150 天前
    @shinpei 搞定了,
    await page.addScriptTag({
    path: './node_modules/jquery/dist/jquery.js',
    });
    应该放在 page.goto 的后面,就可以了

    谢谢啊
        24
    shinpei   150 天前
    @hgjian 不客气
        25
    123s   149 天前
    根本不需要 jq 吧
        26
    xuyl   142 天前
    cheerio 就是服务端的 jQuery
        27
    hgjian   142 天前 via Android
    @xuyl 了解了,谢谢啊
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4378 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 38ms · UTC 02:56 · PVG 10:56 · LAX 18:56 · JFK 21:56
    ♥ Do have faith in what you're doing.