前提
JavaScriptの初学者です。
ChromiumであるBrave Browserの拡張機能を作ろうとしたのですが、
思い通りの結果にならず困っております。
実現したい処理というのが、
【拡張機能を起動した時にGoogle翻訳のウェブサイト翻訳機能で現在のURLを翻訳する】
というものです。
現状の問題は、新規タブの要素に値を代入できないことです。
3パターンを試してましたが、エラーの意味がわからず行き詰まっています。
私自身の説明につたないところもあると思いますが、アドバイス頂ければと思います。
実現したいこと
- 拡張機能を起動した時の、現在のタブのURLを取得
 - 新しいタブでGoogle翻訳ウェブサイト翻訳機能のページを開く
 - フォームに取得したURLを入力し、矢印ボタンを押す
 - Google翻訳ウェブサイト翻訳機能のページを閉じる
 
3つ目の 新規タブの要素に値を代入する時に、色々なエラーが起きます。
試したソースコード
JavaScript
1//ソースA 2function ElClick(arg) { 3 console.log(arg); 4 let obj = window.open('https://translate.google.co.jp/?hl=ja&tab=cT&sl=en&tl=ja&op=websites '); 5 let timer = setInterval(function () { 6 if ($("#i44", obj.document) != undefined) { 7 document.getElementById('i44').value = arg; 8 obj.document.getElementsByClassName('VfPpkd-Bz112c-LgbsSe yHy1rc eT1oJ DiOXab zhBWDc Pk9dvb')[0].click(); 9 clearInterval(timer); 10 } 11 }, 500); 12} 13chrome.action.onClicked.addListener((tab) => { 14 const url = tab.url 15 chrome.scripting.executeScript({ 16 target: { tabId: tab.id }, 17 function: ElClick, 18 args: [url] 19 }) 20}) 21 22//ソースB 23function _OnLoad() { 24 console.log(url); 25 document.getElementById('i44').value = url; 26 obj.document.getElementsByClassName('VfPpkd-Bz112c-LgbsSe yHy1rc eT1oJ DiOXab zhBWDc Pk9dvb')[0].click(); 27} 28var readStateCheck = function () { 29 if (obj.document.readyState == "complete") { 30 _OnLoad(); 31 } 32 else { 33 setTimeout(readStateCheck, 100); 34 } 35} 36function _OnClick() { 37 obj = window.open('https://translate.google.co.jp/?hl=ja&tab=cT&sl=en&tl=ja&op=websites '); 38 setTimeout(readStateCheck, 100); 39} 40chrome.action.onClicked.addListener((tab) => { 41 url = tab.url 42 chrome.scripting.executeScript({ 43 target: { tabId: tab.id }, 44 function: _OnClick 45 }) 46}) 47 48//ソースC 49function ElClick(arg) { 50 let obj = window.open('https://translate.google.co.jp/?hl=ja&tab=cT&sl=en&tl=ja&op=websites'); 51 obj.addEventListener('load', function () { 52 console.log(arg); 53 obj.document.getElementById('i44').value = url; 54 obj.document.getElementsByClassName('VfPpkd-Bz112c-LgbsSe yHy1rc eT1oJ DiOXab zhBWDc Pk9dvb')[0].click(); 55 }, false); 56} 57chrome.action.onClicked.addListener((tab) => { 58 const url = tab.url 59 chrome.scripting.executeScript({ 60 target: { tabId: tab.id }, 61 function: ElClick, 62 args: [url] 63 }) 64}) 65
発生している問題・エラーメッセージ
Error
1//ソースA 2Uncaught ReferenceError: $ is not defined 3 4//ソースB 5Uncaught ReferenceError: readStateCheck is not defined 6 7//ソースC 8エラーメッセージはないが、obj.addEventListener();が動かない
補足情報
manifestのバージョンは3で、background.service_workerを使っています。
Uncaught ReferenceError: $ is not defined
これは $("#i44", obj.document) のことだと思われます。これはJavaScriptにそぐわないです。何かを参考にしましたか?
たぶん obj.document.getElementById('i44') に置き換えれば良さそうな気はしますが。
https://honey8823.hateblo.jp/entry/2018/07/30/121744
おっしゃる通り、jQueryの書き方を上記のリンクから真似してしまいました。
置き換えてきます!
先述の通り、
if ($("#i44", obj.document) != undefined) { を
if (obj.document.getElementById('i44') != undefined) {
に 置き換えてきましたが、うまくいきません。
Uncaught TypeError: Cannot read properties of undefined (reading 'getElementById')
    at <anonymous>:5:20
というErrorが新規タブではなく、最初のタブのConsoleで出力されます。
おそらく 新規タブから要素を探すことができていないと考えたのですが、
なにか対処法はありますか?
新しく開かれたタブにスクリプトを挿入すれば、そのスクリプトからそのタブのDOMにアクセスすることが可能になると思います。
ちょうど最近似たような質問に回答したので、その回答が参考になるかもしれません。
https://teratail.com/questions/1h91g27u79z4hv
あ、chrome.scripting.executeScript() は使ってるんですね。ただそこでスクリプトを挿入しているタブは、新しく開いたウィンドウのタブではないのでダメなんだと思います。そのタブからさらに新しいウィンドウをオープンしちゃっているわけですよね。
新しく開くウィンドウのタブにスクリプトを挿入するにはどうすればいいのでしょうか?
以下のようにしているのですが、targetが存在しないというエラーが起きます。
また、 let obj = () => window.open(); を let obj = window.open();にすると、
window is not definedというエラーが起きるのですが、なぜでしょうか?
	let obj = () => window.open('https://translate.google.co.jp/hl=ja&tab=cT&sl=en&tl=ja&op=websites');
	chrome.scripting.executeScript({
		target: { tabId: obj.id },
		function: ElClick,
		args: [arg]
	})
やり方はあると思いますが、それより、DOMアクセス部分についてはバックグラウンドスクリプト(サービスワーカー)ではなくコンテンツスクリプトで動かす方が簡単じゃないですかね。
  "content_scripts": [
    {
      "all_frames": true,
      "matches": ["https://translate.google.co.jp/*"],
      "run_at": "document_end",
      "js": ["./script.js"]
    }
  ],
みたいな感じで。
コンテンツスクリプトを使ってGoogle翻訳に翻訳したいタブのURLを入力する場合、
最初に開いている翻訳したいタブのURLはどのように取得すればいいのでしょうか?
サービスワーカーからコンテンツスクリプトにメッセージを送信することになると思います。
https://developer.chrome.com/docs/extensions/mv3/messaging/
しかし、ちょっと自分でやってみたんですが、なんかうまくいっていません…
回答1件
あなたの回答
tips
プレビュー