概要
GoogleFormのプルダウンを選択する際に、通常の操作できなかったのできませんでした。こちらを参考に対応しようとしてもうまくいかずstackOverFlowの日本語版で質問をしたところでコメントをいただき解決できたのでその手順をまとめました。
pythonで使用した場合のケースとなります。おそらくほかの言語でも同じように対応できるかと思います。
ソースはこちらで公開しています。
以前の投稿などで使っているベースクラスに実装しています。
通常のプルダウンの操作方法
ベースクラスでは以下のメソッドで通常のプルダウンを操作しています。
webElement で対象のX-Pathを設定、 inputValue でプルダウンの選択値を表示名で設定しています。
画面描画の待機処理、例外処理なども含まれていますがそこを除くと
- プルダウンのX-Pathをもとにプルダウンの要素を取得
-
Selectに取得した要素を渡す。 - 表示しているテキストでプルダウンを選択する。
という流れになっています。
# プルダウンを選択する 要素が表示されるまで20秒待つ さらに待ち時間が必要な場合は指定を行う
def selectPullDownWaitDisplay(self,webElement,inputValue,waitTime=0):
try:
time.sleep(waitTime)
self.wait.until(expected_conditions.element_to_be_clickable((By.XPATH,webElement)))
selectList=self.driver.find_element_by_xpath(webElement)
selectForm=Select(selectList)
# 画面に表示されるプルダウンのテキストで選択を行う
selectForm.select_by_visible_text(inputValue)
except SystemError as err:
self.log.error('テキスト送信失敗:'+webElement)
self.log.error('例外発生 {}'.format(err))
self.getScreenShot()
raise
except:
self.outputException(webElement)
raise
F12を押下することで起動する開発者ツールで確認すると

このようにselectタグになっていることが確認できます。
GoogleFormのプルダウンの操作方法
通常のプルダウンは select要素を選択していますがGoogleFormのプルダウンは select要素ではないので通常の方法で選択すると select 要素ではないとエラーが発生してしまいます。
今回は以下のメソッドでプルダウンを操作しています。
buttonInfo で対象のプルダウンの右にある ▽ のX-Pathを設定、 target でプルダウンの選択値を表示名で設定、pullDownPosition はGoogleForm内のプルダウンの位置を0始まりで設定しています。
画面描画の待機処理、例外処理なども含まれていますがそこを除くと
-
▽のX-Pathを使ってクリック - プルダウンの内容が表示されるのを待機後して
exportSelectPopupでプルダウンの内容を取得します。- この時
find_elements_by_class_nameで取得しているので、選択しの内容を画面のプルダウンの数だけ取得できます。中身はクリックをした位置のものだけ入っている状態です。
- この時
- クリックをした位置を
pullDownPositionで判断して中身があるところからcontentのtagを取得します。 - 取得したtagの内容と選択したい内容が一致したものを選択します。一致しないときは何もしないで次の処理に進みます。
という流れになっています。
# GoogleFormの場合プルダウンが通常の方法では選択できないので
def selectPullDownGoogleForm(self,buttonInfo,target,pullDownPosition):
try:
self.webElementClickOverlay(buttonInfo)
time.sleep(3)
options=self.driver.find_elements_by_class_name("exportSelectPopup")
contents = options[pullDownPosition].find_elements_by_tag_name('content')
[i.click() for i in contents if i.text == target]
except SystemError as err:
self.log.error('要素待機失敗:'+buttonInfo)
self.log.error('例外発生 {0}'.format(err))
self.getScreenShot()
raise
except:
self.outputException(buttonInfo)
raise
開発者ツールで確認すると

このようにdivタグで囲まれていることが確認できます。
使用用途など
定期報告をGoogleFormで行っている場合など毎回選択して・・・というような面倒なところもこれを使っていけば楽になるかと