使用 PhantomJS 在 HTML 中访问 JS 全局变量的值
Posted
技术标签:
【中文标题】使用 PhantomJS 在 HTML 中访问 JS 全局变量的值【英文标题】:Accessing values of JS Global variables in HTML with PhantomJS 【发布时间】:2018-02-03 03:11:45 【问题描述】:所以我有一段看起来像这样的 html:
<html>
<body>
<script>
var foo =
bar: []
;
</script>
</body>
</html>
我正在尝试使用 PhantomJS 来提取 foo.bar 的值。我该怎么做?到目前为止,我知道我的结构是这样的:
var webPage = require('webpage');
var page = webPage.create();
page.open(MY_URL, function(status)
var foo = page.evaluate(function()
//gets javascript from the HTML in the response
// and extracts foo from there
);
);
console.log(someVar);
phantom.exit();
【问题讨论】:
【参考方案1】:您可以这样做,从幻像虚拟浏览器打开 url,并从带有幻像的网页中获取 javascript 返回值
const phantom = require('phantom');
openUrl = (req, res, next) =>
let url = 'your url goes here';
const content, returnedFromPage = await loadJsSite(url);
return res.json(returnedFromPage);
loadJsSite = async (url) =>
return new Promise( async (resolve, reject) =>
const instance = await phantom.create();
const page = await instance.createPage();
await page.on('onResourceRequested', function(requestData)
console.info('Requesting', requestData.url);
);
const status = await page.open(url);
var returnedFromPage = await page.evaluate(function()
return document.title;
);
const content = await page.property('content');
await instance.exit();
return resolve(content: content, returnedFromPage: returnedFromPage);
)
【讨论】:
【参考方案2】:看来你应该可以使用
var foo = page.evaluate(function()
return window.foo
)
console.log('foo =', foo)
【讨论】:
我应该可以。但是,有一个问题。虽然我可以运行window.foo
,但我无法访问foo.bar
数组,即使在我输入console.log(Object.keys(foo));
时出现bar
。
@TheLegendOfCode 在这种情况下,您上面的示例似乎很糟糕
我将return window.foo
更改为return JSON.stringify(window.foo)
,它说foo.bar
完全是空的。但是,当我将 URL 扔到 google 并在控制台中打印 foo.bar 时,它已经满了。
@TheLegendOfCode 显然在页面初始加载后填充了 foo.bar
数组。就像我说的,你的例子并不代表现实以上是关于使用 PhantomJS 在 HTML 中访问 JS 全局变量的值的主要内容,如果未能解决你的问题,请参考以下文章
使用带有量角器的phantomjs访问iframe中的web元素
使用 javascript (phantomjs) 导航/抓取 hashbang 链接