💬

[Python]Seleniumの使い方一覧

2021/05/02に公開

前提

#webdriverをimport
from selenium import webdriver 

接続と終了

#Firefoxの場合
#接続
driver = webdriver.Firefox()
#終了
driver.quit()
#Chromeの場合
#接続
driver = webdriver.Chrome()
#終了
driver.quit()

アクセス

基本的に大抵の操作はここから始まるのではないでしょうか。

url = 'https://www.google.co.jp/'
driver.get(url)

要素の取得

基本的に一番最初に見つかった要素

#タグ名で検索
element = driver.find_element_by_tag_name('tag_name')
#タグ名で検索(応用): 子要素を指定できたりする
element = driver.find_element_by_tag_name('div>a)
#クラス名で検索
element = driver.find_element_by_class_name('class_name')
#idで検索
element = driver.find_element_by_id('id')
#name属性で検索
element = driver.find_element_by_name('name_attr')
#xpathで検索
element = driver.find_element_by_xpath('xpath')
#cssセレクタで検索
element = driver.find_element_by_css_selector('css_selector')
#リンクのテキストで検索
element = driver.find_element_by_link_text('sign in')
#リンクのテキストで検索(部分一致)
element = driver.find_element_by_partial_link_text('sign in')

要素の取得(リストで)

当てはまったものすべてをリストとして返す

#タグ名で検索
element = driver.find_elements_by_tag_name('tag_name')
#タグ名で検索(応用): 子要素を指定できたりする
element = driver.find_elements_by_tag_name('div>a)
#クラス名で検索
element = driver.find_elements_by_class_name('class_name')
#idで検索
element = driver.find_element_by_id('id')
#name属性で検索
element = driver.find_elements_by_name('name_attr')
#xpathで検索
element = driver.find_elements_by_xpath('xpath')
#cssセレクタで検索
element = driver.find_elements_by_css_selector('css_selector')
#リンクのテキストで検索
element = driver.find_elements_by_link_text('sign in')
#リンクのテキストで検索(部分一致)
element = driver.find_elements_by_partial_link_text('sign in')

Byを使って指定する

普通に使うならなかなか使わない気がするけれど、後の待機処理で使いたいので書いておく。
ポイントは、find_elementと指定を切り離したことにありそう。

#idで検索
element = driver.find_element_by_id('id')

↑と↓は同じこと

from selenium.webdriver.common.by import By
#idで検索
#element = driver.find_element(by=By.指定方法, value=指定する値)
element = driver.find_element(by=By.ID, value='id')

参考

https://www.seleniumhq.org/docs/03_webdriver.jsp

よく使う処理

#ソースを取得する
driver.page_source

#ウィンドウのサイズを指定する
driver.set_window_size(100,300)

#全画面表示にする
driver.maximize_window()

#以降で使用するelementを生成
element = driver.find_element_by_tag_name('タグ名')

#現在のURLを取得する
element.current_url

#HTMLソースを取得
element.get_attribute('innerHTML')

#テキストを取得
element.text

#要素をクリックする <a>など
element.click()

#送信 <form>など
element.submit()

#属性値を取得 (例) <a>のhref属性など
element.get_attribute('href')

キー入力

#以降で使用するelementを生成
element = driver.find_element_by_tag_name('タグ名')

#入力する <input>など
element.send_keys('入力したい文')

#入力を消す <input>など
element.clear()

#送信 <form>など
element.submit()

特殊なキーの入力

単純な文字ではなく、ENTERや

from selenium.webdriver.common.keys import Keys

#以降で使用するelementを生成
element = driver.find_element_by_tag_name('タグ名')

#ENTERキーを入力
element.send_keys(Keys.ENTER)

#Shiftキーを押しながら。ということもできるみたい
element.send_keys(Keys.SHIFT,"text")

以下に一覧があります。
https://selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html

セレクトボックス

セレクトボックスを操作する方法です。

from selenium.webdriver.support.ui import Select

'''過程は省略'''

#要素を指定する
element = driver.find_element_by_tag_name('select')

#Selectクラスのインスタンスを生成することで様々な処理を扱える
select = Select(element)

#value属性の値を引数に指定することで、選択する
select.select_by_value('value')

#現在選択されているオプションを取得する
select.first_selected_option

#その他にもたくさんあります。

参考リンク

https://selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.select.html

特殊な処理

ホバー

from selenium.webdriver.common.action_chains import ActionChains

#対象となる要素を取得
element = driver.find_element_by_id('id')

#ActionChains(ドライバ).move_to_element(対象の要素)
# move_to_element()は対象の要素にカーソルを移動させるための設定をする関数
hover = ActionChains(driver).move_to_element(element)

#設定したもの反映させる。(つまりここでカーソルが要素上に移動する)
hover.perform()

待機処理

暗黙の待機

.pyファイル内の書き方

#要素が見つかるまで55秒待つ。見つかり次第次へ
driver.implicitly_wait(5)
#要素が見つかるまで55秒待つ。見つかり次第次へ
driver.implicitly_wait(5)

明示的な待機

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

'''接続までは省略'''

try:
    '''elementには見つけた要素を代入'''
    #WebDriverWait(WebDriverインスタンス, 最大待機時間).unitl(何を見つけるまで?)
    #EC.presence_of_element_located(By.指定方法, 指定する値)
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

参考

https://kurozumi.github.io/selenium-python/waits.html

待機処理で使えそうなメソッド一覧https://kurozumi.github.io/selenium-python/api.html

ウィンドウ切り替え

#JavaScriptで新規タブを開く
driver.execute_script('window.open()')

#switch_to()で一番最近生成されたタブに切り替える[-1]の指定は後ろから1番目という書き方
driver.switch_to.window(driver.window_handles[-1])

#現在のタブを閉じる。
driver.close()

#閉じたあとに操作しようとするとエラーが出るので、明示的に対象のタブ(ウィンドウ)を指定する必要があるみたい
driver.switch_to.window(driver.window_handles[0])

参考

https://selenium-python.readthedocs.io/navigating.html

コツ

開発者ツールを活用する

開発者ツールで該当するタグの部分を右クリックしてCopy→xpathなどを選択すれば、簡単にxpathやcssセレクタを取得できます。

気が向いたら別記事にまとめます。

Discussion