2017-09-08 123 views
-1

我正在嘗試構建一個Chrome擴展程序,該擴展程序每3秒自動單擊一個按鈕。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"] 
} 

這是我background.js文件:

function myFunc() { 
 
\t document.getElementById('hello').click(); 
 
}; 
 

 
setInterval(myFunc, 3000);

這是我使用的網頁試試看:

<button id="hello" onclick="javascript:alert('hello')">Ciao a tutti</button>

不幸的是,瀏覽器給了我這個錯誤:遺漏的類型錯誤:無法讀取屬性空

的「點擊」爲什麼這是不工作?

+0

是你background.js函數被調用之前的按鈕在DOM – Surreal

+1

我不認爲後臺腳本可以與DOM交互。您需要爲此使用內容腳本:https://developer.chrome.com/extensions/content_scripts – Sidney

+0

@Sidney content_scripts和腳本之間有什麼區別? – Floppy88

回答

2

您可能試圖訪問元素,然後它存在於dom中。我相信像onload這樣的東西會對此有所幫助,但是由於現代第三方網站不斷重新繪製dom,所以當您去尋找時,您不知道該元素是否準備就緒。我喜歡設置一些幫助者在指定的時間內輪詢所需的元素。以下2個文件是一個完整的工作擴展,當您訪問stackoverflow.com主頁時,會自動點擊您的第一個favorite tag

編輯:當我第一次發佈這個時,我在比賽中包含了「https://stackoverflow.com/questions」,但是我刪除了它,因爲它太難訪問沒有用最喜歡標籤標記的問題。


的manifest.json

{ 
    "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"] 
    } 
    ] 
} 

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()) 
+0

我有點像這個功能。我想我會離開這個擴展安裝。哈哈哈。 – skylize

+0

它的作品:)我試圖編輯這樣的「匹配」清單:[「https://stackoverflow.com/*」]。現在它不斷點擊元素。如何使它一旦找到元素就停止點擊? – Floppy88

+0

這相當複雜。一種可能性是在chrome.storage中存儲布爾值。在點擊之前檢查布爾值,然後單擊後進行設置。然後發送消息到background.js指示它觀看當前標籤,並且每當tab不再在stackoverflow上時,重置存儲的布爾值並退出觀看。或者,也許看所有的標籤,並不要重置布爾值,直到所有標籤不再在stackoverflow上。 (您可以從內容腳本訪問當前標籤頁href,但它不會幫助,因爲當href更改時,窗口重新加載並且您的腳本被燒燬。) – skylize