Javascript Chrome extension每3秒自动单击一个按钮
我正在尝试构建一个Chrome扩展,每3秒钟自动点击一个按钮 这是我的manifest.json文件: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>"], "
{
"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())