jsdom 用法技巧

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
为了使用 jsdom,主要用到jsdom主模块的一个命名导出的 jsdom 构造函数。往构造器传递一个字符串,将会得到一个 jsdom 构造实例对象,这个对象有很多实用的属性,特别是 window 对象:

const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"

const dom = new JSDOM(``, {
  url: "https://example.org/",
  referrer: "https://example.com/",
  contentType: "text/html",
  userAgent: "Mellblomenator/9000",
  includeNodeLocations: true
});

完整用法,此处以
http://match.yuanrenxue.com/match/2"为例
 
// 导入jsdom
jsdom = require('jsdom')
// 生成jsdom对象
const {JSDOM} = jsdom;
// 倒入读写js的包
const fs = require('fs')
// 对1.html进行对去操作
fs.readFile('./1.html', 'utf8', function (err, data) {
//定制jsdom,data一般是js代码,由于安全策略的原因导致无法自动加载script标签
//需要开启安全策略的开关,runScripts: "dangerously"
//js代码直接写入会报错。所以一般在本地新建个html文件,像刚刚的1。html,然后用fs.readFile进行读取操作
const dom = new JSDOM(data
,
{
url: "http://match.yuanrenxue.com/match/2",
referrer: "http://match.yuanrenxue.com/match/2",
contentType: "text/html",
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
includeNodeLocations: true,
runScripts: "dangerously",
}
)
console.log(dom.window.document.cookie);

dom.window.close()
})

其中的 ./1.html是该网站第一次加载生成cookie的js代码,由于直接放在js文件里会报错,所以把他放在html里进行导入
 

这种图片的报错一般都是reload函数的报错,可以不用管,也可以 在js代码里面找到location.reload进行删除就好了,没有影响 

// 导入jsdom
const jsdom = require('jsdom')
// 生成jsdom对象
const { JSDOM } = jsdom;
// 倒入读写js的包
const fs = require('fs')

options={
url: "http://match.yuanrenxue.com/match/2",
referrer: "http://match.yuanrenxue.com/match/2",
contentType: "text/html",
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
includeNodeLocations: true,
runScripts: 'dangerously',

cookieJar:new jsdom.CookieJar(),
beforeParse(window) {
window.alert();
window.setInterval = function (s, b) {
eval(s)
}
//重写之后进行伪装
window.setInterval.toString = function () {
"function setInterval() { [native code] }"
}
window.setTimeout = function (s, b) {
eval(s)
}
window.setTimeout.toString = function () {
"function setTimeout() { [native code] }"
}
},

}
// 提前植入setcookie的操作
options.cookieJar.setCookie(cookie,url,function(val){})
// 对1.html进行对去操作
fs.readFile('./1.html', 'utf8', function (err, data) {
//定制jsdom,data一般是js代码,由于安全策略的原因导致无法自动加载script标签
//需要开启安全策略的开关,runScripts: "dangerously"
//js代码直接写入会报错。所以一般在本地新建个html文件,像刚刚的1。html,然后用fs.readFile进行读取操作
const dom = new JSDOM(data
,
options
)
console.log(dom.window.document.cookie);
//将dom窗口关闭
dom.window.close()
})

 
原文地址:https://www.cnblogs.com/wuxianyu/p/14761529.html