PythonScript によるファイル上書き保存と、ブラウザ(Firefox)での再読み込み

  1. 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://web.archive.org/web/20171129014322/http://tarunlalwani.com/post/reusing-existing-browser-session-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  |  返信
  2. Kuro 様、フォーラムの皆様 いつもお世話になっております。

    エラーメッセージ 
    PermissionError: [Errno 13]

    を手がかりに検索しましたら、いろいろ情報がありましたので、
    引き続き解決策を探ってみます。

    案外と(いつものことながら)、凡ミスであるかもしれません。

    よろしくお願いいたします。Takeshi でした。

     |  Takeshi  |  返信
スポンサーリンク