10

ウェブページのキーボードイベントをシミュレートするGoogleChrome拡張機能を開発しています。

このWebkitのバグevent.initKeyboardEvent()が原因で正しく機能しないことがわかりました 。また、いくつかの回避策も見つかりました。たとえば、SO Question

ただし、拡張機能のコンテンツスクリプトには独自の「パラレルワールド」があり、コンテンツスクリプトで定義されたプロパティはWebページスクリプトに表示されないため、イベントオブジェクトのプロパティの定義は機能しません。

DOM4イベントコンストラクターがGoogleChromeで機能し、コンストラクターを介してキーボードイベントを適切に初期化できることを願っています。

var event = new KeyboardEvent("keypress", {key: 'U+0041', char: 'a', ... })

残念ながら、次のように失敗します。

TypeError: illegal constructor  

Chromeでサポートされているイベントコンストラクターに関するドキュメントが見つかりませんでした。誰かが私にいくつかのドキュメント/ソースコードを教えてもらえますか?

Google Chrome拡張機能でキーボードイベントをシミュレートする他の方法はありますか?

keydown(注:多くの実際のコントロールは/keyup具体的にリッスンするため、TextEventは役に立ちません)

4

3 に答える 3

11

特定のキーコードでキーアップをトリガーする際に直面した問題が誰かにある場合。これは一方向です。

まず、運が悪かったので、上記の@RobWの答えを試しました。キーコードは渡されず、常に未定義です。

それで私は@disya2の答えを調べましたが、それはうまくいきました。

だからここにいくつかのコードがあります:-

マニフェスト

"permissions": [
    "debugger"
  ],

ContentScript.js

chrome.runtime.sendMessage({ pressEnter: true });

Background.js

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    if(message.pressEnter){
        chrome.tabs.query({active: true}, function(tabs) {
            chrome.debugger.attach({ tabId: tabs[0].id }, "1.0");
            chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyUp', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13  });
            chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyDown', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13  });
            chrome.debugger.detach({ tabId: tabs[0].id });
        });
    }
});
于 2016-01-11T13:39:29.080 に答える
8

コンテンツスクリプトからページに(またはその逆に)イベントを開始するときにChromeはカスタムプロパティを保持しないため、このジョブを引き継ぐためにページにスクリプトを挿入します。これがアイデアを示す基本的な例です。keyおよびkeyCodeプロパティは正しく処理されませんが、使用可能です(とにかく使用しないでください)。

// Example: Say, you've got a reference to a DOM element...    
var elem = document.body;
// And you want to "type" "A"
var charCode = 65;

// Now, you want to generate a key event...
triggerKeyEvent(elem, charCode);

// triggerKeyEvent is implemented as follows:
function triggerKeyEvent(element, charCode) {
    // We cannot pass object references, so generate an unique selector
    var attribute = 'robw_' + Date.now();
    element.setAttribute(attribute, '');
    var selector = element.tagName + '[' + attribute + ']';

    var s = document.createElement('script');
    s.textContent = '(' + function(charCode, attribute, selector) {
        // Get reference to element...
        var element = document.querySelector(selector);
        element.removeAttribute(attribute);

        // Create KeyboardEvent instance
        var event = document.createEvent('KeyboardEvents');
        event.initKeyboardEvent(
            /* type         */ 'keypress',
            /* bubbles      */ true,
            /* cancelable   */ false,
            /* view         */ window,
            /* keyIdentifier*/ '',
            /* keyLocation  */ 0,
            /* ctrlKey      */ false,
            /* altKey       */ false,
            /* shiftKey     */ false,
            /* metaKey      */ false,
            /* altGraphKey  */ false
        );
        // Define custom values
        // This part requires the script to be run in the page's context
        var getterCode = {get: function() {return charCode}};
        var getterChar = {get: function() {return String.fromCharCode(charCode)}};
        Object.defineProperties(event, {
            charCode: getterCode,
            which: getterCode,
            keyCode: getterCode, // Not fully correct
            key: getterChar,     // Not fully correct
            char: getterChar
        });

        element.dispatchEvent(event);
    } + ')(' + charCode + ', "' + attribute + '", "' + selector + '")';
    (document.head||document.documentElement).appendChild(s);
    s.parentNode.removeChild(s);
    // The script should have removed the attribute already.
    // Remove the attribute in case the script fails to run.
    s.removeAttribute(attribute);
}

これは、keypresschar"A"のイベントをトリガーする簡単な例です。より関連性の高いキーイベントをトリガーする場合は、3回使用しないでくださいtriggerKeyEvent(わずかなオーバーヘッドがあるため)。代わりに、正しいパラメーターを使用してすべてのイベント(、、、および/または)を発生さtriggerKeyEventせるように関数を変更してください。keydownkeypresskeyupinput

altKey、などを変更できるようにする必要がある場合shiftKeyは、関数を変更するだけです。
結論:私が示した例は非常に基本的なものであり、ニーズに合わせて調整できます。

続きを読む

仕様に一致するように実装を変更する場合は、次のソースをお読みください。

コンテンツスクリプトでのスクリプトインジェクションの概念について詳しく知りたい場合は、以下を参照してください。

于 2012-12-22T17:29:33.513 に答える
0

Chromeデバッガープロトコルv1.1は、GoogleChrome拡張機能からのキーイベントとマウスイベントをシミュレートするための明確な答えであることがわかりました。プロトコルの一部には、chrome.debuggerAPIを介してアクセスできます。

于 2015-12-22T08:21:27.253 に答える