WinActor ver7.5.0 「Python実行」を使ってみました ーブラウザ操作編ー
はじめに
前回のコラムでは、WinActorで「Python実行」ノードを扱うための基礎知識と簡単な作成例(Excelの印刷「ページ設定」のタイトル行を設定する処理)について解説しました。今回は作成例第2弾として、「23_ブラウザ関連」では実現できない、かつ従来の実装方法(画像マッチング)では安定させるのが難しいブラウザ上でのドラッグアンドドロップ操作 ― 例えばOneDrive上でのファイル移動を「Python実行」ノードで実現できるか検証しました。
結論として、ドラッグアンドドロップ操作自体は可能であるものの、後述の「検証したこと」の通りWinActorのライブラリで起動したブラウザを「Python実行」ノードで操作できないことが分かりました。
WinActorと「Python実行」ノードでブラウザを共用できないため、「Python実行」ノードで全てのブラウザ操作を完結させる必要があります。(後述の「作成例紹介」のスクリプトはブラウザ起動~ブラウザ上で実現したい全ての操作を記述しています)
ブラウザ操作を行うシナリオにおいては、「23_ブラウザ関連」の部品と「Python実行」ノードを併用することができず、Pythonコードでスクラッチ開発するようなイメージになり、ローコード開発ではなくなってしまいます。
そのため、WinActorの標準部品で実現できない操作を補うという位置づけでの活用は期待できません。
Python実行はシナリオ作成の自由度を高める新機能ですが、ブラウザ操作については注意が必要です。このコラムでは使い方の注意を、Python実行ではできないことも含めて解説します。
目次:
検証したこと
Python実行によるブラウザ上でのドラッグアンドドロップ操作の検証に伴い、WinActorで起動したブラウザに対して「Python実行」ノードで操作可能か、もしくは「Python実行」ノードで起動したブラウザをWinActorのブラウザ操作系ライブラリで操作が可能か検証したので、その結果を記載します。
目的 | 検証内容 | 結果 | 解説 |
「ブラウザ起動」で起動した
ブラウザを「Python実行」ノードで処理できるか確認する |
「ブラウザ起動」ライブラリで起動したブラウザ(ブラウザ名)をパラメータとしてPythonに渡す | × | ブラウザ名をPythonにパラメータとして渡すことはできない。WinActorの内部のメソッドがわからないため確証を得ないが、ブラウザ名はWinActor独自の実体と推測されるため、これをPythonで処理できるインスタンスに変換することも難しそう。 |
「ブラウザ起動」ライブラリで起動したブラウザのポート番号をWinActorで取得し、「Python実行」ノードで起動済みのブラウザ(ポート番号指定)を操作する
・WinActorでポート番号を指定してブラウザ起動し、「Python実行」ノードで起動済みのブラウザ(ポート番号指定)を操作する |
× | ・WinActorでブラウザのポート番号を取得(指定)することは難しいと思われる。また、WinActorのブラウザオプションを「WebDriver」方式で操作するには「ブラウザ起動」など標準部品で起動したブラウザに対してのみ可能であるため、WinActorのブラウザオプションを「WebDriver」方式にして操作することはできない。 ・Python実行ではポート番号を取得することはできそうだが、1つのブラウザに対して複数のポート番号が取得されてしまうため、操作したい起動済みブラウザのポート番号を特定できるかどうか検証する必要がある。 |
|
PythonでインポートされるWebDriverはWinActorの既定の場所にあるWebDriverと異なるため、「Python実行」ノードのスクリプト内のWebDriverのパスをWinActorで使用しているWebDriverのパスに設定してブラウザを起動し、WinActorのブラウザ操作系ライブラリを実行する | × | 「ブラウザ起動」で起動したブラウザを「Python実行」ノードで処理できるようにはならなかった。 | |
「Python実行」ノードで起動したブラウザを「23_ブラウザ関連」のブラウザ操作系ライブラリで操作できるか確認する | ブラウザオプションを「拡張機能」方式に設定し、「Python実行」ノードで起動したブラウザのウィンドウ識別名を指定した「ブラウザクローズ」や「クリック」ライブラリを実行 | × | WinActorのブラウザ操作系ライブラリで実行エラーが発生。 |
作成例紹介
上の表の通りWinActorで起動したブラウザに対して、「Python実行」ノードでブラウザ操作するのは難しいですが、「Python実行」ノードでブラウザ起動からブラウザ操作処理を完結させることによってドラッグアンドドロップを行うことは可能でしたので、ここからは「Python実行」ノードでブラウザ操作するための事前作業やスクリプトの作成例についてご説明します
・Python実行の事前作業
前回と同様、WinActorに同梱されているPythonのライブラリでは実現できない操作のため、外部ライブラリが必要です。今回は以下のように【selenium】をインストールします。
py -m pip install selenium - - user
※PythonのインストールとWinActorのオプション設定の手順は、前回コラムをご参照ください。
・実際の作成例
「Python実行」ノードのスクリプトの作成・実行手順はこちらをご参照ください。
作成例として、ブラウザでOneDriveのページを開き、ファイルをドラッグアンドドロップで別フォルダに移動する処理についてご紹介します。
(スライドを進めながらご覧ください)
↓スクリプト例↓
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.edge.options import Options
import time
import ctypes
# メッセージボックスの定数
MB_OK = 0
MB_ICONINFORMATION = 0x40
# Optionsオブジェクトでブラウザが閉じないように設定
edge_options = webdriver.EdgeOptions()
edge_options.use_chromium = True
edge_options.add_experimental_option("detach", True)
# Edge Webドライバーのインスタンスを生成
driver = webdriver.Edge(options=edge_options)
# 対象のURLを開く
driver.get(!URL!)
# ドラッグする要素とドロップ先の要素のビジュアルテキストを指定
drag_element_name = !ドラッグ元ファイル名!
drop_element_name = !ドロップ先フォルダ名!
try:
# テキストを含む要素を取得
element1 = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, f"//*[contains(text(), '{drag_element_name}')]"))
)
element2 = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, f"//*[contains(text(), '{drop_element_name}')]"))
)
# アクションチェーンを作成
actions = ActionChains(driver)
# ドラッグアンドドロップを実行
actions.drag_and_drop(element1, element2).perform()
except TimeoutException:
# 要素が見つからなかった場合、メッセージボックスを表示
ctypes.windll.user32.MessageBoxW(0, "要素が見つかりませんでした", "タイトル", MB_OK | MB_ICONINFORMATION)
finally:
# 少し待機してからブラウザを閉じる
time.sleep(10)
driver.quit()
最後に
前回コラムの続編として、今回はブラウザ操作における「Python実行」ノードの活用について検討しました。
標準部品の「23_ブラウザ関連」と組みあわせて「Python実行」ノードを利用することはできませんでしたが、ブラウザ起動からブラウザ操作の一連の処理を「Python実行」ノードによって実装することは可能でした。
標準部品と「Python実行」ノードを組みあわせることができれば、クリック操作や値の設定・取得はWinActorの標準部品で実装し、ドラッグアンドドロップはPythonで処理をするといった使い分けが可能になり、今回のように「Python実行」ノードだけでブラウザ操作させる必要がなくなるため、今までと同様の作業効率を維持しながら自動化の幅を広げてシナリオ開発ができるようになります。将来のWinActorのバージョンアップに期待したいと思います(WinActorでポート指定してデバッグモードでブラウザ起動できるようになれば、「Python実行」ノードでのブラウザ操作も可能になるかもしれません)。
今回は「Python実行」ノードでのブラウザ操作について、敢えてできないことも含めてご紹介しました。今後もWinActorに関する機能や詳しい使い方のご紹介をできればと思います。WinActorの開発については、お気軽にお問い合わせください。
本記事のカテゴリ :RPA技術コラム
PickUP
本記事に関連するCACのサービスやお役立ち情報をご紹介します。