6

ブラウザの自動化スクリプトから Chrome 拡張機能に値を送信する必要があります。私が現在試みている方法は、セレンからchrome.runtime.sendMessage APIを呼び出して、何らかの値をクロム拡張機能に伝達しようとすることです。Pythonコードは次のとおりです。

import os
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options



chrome_options = Options()
chrome_options.add_extension('/home/lurscher/plugin.crx')
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get(url)
browser.execute_script("chrome.runtime.sendMessage({someValue: "+str(args.value)+"}, function(response) { console.log('value sent. '+response)})")

次のエラーが表示されます。

Traceback (most recent call last):
  File "tools/selenium/open_page.py", line 17, in <module>
    browser.execute_script("chrome.runtime.sendMessage({someValue: "+str(args.value)+"}, function(response) { console.log('value sent. '+response)})")
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 397, in execute_script
    {'script': script, 'args':converted_args})['value']
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 165, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 164, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u"unknown error: Cannot call method 'sendMessage' of undefined\n  (Session info: chrome=28.0.1500.71)\n  (Driver info: chromedriver=2.1,platform=Linux 3.5.0-17-generic x86_64)" 

質問: 私が間違っていることは何ですか?

ブラウザの自動化スクリプトから Chrome 拡張機能に値を送信する必要があります。どうすればいいのですか?

4

4 に答える 4

1

これを実行すると同様のエラーが発生しました: (JavaScript)

this.driver.executeScript(function () {
    chrome.runtime.sendMessage('start');
});
WebDriverError: unknown error: Cannot read property 'sendMessage' of undefined

chrome.runtime拡張機能を開発している場合でも、単に Web を閲覧している場合でも、いつでも利用できるように思えます。(シークレット ウィンドウを開き、コンソールで評価します。そこにあります。)したがって、WebDriver と関係があるはずです。

インターウェブで収集できたものから、ドライバーを追加構成する必要があります: https://groups.google.com/forum/#!topic/chromedriver-users/7wF9EHF2jxQ

options.excludeSwitches('test-type'); // this makes chrome.runtime available
builder.setChromeOptions(options);

ただし、これにより、上記のエラーが次のように発展します。

WebDriverError: unknown error: Invalid arguments to connect.

これは、テスト ページが、マニフェストでそのページを宣言しない限り、Chrome の仕様に従って許可されていない拡張機能と通信しようとしているためです。例えば:

"externally_connectable": {
    "matches": [
    "http://localhost:8000/mytest.html”
    ]
}

ただし、sendMessage 呼び出しに拡張 ID を含める必要があります。

this.driver.executeScript(function () {
    chrome.runtime.sendMessage('kjnfjpehjfekjjhcgkodhnpfkoalhehl', 'start');
});

少し厄介だと思います。

コンテンツ スクリプトには外部ページに課せられる制限がないため、コンテンツ スクリプトを使用して sendMessage 呼び出しをプロキシするという MGR の提案に沿ったものをお勧めします。

私がしたことは、sendMessage 関数呼び出しを行うコンテンツ スクリプトによってピックアップされるテストからのイベントをトリガーすることでした。

あなたのテストでは:

this.driver.executeScript(function () {
    var event = document.createEvent('HTMLEvents');
    event.initEvent('extension-button-click', true, true);
    document.dispatchEvent(event);
});

マニフェストでコンテンツ スクリプトを宣言します。

"content_scripts": [
    { "matches": ["<all_urls>"], "js": ["content_script.js"] }
]

そして content_script.js では:

document.addEventListener('extension-button-click', function () {
    chrome.runtime.sendMessage('start');
});

それが役に立てば幸い

于 2016-07-24T16:50:59.320 に答える
0

例外メッセージにあるように、Cannot call method 'sendMessage' of undefined. chrome.runtimecall はクロム拡張機能のコンテキストでのみ呼び出され、実行されたコードはexecute_scriptページのコンテキストにあるようです。

于 2013-10-16T03:20:36.757 に答える
0

あなたのセレンPythonコードから私が理解している限り、データをGoogle Chrome拡張機能に送信したいと考えています。それは不可能。権限がありません。Chrome では許可されません。たとえば、id = 'message' の要素などの非表示の html 要素を作成し、データ属性または要素の値としてパラメーターを送信する場合を除きます。そして、ページが読み込まれた後にページに挿入されるコンテンツ スクリプトを Google Chrome 拡張機能で作成します。コンテンツ スクリプトがページに挿入された後、指定された ID からパラメーターを取得できます。

于 2013-10-24T09:13:15.207 に答える