kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Selenium) select/optionの使い方

こんなHTMLを題材にselect/optionの使い方を練習する

<html>

<head>
    <title>Select Sample</title>

<body>
    <select name="season">
        <option value="spring">春</option>
        <option value="summer">夏</option>
        <option value="autumn">秋</option>
        <option value="winter">冬</option>
    </select>
</body>

</html>

REPLでやってみる

まずはwebdriverをimportしてファイルを開く
ローカルのファイルは単にパスを指定するだけでは開けないようなので
file:プロトコルで開いている

$ python3
>>> from selenium import webdriver
>>> driver = webdriver.Chrome()
>>> driver.get('file:///Users/takahiro/study/learn-selenium/selopt.html')


selectの要素を取得するんだけど
selectを扱うにはselect専用のメソッドが用意されていて
Selectクラスのオブジェクトが必要

>>> elm = driver.find_element_by_name("season")
>>> elm
<selenium.webdriver.remote.webelement.WebElement (session="1b4eccac8e6c6a92be86d4d5b180da44", element="0.795485417426198-1")>

elmはただのWebElementなのでSelectオプジェクトに変換する

>>> from selenium.webdriver.support.ui import Select
>>> sel = Select(elm)
>>> sel
<selenium.webdriver.support.select.Select object at 0x1041baf98>

これでoptionが取れたり選択したりできるようになったはず

optionを選択するには、select_by_*を使う

>>> sel.select_by_visible_text("夏")
>>> sel.select_by_value("autumn")

optionsはoption要素の単なるリスト

>>> sel.options
[<selenium.webdriver.remote.webelement.WebElement (session="1b4eccac8e6c6a92be86d4d5b180da44", element="0.795485417426198-4")>, <selenium.webdriver.remote.webelement.WebElement (session="1b4eccac8e6c6a92be86d4d5b180da44", element="0.795485417426198-2")>, <selenium.webdriver.remote.webelement.WebElement (session="1b4eccac8e6c6a92be86d4d5b180da44", element="0.795485417426198-3")>, <selenium.webdriver.remote.webelement.WebElement (session="1b4eccac8e6c6a92be86d4d5b180da44", element="0.795485417426198-5")>]

WebElementのリストになっているので、innerTextを取ったりすることもできる

>>> sel.options[1].text
'夏'
>>> [opt.get_attribute("value") for opt in sel.options]
['spring', 'summer', 'autumn', 'winter']

click()も効いているようだけれども正当な使い方なのかはわからない
select_byを使ったほうがいいのかもしれない

>>> sel.options[1].click() # -> 夏が選択される

最後に一応プログラムっぽいものを

from time import sleep
from selenium import webdriver
from selenium.webdriver.support.ui import Select

def selopt():
    elm = driver.find_element_by_name("season")
    sel = Select(elm)
    for opt in sel.options:
        val = opt.get_attribute("value")
        print(val)
        sel.select_by_value(val)
        sleep(2)

try:
    driver = webdriver.Chrome()
    driver.get('file:///Users/takahiro/study/learn-selenium/selopt.html')
    selopt()
finally:
    driver.quit()

実行
もちろんchrome上でもひとつずつ選択されている

$ /usr/local/bin/python3 /Users/takahiro/study/learn-selenium/selopt.py
spring
summer
autumn
winter

Selectオブジェクトについては7.34. Select Support — Selenium Python Bindings 2 documentationを参照