我正在用 AVA 和 jsdom 编写测试。
这有效:
const rp = require('request-promise-native')
const jsdom = require('jsdom')
const {JSDOM} = jsdom
const url = 'http://localhost:8000'
rp(url).then((body) => {
const options = {
url: url,
resources: 'usable',
runScripts: 'dangerously',
}
let dom = new JSDOM(body, options)
dom.window.document.addEventListener('DOMContentLoaded', () => {
setImmediate(() => {
console.log(dom.serialize()) // works, prints <html><head></head><body><h1>Hello world!</h1></body></html>
})
})
})
外部脚本将 h1 添加到文档正文。
// external.js
document.addEventListener('DOMContentLoaded', () => {
document.write('<h1>Hello world!</h1>')
})
这是http://localhost:8000的标记:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSDOM test</title>
<script src="external.js"></script>
</head>
<body>
</body>
</html>
当我在测试中尝试同样的事情时:
const rp = require('request-promise-native')
const test = require('ava')
const jsdom = require('jsdom')
const {JSDOM} = jsdom
const url = 'http://localhost:8000'
test('Check custom CSS', t => {
return rp(url).then((body) => {
const options = {
url: url,
resources: 'usable',
runScripts: 'dangerously',
}
let dom = new JSDOM(body, options)
dom.window.document.addEventListener('DOMContentLoaded', () => {
setImmediate(() => {
console.log(dom.serialize()) // nothing gets printed
})
})
t.pass('passed')
})
})
console.log
不叫。我希望<html><head></head><body><h1>Hello world!</h1></body></html>
得到打印,而不是没有输出。
总之,我想:
- 从 url 获取响应正文
- 从中创建一个新的 jsdom 对象
- 执行链接到响应正文头部标签的脚本
- 让脚本更改标记
- 打印生成的修改标记
这样做的最佳方法是什么?
这是一个最小的工作示例:https ://github.com/cg433n/jsdom-test