今回は、Seleniumで要素をクリックする方法を解説します。
状況別に4パターンのクリック方法を解説していますので、ご自身の環境に合わせて参考にしていただければと思います。
【パターン1】要素を取得してクリック
Seleniumで要素(ラジオボタン・チェックボックス・ボタン等)をクリックする場合、この方法が一番スタンダードかと思います。
◆ 要素を取得してクリック
element.click()
from selenium import webdriver
#import chromedriver_binary # chromedriver-binaryの場合これも必要
import time
from selenium.webdriver.common.by import By
# ブラウザの起動
driver = webdriver.Chrome()
driver.get('https://www.yahoo.co.jp/')
# ページが開くまで3秒待機
time.sleep(3)
# 要素をXPathで取得
element = driver.find_element(By.XPATH, '//*[@id="ToolList"]/ul/li[1]/div/a/p/span[1]/span')
# 要素をクリック
element.click()
# ブラウザを閉じる
driver.close()
上記は、Yahoo!JAPANのトップページの「ショッピング」をクリックするコードです。コピペでそのまま動くので、動きを確認したい場合はぜひ実行してみてください。
【パターン2】JavaScriptでクリック実行
◆ JavaScriptでクリック
driver.execute_script(‘onclickイベントの内容’ )
パターン1の方法でボタンの取得に失敗する場合、ボタンがJavaScriptになっている可能性が考えられます。
対象のページで右クリック>検証、またはF12を押しHTMLソースを確認します。
<a href="javascript:void(0);" onclick="javascript:$('form').submit();" class="class1">
<span>ログイン</span>
</a>
クリックしたいボタンのHTMLにonclickイベントが指定されていたらそれを指定して実行します。
driver.execute_script("javascript:$('form').submit();")
【パターン3】iframe(埋め込み)内の要素をクリック
iframe(アイフレーム)とは、「インラインフレーム」とも呼ばれるHTMLタグのひとつです。iframeは、TwitterやYoutubeの埋め込みなど、別のWebページを表示する際に使われます。
たとえば、このブログ内にYoutube動画を埋め込むと、その部分がiframeタグで生成されます。
iframeタグ内にクリックしたい要素がある場合、フレームの切り替えが必要です。詳しい手順はこちらをご参照ください。
【パターン4】要素の座標でクリック
パターン1~3の方法で要素がうまくクリックできない場合は、要素の座標を指定してクリックするのもひとつの手です。
座標で要素を指定してクリックする場合は、Action Chainsを使います。Action Chainsは、DOMというWebサイトのHTMLを操作するための仕組みを利用しています。
◆ 要素を座標でクリック
actions.move_to_element_with_offset(element, x座標, y座標)
from selenium.webdriver.common.action_chains import ActionChains
# Action Chainsオブジェクト生成
actions = ActionChains(driver)
# 対象のページ全体を取得
page = driver.find_element(By.TAG_NAME, 'html')
# 指定された座標にマウスを移動
actions.move_to_element_with_offset(page, 36, 227)
# 要素をクリック
actions.click().perform()
ダブルクリック
要素をダブルクリックしたい場合は、先ほど説明したAction Chainsを使います。
◆ 要素をダブルクリック
actions.double_click(element)
from selenium.webdriver.common.action_chains import ActionChains
# 要素をXPathで取得
element = driver.find_element(By.XPATH, '//*[@id="ToolList"]/ul/li[1]/div/a/p/span[1]/span')
# Action Chainsオブジェクト生成
actions = ActionChains(driver)
# 要素をダブルクリック
actions.double_click(element).perform()
クリックできるかどうか事前に判定する
指定した要素がクリックできるかどうかをあらかじめ判定しておくことで、処理が落ちるのを防ぎます。
◆ 要素がクリックできるか(有効かどうか)
element.is_enabled()
# 要素をXPathで取得
element = driver.find_element(By.XPATH, '/html/body/section[1]/section[2]/a[1]/button')
if element.is_enabled():
# 要素をクリック
element.click()
else:
print('要素をクリックできません!')
うまくクリックできない・反応しない場合は?
パターン1~パターン4まで試してみても、要素がうまくクリックできない・反応しない場合は、以下のような原因が考えられます。
- ポップアップ等が出て要素が隠れてしまっている
- 要素が一意に指定できていない(複数存在するClass名を指定している、など)
- スクレイピング自体禁止されているページである
詳しくは以下記事にて解説しています。
コメント