PythonのSeleniumを使ったGoogleFormのプルダウンの操作方法

# 概要
GoogleFormのプルダウンを選択する際に、通常の操作できなかったのできませんでした。[こちら](https://stackoverflow.com/questions/49854786/handling-drop-down-for-google-form-using-selenium)を参考に対応しようとしてもうまくいかず[stackOverFlowの日本語版](https://ja.stackoverflow.com/questions/54527/googleformのプルダウンをseleniumで選択することができません)で質問をしたところでコメントをいただき解決できたのでその手順をまとめました。
pythonで使用した場合のケースとなります。おそらくほかの言語でも同じように対応できるかと思います。
ソースは[こちら](https://github.com/snowpff14/googleFormTest)で公開しています。
[以前の投稿](https://qiita.com/snowp/items/9734028cecb68b9940a1)などで使っているベースクラスに実装しています。

## 通常のプルダウンの操作方法

ベースクラスでは以下のメソッドで通常のプルダウンを操作しています。
`webElement` で対象のX-Pathを設定、 `inputValue` でプルダウンの選択値を表示名で設定しています。
画面描画の待機処理、例外処理なども含まれていますがそこを除くと

1. プルダウンのX-Pathをもとにプルダウンの要素を取得
1. `Select` に取得した要素を渡す。
1. 表示しているテキストでプルダウンを選択する。

という流れになっています。

```
    # プルダウンを選択する 要素が表示されるまで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を押下することで起動する開発者ツールで確認すると
![通常プルダウン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108811/d40157f6-aea4-7665-607e-a7ed97d29f3b.png)
このようにselectタグになっていることが確認できます。

## GoogleFormのプルダウンの操作方法

通常のプルダウンは `select`要素を選択していますがGoogleFormのプルダウンは `select`要素ではないので通常の方法で選択すると `select` 要素ではないとエラーが発生してしまいます。
今回は以下のメソッドでプルダウンを操作しています。
`buttonInfo` で対象のプルダウンの右にある `▽` のX-Pathを設定、 `target` でプルダウンの選択値を表示名で設定、`pullDownPosition` はGoogleForm内のプルダウンの位置を0始まりで設定しています。
画面描画の待機処理、例外処理なども含まれていますがそこを除くと

1. `▽`のX-Pathを使ってクリック
1. プルダウンの内容が表示されるのを待機後して`exportSelectPopup` でプルダウンの内容を取得します。
    * この時 `find_elements_by_class_name` で取得しているので、選択しの内容を画面のプルダウンの数だけ取得できます。中身はクリックをした位置のものだけ入っている状態です。
1. クリックをした位置を`pullDownPosition` で判断して中身があるところから `content` のtagを取得します。
1. 取得した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
 
```

開発者ツールで確認すると
![googleform.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108811/7aaa8a32-9de1-8161-31e2-5295cccc64a5.png)
このようにdivタグで囲まれていることが確認できます。

## 使用用途など
定期報告をGoogleFormで行っている場合など毎回選択して・・・というような面倒なところもこれを使っていけば楽になるかと