【问题标题】:Simulate human click in JavaScript在 JavaScript 中模拟人工点击
【发布时间】:2011-09-17 20:34:06
【问题描述】:

我有一个小爬虫,我需要在其中使用 JavaScript 单击锚链接。我尝试了几种方法:jQuery.click()document.createEvent('MouseEvents') 等。它们都可以正常工作,但是它们并没有像人工点击那样完全执行(它们会像应该那样打开一个标签,但不会开始下载) .

锚标签有这个属性:

onclick="if (document.getElementById('ReportViewer_ctl01_ctl05_ctl00').selectedIndex == 0) return false; 
if (!ClientToolbarReportViewer_ctl01.HandleClientSideExport()) __doPostBack('ReportViewer$ctl01$ctl05$ctl01','');return false;"

我也尝试在命令行中解决这个问题:

 __doPostBack('ReportViewer$ctl01$ctl05$ctl01','')

这也有点作用,但不完全像人工点击。

如果需要,我可以详细介绍,但目前我正在寻找我认为应该存在的灵丹妙药。

【问题讨论】:

  • 为什么不使用PHP cURL 访问所需的uri(如果您使用PHP 作为服务器端语言)?
  • 我认为这种差异有一个基于安全的故意原因;似乎是为了防止偷渡式下载/ EULA 接受等。虽然我可能很可怕,hideously 错了。
  • @yoda 谢谢,不使用 php,它是杂乱无章的东西。这个链接实际上是提交一个表单来模拟下载。
  • @beck 那么你是如何在页面上注入 javascript 的呢?提及与主题相关的所有内容总是有用的。
  • this also sort of works but not fully like a human click. - 你能解释一下你所说的“某种作品”是什么意思吗? b/c 这种方法应该可行。

标签: javascript web-crawler web-scraping


【解决方案1】:

我保存了一个保存有两种编程方式的 pastebin。只有当谷歌决定剥离窗口对象(以及所有其他对象)的默认功能时,我才失败过>.>

http://pastebin.com/VMHvjRaR

function callClickEvent(element){
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent("click", true, true); 
    element.dispatchEvent(evt);
}

function callClickEvent2(element){
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
    element.dispatchEvent(evt);
}

callClickEvent(document.getElementById("myElement"))
callClickEvent2(document.getElementById("myElement"))

MDN 文档:

【讨论】:

  • 现场演示 1: jsfiddle.net/fCbMY(适用于当前所有浏览器;不适用于 IE8,因为 IE8 不实现 DOM 事件)
  • 现场演示 2: jsfiddle.net/fCbMY/1(同样适用于所有当前浏览器;不适用于 IE8)
  • @Joseph Marikle 您能否更新答案,因为现在现代浏览器能够区分人工点击和模拟/触发/调度事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多