【Selenium】ドロップダウンリスト選択,取得方法まとめ/Selectモジュール

- Python -
2020.08.27
Python[パイソン]

Python × Selenium × ChromeDriverで、ドロップダウンリストを操作するSelectモジュールでよく使う方法をまとめ。

こんなHTMLを前提として書いていきます。

HTML<!DOCTYPE html>
<html>

<select name="test" id="dropdown">
    <option value="1">1番目</option>
    <option value="2">2番目</option>
    <option value="3">3番目</option>
    <option value="4">4番目</option>
    <option value="5">5番目</option>
    <option value="6">6番目</option>
</select>

</html>

特定のoptionを選択状態にしたり、選択状態の選択肢を取得したり、全ての選択肢を取得したりします。

SeleniumでドロップダウンリストをSelectで操作する

準備:Selectモジュール

  1. Selectモジュールのインポート
  2. select要素を find_element_by_xxx で取得する
  3. Selectオブジェクト生成

という手順で準備します。上記1, 2, 3は以下コメント1, 2, 3と照らし合わせてください。

Pythonimport chromedriver_binary
from selenium import webdriver
# ① Selectモジュールをインポート
from selenium.webdriver.support.select import Select
 
driver = webdriver.Chrome()
driver.get('http://127.0.0.1:5500/index.html')
 
dropdown = driver.find_element_by_id('dropdown') # ② select要素を取得
select = Select(dropdown) # ③ Selectオブジェクト生成

これでドロップダウンリストの選択肢をいじくり回す準備が完了です。

インデックス指定で選択状態にする:Select.select_by_index( )

Selectオブジェクトはselect_by_xxx( )というメソッドを使って特定の選択肢(option)を指定できます。最初はindex指定するパターン(以下4, 5行目)。

Pythondropdown = driver.find_element_by_id('dropdown')
select = Select(dropdown)

select.select_by_index(2)  # 3番目を選択状態に
select.select_by_index(len(select.options)-1)  # 最後を選択状態に

インデックスなので1つ目の選択肢は0。

ちなみに5行目のようにSelect.optionsとすると、全てのoptionタグがWebElementとしてリストで返ってきます。

valueの値で選択状態にする:Select.select_by_value( )

<option value="xxx">yyy</option>のxxxを指定して選択状態にしたい場合。

Pythondropdown = driver.find_element_by_id('dropdown')
select = Select(dropdown)

select.select_by_value('3') # valueが"3"を選択状態にする

選択肢の値で選択する:Select.select_by_visible_text( )

<option value="xxx">yyy</option>のyyyを指定して選択状態にしたい場合。visible_textと聞くとなんだか混乱しそうですが、単純に選択肢として表示されている文字のことです。

Pythondropdown = driver.find_element_by_id('dropdown')
select = Select(dropdown)

select.select_by_visible_text('3番目') # "3番目"と表示された選択肢を選択状態にする

初期設定値を取得する:Select.first_selected_option

これまでは「選択状態にするパターン」でしたが、これは「選択されたoption要素を取得して確認するパターン」です。

こんな風に、selected="selected"で初期値が設定された状態を想定します。

HTML<!DOCTYPE html>
<html>

<select name="test" id="dropdown">
    <option value="1">1番目</option>
    <option value="2">2番目</option>
    <option value="3" selected="selected">3番目</option>
    <option value="4">4番目</option>
    <option value="5">5番目</option>
    <option value="6">6番目</option>
</select>

</html>

以下5行目Select.first_selected_optionで初期選択状態のoption要素(WebElement)が返ってきます。

Pythondropdown = driver.find_element_by_id('dropdown')
select = Select(dropdown)

# 初期設定値を取得する
selected = select.first_selected_option
print(selected)
# -> <selenium.webdriver.remote.webelement.WebElement (session="a9a9ca9cd538a7e343d2f414c4f3c6a1", element="7603f68c-c14b-4a6d-bc98-436c9159ffcf")>
print(selected.text)
# -> 3番目
print(selected.get_attribute('value'))
# -> 3
print(selected.get_attribute('outerHTML'))
# -> <option value="3" selected="selected">3番目</option>

5行目でWebElementが返ってきているので、.text.get_attribute('属性名')など値を引っこ抜くことができます。

全て/特定のoptionを取得:Select.options

Select.optionsで全ての選択肢がリストになって返ってきます。

Pythondropdown = driver.find_element_by_id('dropdown')
select = Select(dropdown)

all_options = select.options # 全ての選択肢を取得(list)
for option in all_options:
    print(option.text) # 選択肢のテキスト
    print(option.get_attribute('outerHTML')) # HTMLタグ
    print(option.get_attribute('value')) # value属性
    print('----------------------------')

6, 7, 8行目の出力はこうなります↓。

$ python test.py
1番目
<option value="1">1番目</option>
1
----------------------------
2番目
<option value="2">2番目</option>
2
----------------------------
3番目
<option value="3" selected="selected">3番目</option>
3
----------------------------
4番目
<option value="4">4番目</option>
4
----------------------------
5番目
<option value="5">5番目</option>
5
----------------------------
6番目
<option value="6">6番目</option>
6
----------------------------

選択されている選択肢を全て取得:Select.all_selected_options

<select name="xxx" multiple>と複数選択可能な場合で、選択状態の選択肢だけを取得したい場合。

Pythondropdown = driver.find_element_by_id('dropdown')
select = Select(dropdown)

select.select_by_index(2)  # 3番目を選択状態に
select.select_by_index(3)  # 4番目を選択状態に
selected = select.all_selected_options # 選択状態にある全ての選択肢を取得
print(selected[0].text)
# -> 3番目
print(selected[1].text)
# -> 4番目

選択を解除する系:Select.deselect_xxx( )

<select name="xxx" multiple>と複数選択可能な場合で、選択状態の選択肢を解除したい時。

1つ目の全て解除以外は、selectをdeselectに変えるだけなので簡単です。

  • .deselect_all()
    → 選択状態を全て解除
  • .deselect_by_index(2)
  • .deselect_by_value(2)
  • .deselect_by_visible_text('3番目')

参考サイトSelenium 3.14 documentation:selenium.webdriver.support.select

↑TOP