🪟

コマンドプロンプトから開いたブラウザをwindow.close()したい!

2024/01/17に公開

概要

とある案件でコマンドプロンプトで開いたブラウザをjavascript(以下js)で閉じたいという要望があり、
少し苦闘したので共有したいと思います。

結論

踏み台のサイトを使って開きたいサイトを「window.open()」で呼ぶ

対象の読者

コマンドプロンプトで開いたブラウザをjsを使って閉じたい人

window.close()って?

javascriptのグローバルオブジェクトである「window」にはブラウザを閉じる「window.close()」メソッドがあります。

ただしwindow.close()は特定の条件を満たした場合のみ処理を実行できます。
サイトを開いたらいきなりブラウザが閉じるなんてテロもいいとこなんで当然なんですけどね。

MDNにも太字で書かれていますし、コンソールにもスクリプトで開いた場合しか閉じれないやで〜ってでます。
https://developer.mozilla.org/ja/docs/Web/API/Window/close

ちなみに下記の記事で知ったのですが
「履歴が1つしかないトップレベルブラウジングコンテキストの場合」でも閉じれるようです。
https://qiita.com/heppokofrontend/items/2aaf2c0ca1ce37aa4c45

コマンドプロンプトからブラウザを開くには

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --kiosk "http://abehiroshi.la.coocan.jp/"

startコマンドでもいいようですが今回は直接exeを叩いて起動。
startはデフォルトのブラウザ開いちゃうので。

エンドユーザーから見てツールバーや閉じるボタンが見えるのは不都合のため、
キオスクモードを採用していました。

キオスクモードを採用したら基本的に「Alt+F4」などでしか閉じれなくなるので、
jsでブラウザを閉じる必要がありました。

・・・が、コマンドプロンプトから開く処理はjsから呼び出したわけではないので閉じれません
\(^o^)/

踏み台サイトを作って解決

踏み台という表現があっているか分かりませんが、
「呼び出したいサイトを呼ぶサイトを作る」 ことで解決しました。

どういうことか順序立てて説明します。
1.踏み台サイトをコマンドプロンプトから呼び出す

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --kiosk "http://humidai.com/"

2.踏み台サイトから呼びたいWebサイトを呼び出す

踏み台.vue
<script setup>
// DOM生成前に初期処理が走る
window.open("http://honban.com/");
window.close();
</script>

<template>
</template>

これによって2つのサイトが下記のようになり閉じることができます。
・呼び出したいサイト → スクリプトから呼んだページなので閉じれる!
・踏み台サイト → 履歴が1つのトップレベルブラウジングコンテキストなので閉じれる!

以上!でわでわー。

追記:過去にキオスクだと新しいブラウザが立ち上がると書いていましたが、改めて確認すると立ち上がりませんでした。
原因は「-app」というオプションを付けていたためでした。

Discussion