【Python3】Seleniumでiframeの要素を取得して操作する方法

おはこんばんにちは、せなです。

今回はSeleniumでiframeの要素を取得して操作する方法を説明したいと思います。

コード

まずはコードを記載します。説明については後述します。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

# chromeを使用
driver = webdriver.Chrome(ChromeDriverManager().install())

# ページを開く
driver.get('https://jqueryui.com/datepicker/')

try:
    # iframeの要素が読み込まれるまで待機
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'demo-frame')))
except TimeoutException as e:
    ### 例外処理
    print(e)

# iframeを取得
iframe = driver.find_element(By.CSS_SELECTOR, 'iframe.demo-frame')

# iframeの中の要素を操作するために切り替える
driver.switch_to.frame(iframe)

# 要素を取得する
element = driver.find_element_by_id('datepicker')

コードの説明

iframeは読み込まれるまでに時間がかかりますので、「expected_conditions」で待機処理を行う必要があります。(必須ではないですが、後方のiframe取得で要素を発見できずにエラーとなります。)

「(By.CLASS_NAME, 'demo-frame’)」としていますが、こちらを「(By.CSS_SELECTOR, 'iframe.demo-frame’)」とするとiframeが読み込まれる前に要素の取得が行われるため、エラーとなります。

driver.find_element(By.CSS_SELECTOR, 'iframe.demo-frame’)」これはiframe内のdomを取得しています。

「driver.switch_to.frame(iframe)」コメントにも記載していますが、iframe内の要素を操作するために切り替えを行なっています。

Python,Selenium

Posted by sena