seleniumを使用してWeb情報取得、操作を行っている場合に必要となることの1つにフレーム間移動があります。
Webサイトがフレーム構造となっており、親フレーム、子フレームなどの階層構造になっている場合があります。
そのような場合に該当する要素の情報取得や操作を行う場合には、その要素が存在しているフレームまで移動してから取得、操作を行う必要があります。
フレーム切り替えの例を以下に説明します。
目次
1.子フレームへの移動
フレーム切り替えを行う場合には、「switch_to.frame()」を使用します。
たとえば、以下のように記載することで、現在の位置から「frame_a」という名前の子フレームへ移動、切り替えをすることができます。
driver.switch_to.frame(driver.find_element(By.NAME,"frame_a"))
2.子フレームへの移動(指定時間待機)
また、フレーム切り替えの場合には切り替え指定をしてもすぐにはフレームが切り替わらず切り替えに時間がかかる場合があります。
フレームを移動しきらないうちに要素取得など次の操作を行おうとすると、そのような要素はないというようなエラーが発生します。
そのような場合には、以下2行のように記載することで、子フレームへ移動する場合に最大で指定した秒数待つことが出来ます(上記の場合は10秒)。
#指定したdriverに対して最大で10秒間待つように設定する wait = WebDriverWait(driver, 10)
#指定されたフレームが利用出来るまで待機する wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "frame_a")))
3.インデックス指定による子フレームへの移動
もう1つのフレーム切り替え方法なのですが、フレームにnameやidなどの識別できる情報がない場合もあると思います。
このような場合に指定する方法としては、フレームのインデックスで指定する方法があります。
配置されているフレーム自体には先頭から順にインデックスがふられていますので、これを利用して指定する方法になります。
1つ目のフレームを指定する場合は以下のようにインデックスとして「0」を指定します。
# switching to first frame based on index frame_wk = driver.find_elements(By.TAG_NAME,'frame')[0]
同様に、2つ目を指定する場合は以下のように「1」を指定します。
# switching to first frame based on index frame_wk = driver.find_elements(By.TAG_NAME,'frame')[1]
これらを利用して対象フレームを指定した後、以下のように「switch_to.frame()」などでフレーム移動を行います。
# switching to first frame based on index frame_wk = driver.find_elements(By.TAG_NAME,'frame')[0] # switch to selected frame driver.switch_to.frame(frame_wk)
4.親フレームへの移動
子フレームへ移動した後などに元の親フレームへ移動したい場合には、以下のように記載します。
このように記載することで現在のフレーム位置から親フレームへ移動することが出来ます。
#親フレームに戻る driver.switch_to.parent_frame()
5.フレーム切り替え例
以上のような内容でいろいろなパターンでのフレームの切り替えを行いますが、最後にそれらを使用した例を1つ載せておきます。
from selenium import webdriver from selenium.webdriver.chrome import service as fs import os : : : path_driver = os.getcwd()+'\chromedriver.exe' # ドライバー指定でChromeブラウザを開く chrome_service = fs.Service(executable_path=path_driver) driver = webdriver.Chrome(service=chrome_service)
#「frame_a」へのフレーム切り替え
driver.switch_to.frame(driver.find_element(By.NAME,"frame_a"))
この例では、まずはじめに必要なもののインポートをしています。
上の例では、その後にChromeのドライバー指定の例を載せています。
3行目のインポート文を記載したうえで、os.getcwd()にて、カレントディレクトリ指定をしており、カレントディレクトリにchromedriver.exeが入っているとした場合のchromedriver指定となっています。
カレントディレクトリ取得に関しては、以下の過去記事にも簡単な例を載せています。
最後のdriver.switch_to.frame(driver.find_element(By.NAME,"frame_a"))でフレーム切り替えを行っています。
以上が、Seleniumによるスクレイピングでのフレーム切り替え方法の例になります。
また、PythonにてSeleniumを活用してスクレイピング、RPA化などを行っていく場合に必要となりそうな内容の記事を一覧として以下にまとめましたのでよかったらご参照ください。
関連記事:
【selenium 備忘録】ボタンクリックで複数の新規ウインドウを開いた時新規ウインドウをアクティブにできなかった場合の対処方法例 - Django Girls and Boys 備忘録
【python】実行ファイル(EXEファイル)作成手順 - Django Girls and Boys 備忘録
【Python カレントディレクトリ取得】Excelファイル指定を使った簡単な例記載 - Django Girls and Boys 備忘録
【Pythonでopenpyxlを使用したExcelファイルの読み書き方法】xlsmファイル(マクロありファイル)の場合 - Django Girls and Boys 備忘録
【PythonでのExcelファイル読み書き方法】ファイルオープンしているファイル(アクティブファイル)への書込方法 - Django Girls and Boys 備忘録
【Python Selenium】Webサイトのスクレイピングなどで必要なフレーム間移動方法 - Django Girls and Boys 備忘録
【PythonからWeb操作】selenium、各ブラウザ用ドライバーの最新バージョン確認、ダウンロード場所 - Django Girls and Boys 備忘録
【Python Selenium】ブラウザ用ドライバーのダウンロードとインストール - Django Girls and Boys 備忘録
【Python Selenium】ブラウザ用ドライバーのインストール、設定とWebサイトへのアクセス方法 - Django Girls and Boys 備忘録