PythonScript によるファイル上書き保存と、ブラウザ(Firefox)での再読み込み
-
Kuro 様、フォーラムの皆様 いつもお世話になっております。
Mery(64bit, Ver 2.6.7, Windows10 Pro, Ver 20H2) にて、HTML ファイルを編集しております。
現状では、編集が済んだら Ctrl + S を押し、すでに外部ツールに登録してあるFirefox のボタンをクリックし、ブラウザのウィンドウに移ってから、Ctrl + R を押してファイルを再読み込みさせています。
しかし、あまりにも頻繁に行っていますので、何とかキー1発でできないものかと考えました。以下の処理をマクロで実行出来たらなぁ.....と思っています。
1.Mery にて、編集したHTMLファイルの上書き保存(Ctrl + S)。
2.すでに立ち上げてあるブラウザ(Firefox Ver 91.0, 64bit)へ移る。
3.編集前のHTMLファイルが表示されているブラウザで
再読み込みさせる。(Ctrl + R)と同じ操作。とりあえず、かじり始めた Python(Ver 3.8.3)及び selenium モジュールを使ってスクリプトを書いてみました。
参考にしたのは、下記のブログ、フォーラムです。https://stackoverflow.com/questions/8344776/can-selenium-interact-with-an-existing-browser-session
数日取り組んでいましたが、エラーが修正できず、焦ってきたので、AutoHotkey でもできるのでは? と思い出し、今日の昼休みにやってみたところ、実質10行くらいで出来ました。(いろいろなサイトを参考にしてですが)
実用的には AutoHotkey で問題無いのですが、ちょっと後味が悪いので、もしどなたか Python や selenium モジュール、また、JavaScript でも selenium モジュールが使えるそうなので、詳しい方がおられましたら、どうしようもなくお暇な時にでもコメントいただければ幸いです。
以下に、PythonScript のコードと、表示されたエラーを書いておきます。# Python on Mery Test --------------- 2021/08/18 from selenium import webdriver # ---------------------------------------- Python スクリプトの動作確認 a = 1 if a == 1: window.alert("mery") else: window.alert(a) # ---------------------------------------- ファイルの上書き保存 window.document.Save() # ---------------------------------------- 編集中ファイルのフルパス取得 window.document.CopyFullName(); editingFilePath = window.ClipboardData.GetData(); window.alert(editingFilePath) # ---------------------------------------- ページを更新(ブラウザのリフレッシュ) driver = webdriver.Firefox() executor_url = driver.command_executor._url session_id = driver.session_id driver.get(editingFilePath) window.alert(session_id) window.alert(executor_url) def create_driver_session(session_id, executor_url): from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver # Save the original function, so we can revert our patch org_command_execute = RemoteWebDriver.execute def new_command_execute(self, command, params=None): if command == "newSession": # Mock the response return {'success': 0, 'value': None, 'sessionId': session_id} else: return org_command_execute(self, command, params) # Patch the function before creating the driver object RemoteWebDriver.execute = new_command_execute new_driver = webdriver.Remote(command_executor=executor_url, desired_capabilities={}) new_driver.session_id = session_id # Replace the patched function with original function RemoteWebDriver.execute = org_command_execute return new_driver driver2 = create_driver_session(session_id, executor_url) window.alert(driver2.current_url)
すると、Mery から、以下のようなエラーが返ってきました。
Traceback (most recent call last): File "<Script Block >", line 24, in <module> driver = webdriver.Firefox() File "C:\Users\takes\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line 160, in __init__ self.service = Service( File "C:\Users\takes\AppData\Local\Programs\Python\Python38\lib\si te-packages\selenium\webdriver\firefox\service.py", line 44, in __init__ log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None PermissionError: [Errno 13] Permission denied: 'geckodriver.log' 行: 24 文字 : 1
エラーの発生しているカ所は、
driver = webdriver.Firefox()
という行のようです。そこまでに処理している、Python スクリプトの動作確認 ~ 編集中ファイルのフルパス取得
までは上手く動いています。Permission denied: 'geckodriver.log'
とのエラーなので、geckodriver.exe の置き場所が悪いのか、Windows10 の環境変数の設定で、Path が
正しく設定されていないのか、とも考えています。この PythonScript ファイル、geckodriver.exe、geckodriver.log は同じフォルダに入っています。
Mery のマクロメニューから、選択(L)..... でPythonScript ファイルを指定して実行しています。geckodriver.log を開いてみましたが、作成日付が昨日のままで、新しい情報は記録されていないようでした。
それから、Mery からの PythonScript としてではなく、Python 単体のプログラムとして IDLE から実行し、selenium や BeautifulSoup モジュールを使う場合には、問題無く動作しています。
よろしくお願い申し上げます。
| Takeshi | 返信 -
Kuro 様、フォーラムの皆様 いつもお世話になっております。
エラーメッセージ
PermissionError: [Errno 13]を手がかりに検索しましたら、いろいろ情報がありましたので、
引き続き解決策を探ってみます。案外と(いつものことながら)、凡ミスであるかもしれません。
よろしくお願いいたします。Takeshi でした。
| Takeshi | 返信