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を参照