【问题标题】:Can't click a button using a Chrome extension, but I can in the developer tools [duplicate]无法使用 Chrome 扩展程序单击按钮,但我可以在开发人员工具中 [重复]
【发布时间】:2016-02-09 16:57:43
【问题描述】:

我正在尝试创建一个 Chrome 扩展程序,其唯一目的是点击 YouTube 视频的点赞按钮。然后,我可以将扩展名映射为快捷键,然后按Alt-L 或点赞视频。

我使用开发者工具找到了按钮的 XPath。

所以,我在扩展中点击按钮的 JavaScript 代码是这样的:

var btn = document.evaluate('//*[@id="watch8-sentiment-actions"]/span/span[1]/button',document, 
    null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
console.log(btn);

console.log("About to click like");
btn.click();
console.log("Just clicked like");

document.evaluate() 实际上找到了按钮。在 Chrome 开发者工具的控制台中,我看到了输出:

<button (all the other button details are printed)...>...</button>
About to click like
Just clicked like

但是,它实际上并没有点击按钮。

但是,如果我在开发者工具的控制台中执行完全相同的代码,它实际上会点击按钮。

任何人都知道为什么它可以在开发者工具的控制台中工作,但不能在扩展程序中工作?

此外,我下载了一个名为Custom JavaScript for Websites 的扩展程序,它将 JavaScript 代码注入网站。我得到了与从扩展执行 JavaScript 相同的结果(正确的输出,但实际上没有单击按钮)。

编辑

由于我无法发布我自己的问题的答案 - 对于遇到类似问题的未来读者,您只需向元素添加一个事件处理程序,然后就可以调用 click()

工作代码是这样的:

// Get the element to click
var btn = document.evaluate('//*[@id="watch8-sentiment-actions"]/span/span[1]/button',document, 
    null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
console.log(btn);

// Attach an event handler to the button
btn.addEventListener('click', function myClick(){
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,
        0, 0, 0, 0, 0, false, false, false, false, 0, null);
});

// Click the button
console.log("About to click like");
btn.click();
console.log("Just clicked like");

【问题讨论】:

  • 我注意到按钮有 onclick=";return false;"您是否尝试过单击作为父级的跨度?
  • @DaveBush jQuery 代码$(btn).parent() 确实返回了span 元素,但不幸的是调用click() 并没有做任何事情:(
  • 我认为这是您的问题 - 如果不是,请随时在此处回复我,我将撤消副本。
  • @Xan 你链接的帖子确实和我有同样的问题;但是,我觉得如果我们应该将人们重定向到重复的问题,我们应该将其重定向到这里,因为这实际上回答并详细解释了问题:stackoverflow.com/questions/26390322/…
  • 这仅在页面获得焦点时有效。当页面没有聚焦时,是否还有一种方法可以使这项工作? (或者我做错了什么?)

标签: javascript xpath google-chrome-extension


【解决方案1】:

可能只有 IE 和 Firefox 有 click() 函数。有一种方法可以通过发送 MouseEvent 来发生点击事件:

var button = document.getElementById("foo_button");
var e = document.createEvent("MouseEvents");
e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
false, false, false, 0, null);
button.dispatchEvent(e);

【讨论】:

  • 谢谢!但这仅在我单击该网站时才有效。还有一种方法是如何在不手动点击进入网站的情况下点击按钮?
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 2015-10-27
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多