2017-09-08 20 views
-1

3秒ごとに自動的にボタンをクリックするChrome拡張機能を構築しようとしています。これは私のbackground.jsファイルです3秒ごとに自動的にボタンをクリックするChrome拡張機能

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

は、これは私のmanifest.jsonをファイルです

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

 
setInterval(myFunc, 3000);

そして、これは私が使用しているページですそれを試してください:

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

残念ながら、Chromeは私に、このエラーを与える:キャッチされない例外TypeErrorを:これは動作しないのはなぜ

ヌル

の「クリック」プロパティを読み取ることができませんか?

+0

ボタンは私がいないDOM – Surreal

+1

である前に、あなたのbackground.js関数が呼び出されていますバックグラウンドスクリプトがDOMとやり取りできると考えてください。コンテンツスクリプトを使用する必要があります:https://developer.chrome.com/extensions/content_scripts – Sidney

+0

@Sidney content_scriptsとスクリプトの違いは何ですか? – Floppy88

答えて

2

DOMに存在する前に要素にアクセスしようとしている可能性があります。 onloadのようなものがこれを助けてくれると確信していますが、現代のサードパーティーのWebサイトは絶えず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

これはかなり複雑です。 1つの可能性は、chrome.storageにブール値を格納することです。クリックする前にブール値をチェックし、クリックした後にブール値を設定します。 background.jsにメッセージを送信して、現在のタブを表示するように指示し、タブがstackoverflowになくなったときはいつでも、格納されているブール値をリセットしてウォッチを終了します。または、すべてのタブがスタックオーバーフローしなくなるまで、すべてのタブを監視し、ブール値をリセットしないでください。 (コンテンツスクリプトから現在のタブhrefにアクセスすることはできますが、hrefが変更されるとウィンドウが再読み込みされ、スクリプトがヌークになるので役に立ちません) – skylize

関連する問題