👌

seleniumの証明書提出

2022/08/28に公開

内容

ダウンロードや証明書提出など、一部の処理はブラウザ処理ではないため、seleniumで操作できない
マウス操作などで設定していかないと、seleniumは待ち状態になる
これらを自動化するために

  • pythonで直接windowsを操作する
  • スレッド処理を使用し、seleniumとwindows操作を並列させる

今回はpyautoguiという操作ライブラリを使用
画像を認識し、位置情報を取得できるため、大変便利

PyAutoGui

概要

win32apiというwindows操作APIのラッパ
pythonからwindows操作が可能になる

公式ドキュメント
https://pyautogui.readthedocs.io/en/latest/

準備

pip install pyautogui

python (自身の環境を確認、↓ならAMD64bit)
    Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.

https://github.com/mhammond/pywin32/releases
上記から自身の環境にあったものをインストール

注意)pip経由のインストールもできるが、実験中、らしい

pip install pywin32

コード

#################################
#   pki edge click              #
#################################
def pki_edge(self, pattern):
    result = True
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
        futures = []
        futures.append(executor.submit(self.__pki_edge_pyautogui, pattern))
        futures.append(executor.submit(self.__pki_edge_selenium, pattern))
        for future in concurrent.futures.as_completed(futures):
            result &= future.result()

    return result

#################################
#   pki edge selenium           #
#################################
def __pki_edge_selenium(self, pattern):
    # edge
    if self.__driver.title == "証明書エラー: ナビゲーションはブロックされました":
        ok_flg, elm = self.__get_element("moreInformationDropdownSpan")
        if ok_flg:
            elm.click()

        ok_flg, elm = self.__get_element("invalidcert_continue")
        if ok_flg:
            elm.click()

    return ok_flg

#################################
#   pki edge pyautogui          #
#################################
def __pki_edge_pyautogui(self, pattern):
    ok_flg = True

    cmd = pattern[len("pki_"):len(pattern)]

    if cmd == "ok":
        ok_flg, pos = self.__get_position("img/ms-ok.png")
        if ok_flg:
            # move & click
            pyautogui.moveTo(pos.x, pos.y, 1)
            pyautogui.click()

    elif cmd == "cancel":
        ok_flg, pos = self.__get_position("img/ms-cancel.png")
        if ok_flg:
            # move & click
            pyautogui.moveTo(pos.x, pos.y, 1)
            pyautogui.click()

    else:
        ok_flg, pos = self.__get_position("img/ms-next.png")
        if ok_flg:
            # move & click
            pyautogui.moveTo(pos.x, pos.y, 1)
            pyautogui.click()

            # move & click
            num = int(cmd) + 1
            pyautogui.moveTo(pos.x, pos.y + (60 * num), 0.2)
            pyautogui.doubleClick()

            ok_flg, pos = self.__get_position("img/ms-ok.png")
            if ok_flg:
                # move & click
                pyautogui.moveTo(pos.x, pos.y, 0.2)
                pyautogui.click()

    return ok_flg

Discussion