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つ載せておきます。
(selenium ver.4.6以降の場合)
from selenium import webdriver
from selenium.webdriver.common.by import By
######################################################################
driver = webdriver.Chrome() ######################################################################
#URL指定での画面表示
driver.get('https://abcdefghijklmn') #「frame_a」へのフレーム切り替え
driver.switch_to.frame(driver.find_element(By.NAME,"frame_a"))
この例では、まずはじめに必要なものとしてwebdriverをインポートし、その後にChromeのドライバー設定をしています。
その次のdriver.get()で「https://abcdefghijklmn」というURL指定での架空の画面を表示しています。
最後のdriver.switch_to.frame(driver.find_element(By.NAME,"frame_a"))でフレーム切り替えを行っています。
これにより「https://abcdefghijklmn」という画面の初期画面に「frame_a」という子フレームがあれば画面表示後フレーム移動します。
また、ドライバーの設定方法の違いだけになりますがSelenium ver.4.6以前の場合の例は、以下に載せています。
以上が、Seleniumによるスクレイピングでのフレーム切り替え方法の例になります。