Javascript Chrome extension每3秒自动单击一个按钮

Javascript Chrome extension每3秒自动单击一个按钮,javascript,google-chrome,Javascript,Google Chrome,我正在尝试构建一个Chrome扩展,每3秒钟自动点击一个按钮 这是我的manifest.json文件: { "manifest_version": 2, "name": "Clicker", "description": "My Clicker", "version": "1.0", "content_scripts": [ { "matches": ["<all_urls>"], "

我正在尝试构建一个Chrome扩展,每3秒钟自动点击一个按钮

这是我的manifest.json文件:

{
    "manifest_version": 2,

    "name": "Clicker",
    "description": "My Clicker",
    "version": "1.0",

    "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "js": ["background.js", "arrive.min.js"]
        }
    ],

    "browser_action": {
        "default_icon": "favicon.ico",
        "default_popup": "popup.html"
    },
    "permissions": ["activeTab", "tabs"]
}

您可能试图在元素存在于dom中之前访问它。我相信像
onload
这样的东西会有所帮助,但是由于现代第三方网站不断地重新绘制dom,你永远不知道当你去寻找它时元素是否准备好了。我喜欢设置一些助手,在指定的时间内轮询所需的元素。下面这两个文件是一个完整的工作扩展,当您访问
stackoverflow.com
主页时,可以自动单击您的第一个
收藏夹标记

编辑:当我第一次发布这篇文章时,我在比赛中加入了“”,但我删除了它,因为它使访问没有用收藏夹标记的问题变得太困难了


manifest.json

favorite.js


你的background.js函数在按钮进入DOM之前被调用了吗?不要认为后台脚本可以与DOM交互。您需要为此使用内容脚本:@Sidney内容脚本和脚本之间有什么区别?@Surreal我不知道后台脚本是在不同的环境中执行的,出于安全原因,您需要在清单中指定权限/设置。要与页面的dom交互,您需要使用类似于此功能的内容脚本。我想我会留下这个扩展安装。哈哈哈。它能用:)我试着像这样编辑清单“匹配”:[“*”]。现在它不断单击元素。如何使它在找到元素后停止单击?这相当复杂。一种可能性是在chrome.storage中存储布尔值。单击前检查布尔值,单击后设置布尔值。然后将消息发送到background.js,指示它监视当前选项卡,每当选项卡不再位于stackoverflow上时,重置存储的布尔值并退出监视。或者观察所有选项卡,直到所有选项卡不再位于stackoverflow上时才重置布尔值。(您可以从内容脚本访问当前的选项卡href,但这不会有帮助,因为当href更改时,窗口会重新加载,您的脚本会被删除。)难道没有更简单的方法吗?我找到了这个方法。我试过了,但它显示了错误:uncaughtsyntaxerror:uncontractedtokentry
{
  "name": "my-favorite",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "Click favorite tag",
  "homepage_url": "https://github.com/skylize",
  "content_scripts": [
    {
      "matches": [
        "https://stackoverflow.com/"
      ],
      "js": ["favorite.js"]
    }
  ]
}
// Helper to promisify waiting with setTimeout
//
function delay (time, ...args){
  return new Promise( resolve=>
    // |0 is just an explicit coercion to int
    setTimeout(()=>resolve(...args), time|0))
}

// Helper to promisify throwing after timeout
//
function timeout (delay, errMsg){
  return new Promise( (r, reject)=> {
    setTimeout( ()=>{
      reject( new Error(errMsg || 'Timed out') )
    }, delay|0)
  })
}

function getElementWhenItExists(selector){
  // flag to end recursive search if timed out
  //
  let keepSearching = true

  // recursively search for element every 100ms
  //
  async function search (){
    const node = document.querySelector(selector)
    if ( !node && keepSearching)
      return await delay(100).then(search)
    return node
  }

  // race search against timeout and return promise with
  //  found node or a timeout error
  //
  return Promise.race([
    search(),
    timeout(10000, `Timed out looking for ${selector}`)
      .catch(e=> {
        keepSearching = false
        throw e
      })
  ])
}

const link = getElementWhenItExists('#interestingTags a')

link.then(a => a.click())