PhantomJS - 从单击事件加载的内容不会加载到 DOM
PhantomJS - content loaded from click event does not load to DOM
我想测试锚标签上的点击事件触发正确的 DOM 转换。 我在浏览器中看到的内容有效,并且我几乎检查了代码的每一行返回我想要的内容,除非我让PhantomJS执行此操作,预期的DOM转换似乎不会触发。
这是我的代码:
page.open(url, function(status) {
if (status === "success") {
var specifications = page.evaluate(function() {
var a = document.querySelector("a[href='#Specifications']");
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
return document.querySelector("div#Specifications").innerHTML;
});
console.log(specifications);
phantom.exit()
} else {
phantom.exit(1);
});
});
我最初只是打电话给document.querySelector("a[href='#Specifications']").click();
,结果相同。 在我的 Web 浏览器中,单击该链接会触发 DOM 转换。 但是,我无法在PhantomJS中重现它。
因此,在花了很多时间弄清楚发生了什么之后,这里有一些建议给遇到类似问题的人。
首先,确保您的选择器不是问题所在。 就我而言,我决定坚持使用文档API。 与某些人所说的发送点击事件不同,以下内容工作正常:
document.querySelector("a[href='#some_section']").click();
你也应该能够将jQuery与page.includeJs()
一起使用。
确保在使用如下所示的onResourceRequested
和onResourceReceived
调用click()
后请求和接收页面资源:
page.onResourceRequested = function(data, request) {
console.log("phantomJS: resource requested: " + data.url);
};
page.onResourceReceived = function(response) {
console.log("phantomJS: resource received: " + response.url);
};
最后,确保是否正在评估在收到资源后完成的单击事件后需要插入的某些值。 我最终做的是:
setTimeout(function() {
var data = page.evaluate(function() {
return document.querySelector('div#InsertDiv').innerHTML;
});
console.log(data);
phantom.exit();
}, 2000);
基本上,如果正在请求外部资源,则必须为其设置异步等待时间。
相关文章:
- 加载dom后禁用媒体查询
- angularjs-bindng-click从jquery动态加载DOM
- 向使用jQuery加载DOM后添加的字段添加不受限制的文本输入DatePickers
- chrome扩展在加载dom之前注入动态css
- 删除在加载dom之后创建的动态元素
- 在完全加载 DOM 之前更改 DOM 的方法
- 加载 DOM 并使用 .Net 在服务器端执行 javascript
- 加载 DOM 后无法读取动态创建的复选框的属性
- getElementById 在加载 dom 后返回未定义
- 在完全加载DOM之前隐藏父元素
- jQuery在完全加载DOM后严格执行操作
- 使用ng视图属性时不加载DOM元素
- 如何在加载DOM元素后立即获取该元素
- 替换jquery's仅在加载DOM功能后运行
- JavaScript模糊事件不适用于加载DOM后添加的项
- 阻止加载DOM对象
- 如果在加载DOM时找不到javascript库,我该如何动态更改它
- 加载DOM后,如何使用jQuery从Select输入中获取值
- 如何在加载DOM之前开始加载iframe
- 加载dom后,使用jquery更改js代码