AWS LambdaでHeadless-Chromiumを使用した時に出たエラー

# This version of ChromeDriver only supports Chrome version
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/aa1808a8-0acb-d3e6-707a-b6fa0f2f06ff.png)

ChromeDriverがサポートしていないserverless-chromeを使用している。

notes.txtに、対応するChromeDriverのversionが書いてあるので合わせる。
[ChromeDriver](https://chromedriver.storage.googleapis.com/index.html)

ChromeDriver のバージョンが 73.0.3683.20 である場合、Chrome のバージョンが73.0.3683のものに対して全て対応する([参考](http://chromedriver.chromium.org/downloads/version-selection))
Headless-Chromeの場合は…どうなんだろう

# Layersを使おうとしてUnnable to import module
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/56b3ed3f-b085-8433-cfc8-4c926f312e30.png)

Layersにアップロードすると/opt配下に展開される。[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path)
pythonの場合を例にとると、/opt/python 配下がimportの参照範囲になるので、アップロードされたzipを展開したときに
/opt/python/selenium　の様になっていないと参照できず発生する。

# windowsでzip圧縮して'chromedriver' executable may have wrong permissions

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/cdd7d8d0-2d66-3406-bc6e-a339d0b364fc.png)

[一番下のコメント](https://github.com/yai333/Selenium-UI-testing-with-AWS-Lambda-Layers/issues/1)
windowsがlinuxのファイル権限を扱えないから発生する？
解決策はlinuxでzip圧縮してLayersやS3にアップロードする。
[参考：dockerでaws cliが使える環境を作る](https://qiita.com/ABCompany1/items/c92ac5087519c103f056)

# "errorMessage": "Message: Service /tmp/bin/chromedriver unexpectedly exited. Status code was: 127\n", "errorType": "WebDriverException"

何か色々発生する条件がある様子。[chromedriver_binaryをインポートすればいい](http://www.signalysis.co.jp/blogs/tech/2020/05/19/200519-2/)とか、[libconf2が足りない](https://www.ytyng.com/blog/python-selenium-chromedriver-error-127-install-libgconf2/)とか。

ローカルにlinuxの環境を作って、chromedriverを単独で実行してみると見えてくるかもしれない。

## libnss3.so libX11.soが無い
chromedriver[2.37 Win](https://chromedriver.storage.googleapis.com/index.html?path=2.37/)、headless-chrome[v1.0.0.37 stable](https://github.com/adieuadieu/serverless-chrome/releases/tag/v1.0.0-37)の話。
chromedriverを、dockerのcentos:8イメージを使ってローカルで単独実行した時に発生。ライブラリが足りないらしい。
サードパーティのバイナリをAWS Lambdaで実行可能にするには、ソースコードをzipに固めるときに一緒に入れてしまえばよい。
もしくはLambda LayersにアップロードするだけでもOK。([参考](https://dev.classmethod.jp/articles/mediainfo-on-lambda-python38-include-libraries/))

どちらのsoファイルも直接ダウンロードできなかったので、yum installしてから取り出した。

``` bash
yum install libnss3-dev libX11-devel
```
した後、

``` bash
pm -ql libnss3-dev
pm -ql libX11-devel
```

でインストール先を探し、cpコマンドでコピーする



## Check failed: InitDefaultFont(). Could not find the default font
chromedriver[2.37 Win](https://chromedriver.storage.googleapis.com/index.html?path=2.37/)、headless-chrome[v1.0.0.37 stable](https://github.com/adieuadieu/serverless-chrome/releases/tag/v1.0.0-37)の話。
Dockerのcentos:8で、chromedriverをローカルで単独実行した時、
chromedriverがあるフォルダに作成されたchrome_debug.logに出力されていた。
全く解決策が見えなかったが、Python3.8で実行していたAWS Lambdaを、Python3.7に変えたら正常に動いた。



# 番外編 \<input type="time">にsend_keysしたい時は"HH:MM AM"みたいにする

[DockerでローカルにLambda環境を作って](https://qiita.com/tenslar/items/f732d61d011c0e229541)動作確認をしたときは、

```html
<input type="time" id="start">
```

```python
driver.find_element_by_id('start').send_keys('13:00')
```

で入力が可能であるが、本番AWS Lambdaでこのコードを実行すると値が設定されない。

```python
driver.find_element_by_id('start').send_keys('13:00 PM')
```

とすると入力できる。
[参考：一番下のコメント](https://stackoverflow.com/questions/43543967/not-able-to-send-time-input-values-in-selenium-sendkeys)