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

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

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

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

selenium

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

Q&A

解決済

1回答

1709閲覧

AWS LambdaでSelenium+headless-chromeでの操作を実行しようとしたところ"ms must be a double"というエラーが出て正しく実行されない

XinCii

総合スコア35

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

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

selenium

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

1グッド

0クリップ

投稿2022/02/21 17:55

編集2022/02/22 02:53

前提・実現したいこと

前にこちらのページで質問を投稿し、自己解決したのですが、新たに異なるエラーが出てきました。以下先程のページと被りますが一部再掲します。

AWSのLambda上でSeleniumやChromedriver, headless-chromiumを用いてGoogle formを毎日指定した時刻に自動入力するコードを開発しています。使用言語はPython 3.7です。
コードの作成に関してはこちらのQiitaのページのやり方にならいました。

ただ、自分の場合はログインが必要なFormを扱うため、
SeleniumでChrome起動→まずGoogleでログイン→その後Formのページへ移動し、自動入力の後ブラウザを閉じる
の流れに変えています。

レイヤーのアップロードは、linux環境に合わせるためCloud9経由で作成したzipをアップロードしました。この過程に関しては、こちらのページを参考にしました。
PATHの問題を無事解決し、テストを実行したところエラーが発生しました。

発生している問題・エラーメッセージ

AWS

1{ 2 "errorMessage": "Message: unknown error: 'ms' must be a double\n (Session info: headless chrome=64.0.3282.167)\n (Driver info: chromedriver=2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),platform=Linux 4.14.252-207.481.amzn2.x86_64 x86_64)\n", 3 "errorType": "WebDriverException", 4 "stackTrace": [ 5 " File \"/var/task/lambda_function.py\", line 17, in lambda_handler\n browser.implicitly_wait(1)\n", 6 " File \"/opt/python/selenium/webdriver/remote/webdriver.py\", line 1149, in implicitly_wait\n 'implicit': int(float(time_to_wait) * 1000)})\n", 7 " File \"/opt/python/selenium/webdriver/remote/webdriver.py\", line 424, in execute\n self.error_handler.check_response(response)\n", 8 " File \"/opt/python/selenium/webdriver/remote/errorhandler.py\", line 247, in check_response\n raise exception_class(message, screen, stacktrace)\n" 9 ] 10}

該当のソースコード

以下AWS Lambda上でのソースコードです。

import json from selenium import webdriver import time import random def lambda_handler(event, context): body_temp = str(36 + random.randint(1,7)/10) url1 = 'https://www.google.com/accounts?hl=ja-JP' options = webdriver.ChromeOptions() options.binary_location = '/opt/python/bin/headless-chromium' options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--single-process') options.add_argument('--disable-dev-shm-usage') browser = webdriver.Chrome('/opt/python/bin/chromedriver',options = options) browser.implicitly_wait(1) browser.get(url1) G_ID = browser.find_element_by_id('ID') G_ID.send_keys('USERNAME') G_Enter = browser.find_element_by_class_name('CLASSNAME') G_Enter.click() G_PW = browser.find_element_by_id('PW') G_PW.send_keys('PASSWORD') G_Enter.click() time.sleep(3) G_Enter = browser.find_element_by_class_name('CLASSNAME') G_Enter.click() time.sleep(2) body_temp = str(36 + random.randint(1,5)/10) url2 = '<Google FormのURL>'+body_temp browser.get(url2) time.sleep(2) try: F_Continue = browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[3]/div[2]/a/span/span') F_Continue.click() except: pass time.sleep(1) Send_Button = browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[3]/div[2]/a/span/span') Send_Button.click() time.sleep(2) browser.close browser.quit return { 'statusCode': 200, 'body': json.dumps('Form submission success!!') }

試したこと

引用符を「'」から「"」に、またその逆も試しましたが、変化はありませんでした。
"ms must be a double"でネット検索をかけてみましたが、英語のページが2つほどヒットするのみでした。その1つには、chromedriverのバージョンがchromeにマッチしていないというもので、あくまでもローカル環境を想定した問答のようで(初心者なので解釈が誤っているかもしれません)今回のケースとは異なりました。もう1つのページに関しては、正直あまり内容がよく理解できませんでした。
"a double"とはコードにおいてはどういう意味なのでしょうか。また、このエラーを解決するにはどの部分を変更すればよいのでしょうか。ほかにも考えられるエラーの原因やコードミスなど、なんでもアドバイスいただけますと幸いです。

melian👍を押しています

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

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

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

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

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

hoshi-takanori

2022/02/21 19:00

"ms must be a double" は「ms (ミリ秒の略だと思われます) は double 型でなければならない」という普通の英文で、エラーメッセージの webdriver.py 1149 行で implicit: の値を int にキャストしてるのが問題かも? もちろん webdriver のコードなので質問者さんのコードの問題ではありませんが、chromedriver のバージョンが合ってないという可能性はありそうですね…。
melian

2022/02/21 19:19 編集

「もう1つのページ」には「Confirmed fixed in Chromedriver v2.42」と書かれています。エラーメッセージに表示されている chromedriver のバージョンは 2.37.544315 ですので、2.42 以降の chromedriver に入れ替えてみてはどうでしょうか。また、"'ms' must be a double" の意味は、Python で言えば「'ms' パラメータはミリ秒単位の数値(int or float)で指定しなさい」となります。実際には chromedriver v2.42 よりも前のバージョンに存在していた不具合なのではないかと。
XinCii

2022/02/22 02:45 編集

お二人ともご意見いただきありがとうございます。 Chromedriverのバージョンを2.43にして試行してみたところ、上記のエラーは解決しましたが、以下のエラーが表示されてしまいました。 { "errorMessage": "Message: session not created: Chrome version must be >= 69.0.3497.0\n (Driver info: chromedriver=2.43.600233 (523efee95e3d68b8719b3a1c83051aa63aa6b10d),platform=Linux 4.14.252-207.481.amzn2.x86_64 x86_64)\n", "errorType": "SessionNotCreatedException", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 16, in lambda_handler\n browser = webdriver.Chrome('/opt/python/bin/chromedriver', options = options)\n", " File \"/opt/python/selenium/webdriver/chrome/webdriver.py\", line 73, in __init__\n service_log_path, service, keep_alive)\n", " File \"/opt/python/selenium/webdriver/chromium/webdriver.py\", line 99, in __init__\n options=options)\n", " File \"/opt/python/selenium/webdriver/remote/webdriver.py\", line 268, in __init__\n self.start_session(capabilities, browser_profile)\n", " File \"/opt/python/selenium/webdriver/remote/webdriver.py\", line 359, in start_session\n response = self.execute(Command.NEW_SESSION, parameters)\n", " File \"/opt/python/selenium/webdriver/remote/webdriver.py\", line 424, in execute\n self.error_handler.check_response(response)\n", " File \"/opt/python/selenium/webdriver/remote/errorhandler.py\", line 247, in check_response\n raise exception_class(message, screen, stacktrace)\n" ] } これはAWS Lambdaに搭載されているChromeのバージョンが69.0.3497.0よりも古いということなのでしょうか。つまり、新しいchromeをまた別にレイヤーに追加しなければいけないのでしょうか。
melian

2022/02/22 02:53

最初のエラーメッセージには、Session info: headless chrome=64.0.3282.167 と表示されていますので、「AWS Lambdaに搭載されているChromeのバージョンが69.0.3497.0よりも古い」ことになります。
XinCii

2022/02/22 07:21 編集

わかりました。ありがとうございました。
guest

回答1

0

自己解決

上の追記部分で頂いたコメントで解決しました。
どうやらv2.42以前で起こるトラブルのようでして、ChromeDriverのバージョンを2.43にしたところ上記のエラーは表示されなくなりました。アドバイスをくださった方々、どうもありがとうございました。

投稿2022/02/22 07:23

XinCii

総合スコア35

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問