質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

11388閲覧

python seleniumでドロップダウンをクリックする方法

yooka54

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

3クリップ

投稿2020/05/21 13:27

編集2020/05/23 05:03

前提・実現したいこと

python初心者です。
python seleniumでフォームを自動送信するプログラムを作っています。
ドロップダウンから選択肢を選択するプログラムが分からなくて悩んでいます。
ネット上いろいろと探してみましたがHTMLの構成が違っていたりとよく理解できませんでした。
そこで質問させていただきました。

該当のソースコード

HTML

1<div class="dropdown mb20"> 2 <a id="dLabel" role="button" data-toggle="dropdown" class="btn btn-default btn-sm ng-binding" data-target="#" href="javascript:void(0);" aria-expanded="false"> 3 -- 4 <span class="caret"></span> 5 </a> 6 <ul ng-model="hour" ng-class="{ aOS4_1Select: isAndroidVersion41 }" class="dropdown-menu multi-level ng-pristine ng-untouched ng-valid ng-empty" role="menu"> 7 <li><a ng-click="hourChange('','--')">--</a></li> 8 <li><a ng-click="hourChange('0','00')">00</a></li> 9 <li><a ng-click="hourChange('1','01')">01</a></li> 10 <li><a ng-click="hourChange('2','02');">02</a></li> 11 <li><a ng-click="hourChange('3','03');">03</a></li> 12 <li><a ng-click="hourChange('4','04');">04</a></li> 13 <li><a ng-click="hourChange('5','05');">05</a></li> 14 <li><a ng-click="hourChange('6','06');">06</a></li> 15 <li><a ng-click="hourChange('7','07');">07</a></li> 16 <li><a ng-click="hourChange('8','08');">08</a></li> 17 <li><a ng-click="hourChange('9','09');">09</a></li> 18 <li><a ng-click="hourChange('10','10');">10</a></li> 19 <li><a ng-click="hourChange('11','11');">11</a></li> 20 <li><a ng-click="hourChange('12','12');">12</a></li> 21 <li><a ng-click="hourChange('13','13');">13</a></li> 22 <li><a ng-click="hourChange('14','14');">14</a></li> 23 <li><a ng-click="hourChange('15','15');">15</a></li> 24 <li><a ng-click="hourChange('16','16');">16</a></li> 25 <li><a ng-click="hourChange('17','17');">17</a></li> 26 <li><a ng-click="hourChange('18','18');">18</a></li> 27 <li><a ng-click="hourChange('19','19');">19</a></li> 28 <li><a ng-click="hourChange('20','20');">20</a></li> 29 <li><a ng-click="hourChange('21','21');">21</a></li> 30 <li><a ng-click="hourChange('22','22');">22</a></li> 31 <li><a ng-click="hourChange('23','23');">23</a></li> 32 </ul> 33</div> 34 35<!--省略--> 36 37<div class="row formBtnCnt"> 38 <div class="col-xs-12"> 39 <button type="button" class="btn btn-primary btn-lg" ng-disabled="frm.$invalid" ng-click="update()">内容を確定する</button> 40 </div> 41 </div>

試したこと

xpath

補足情報(FW/ツールのバージョンなど)

初心者なため質問の仕方が分かりにくいところがありますがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

段階を分けて説明します。

1. Selectタグ

まずSeleniumにおいてdropdownというとSelectタグ専用の関数があります。

html

1<select id="hogehoge"> 2 <option value="1">Aries</option> 3 <option value="2">Taurus</option> 4 <option value="3">Gemini</option> 5 <option value="4">Cancer</option> 6 <option value="5">Leo</option> 7 <option value="6">Virgo</option> 8 <option value="7">Libra</option> 9 <option value="8">Scorpio</option> 10 <option value="9">Saggitarius</option> 11 <option value="10">Capricorn</option> 12 <option value="11">Aquarius</option> 13 <option value="12">Pisces</option> 14</select>

python

1from selenium.webdriver.support.select import Select 2 3Select(driver.find_element_by_id('hogehoge')).select_by_value('11') # Aquariusが選択される 4Select(driver.find_element_by_id('hogehoge')).select_by_index(5) # Virgoが選択される 5Select(driver.find_element_by_id('hogehoge')).select_by_visible_text('Taurus') # Taurusが選択される

selectタグにしか使えないので今回は適用できません。

2. Selectタグで無い場合

地道にDOMを選んでクリックするのが良いでしょう。
その際、execute_scriptという関数があり、中に任意のJSを書き込むことができます。
ですので、

python

1driver.execute_script('document.querySelector(".dropdown.mb20 > ul.dropdown-menu > li:nth-child(3) > a").click()') 2driver.execute_script('document.getElementsByClassName("btn-primary")[0].click()')

としてやるか、あるいは今回の場合クリック後に発火するJSがむき出しになっているので、

python

1driver.execute_script('hourChange("4","04");') 2driver.execute_script('update()')

としてやるとうまいこと動いてくれるでしょう。

3. AngularJSのあるDOM

大抵の場合は2までで終わるのですが、
経験則的にAngularとSeleniumは相性が悪く、正常に動作しない場合が多々あります。
この場合はexecute_scriptを使わずに書くとうまくいくかと思います。

python

1driver.find_element_by_css_selector('.dropdown.mb20 > ul.dropdown-menu > li:nth-child(3) > a').click() 2driver.find_element_by_class_name('btn-primary').click()

コメントを受けて追記

ではもっと強引にやってみましょう。

python

1for a_tag in driver.find_elements_by_tag_name('a'): 2 if a_tag.get_attribute('ng-click') == "hourChange('4','04');": 3 a_tag.click() 4 break

投稿2020/05/26 01:39

編集2020/05/27 23:57
shirai

総合スコア1290

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yooka54

2020/05/27 14:08

ご回答ありがとうございます。 教えてもらったようにいろいろと試してみたが内容を確定ボタンしか押されませんでした。
shirai

2020/05/27 23:57

追記しました。
yooka54

2020/05/31 14:39

追記ありがとうございます。 今回もいろいろと応用させながら検証してみましたが動きませんでした。 ご負担でなければアドバイスをお願いします。
shirai

2020/06/02 17:26

エラーは出ていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問