Python3+Seleniumでブラウザを操作するための備忘録
立て込んでいた仕事がようやく一段落して、久しぶりの平和な休日となったのでブログを更新。今日はPython+Seleniumによるブラウザの自動操作で遊んでました。自分への備忘録がてら、今日一通りやったことをメモします。
はじめに
今回はログイン機能付きページに自動でログインし、サイト内を自動で操作(フォームの入力+ページ内ボタンのクリック)して目的のページまで移動する処理です。必要なのはSeleniumとchromedriverになります。まずは必要なものを諸々インポートして、URLからサイトにアクセスします。
import chromedriver_binary from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait,Select url = "【アクセスしたいURLを入れる】" driver = webdriver.Chrome() driver.get(url)
ログインページでID・パスワードを自動入力
よくあるログインページからログインするサイトの場合、入力フォームの要素を取得(今回はid要素で取得したので.find_element_by_id
)して、そのフォームに.send_keys
を使用して必要な情報を入力していきます。入力完了後はログインボタンを指定して、クリックすることでログインします。
driver.find_element_by_id("【IDの入力フォーム】").send_keys("【IDいれる】") driver.find_element_by_id("【パスワードの入力フォーム】").send_keys(【パスワードいれる】") driver.find_element_by_id("【ログインボタン】").click()
複数あるクラスのうち、○番目を指定する
ページ内の要素の取得方法は様々です。IDであれば、ページ内で単一のものになるため取得に苦労しないのですが、要素によってはIDなどが指定されてない場合もあります。今回もclass指定のないリンク要素を取得する必要が生じたため、class名の指定で範囲を絞り、その中のリンクタグをクリックする処理を入れています。
# find_elements_by_~で指定した要素をリスト形式で取得できる。class名で取得したリストのうち、2番目の要素を呼び出し、その中のAタグをクリック。 driver.find_elements_by_class_name("【指定したいクラス名】")[1].find_element_by_tag_name("a").click()
プルダウンメニューから選択
入力フォームにあるプルダウンメニューもseleniumで自動指定が可能です。プルダウンメニューのタグはselect name="〇〇"
、中の項目はoption value="〇〇"
で記述されているので、それらの属性を選択していきます。
# selectタグのname属性から要素を指定 elem = driver.find_element_by_name("【プルダウンメニューの要素】") # 指定した要素のうち、選択したいoption要素のvalue属性を入力 Select(elem).select_by_value("【選択したい項目】")
特定の要素が読み込まれてから処理を実行
最近のサイトではページ内要素が動的に管理される事も多く、そうしたタグへの処理はページ側の読み込みが完了してから実行する必要があります。その時は下記のように、特定の要素が読み込み完了となるまで待機するための処理を入れます。
# 10秒待機し、【ID名】の要素が読み込み完了した時点で以降の処理を実行。 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "【ID名】")) )
まとめ
技術的には難しいことをやってる訳ではないですが、基本的に上記の記述を覚えれば、動的サイトでも自在にSeleniumで操作できます。仕事の効率化もできるはずなので、単純作業はどんどん自動化していきましょう。