

マルチポストです。  
<https://teratail.com/questions/375966>

teratailでも回答を募りましたが、  
解決に至らなそうなのでこちらでも投稿させていただきます。

lambda上でheadlesschromeを使ってseleniumで操作したいのですが、  
上手くいきません。

環境構築はこちらを参考にしました。  
バージョン等もこちらと同じです。  
<https://qiita.com/ichihara-development/items/5e61c3424b3176bc6096>

ローカルでは動作しているのですが、  
lambda上で実行しようとするとエラーが出ます。

send_keysメソッドが動作していない（？）様に見えるのですが。。

ちなみにローカルはPython 2.7.16で、  
lambdaはPython 3.7です。

色々と調べた際、  
chrome-driverのバージョンが古いせいでset_keysが対応しないという記事をいくつか見かけましたが、  
現状headless-chrominiumのバージョンが最新のchromeのバージョンに追いついていないので、  
対応させる事は不可能なのでしょうかね。。  
（ローカルで動作するchromeのバージョンは最新なので、chrome-driverのバージョンと合っていて動作する？）

ローカルのPythonのバージョンをlambda側と合わせた3系（3.7.3）に切り替えて実行しましたが、  
ローカルでは上手く動作しました。

何か分かる方いれば宜しくお願いします。

エラーメッセージ

[code]

    Test Event Name
    selenium
    
    Response
    {
      "errorMessage": "'dict' object has no attribute 'send_keys'",
      "errorType": "AttributeError",
      "stackTrace": [
        "  File \"/var/task/lambda_function.py\", line 39, in lambda_handler\n    driver.find_element_by_name(\"user_password\").send_keys(\"XXXXXX\")\n"
      ]
    }
    
    Function Logs
    START RequestId: XXX Version: $LATEST
    [ERROR] AttributeError: 'dict' object has no attribute 'send_keys'
    Traceback (most recent call last):
      File "/var/task/lambda_function.py", line 39, in lambda_handler
        driver.find_element_by_name("user_password").send_keys("XXXXXX")
    END RequestId: XXX
    REPORT RequestId: XXX    Duration: 39112.18 ms    Billed Duration: 39113 ms    Memory Size: 256 MB    Max Memory Used: 256 MB    Init Duration: 301.10 ms
    
    Request ID
    a68d20b9-adcd-48a9-ac2a-3a031fcae879
    
[/code]

コード（Python）

[code]

    # -*- coding: utf-8 -*-
    
    import time
    import subprocess
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    import requests
    import json
    from selenium.webdriver.common.keys import Keys
    
    def lambda_handler(event, context):
    
        options = webdriver.ChromeOptions()
        options.add_argument("--headless")
        options.add_argument("--disable-gpu")
        options.add_argument("--single-process")
        options.add_argument("--ignore-certificate-errors")
        options.add_argument("--no-sandbox")
        options.add_argument("--homedir=/tmp")
        options.binary_location = "/opt/headless/python/bin/headless-chromium"
    
        #ブラウザの定義
        driver = webdriver.Chrome(
            "/opt/headless/python/bin/chromedriver",
            options=options
        )
    
    
        # 対象サイトに移動
        driver.get('https://test')
    
        time.sleep(3)
    
        # ユーザーネーム
        driver.find_element_by_name("user_id").send_keys("XXXXXX")
    
        # パスワード
        driver.find_element_by_name("user_password").send_keys("XXXXXX")
    
        driver.quit()
    
[/code]


CC BY-SA 4.0
2022-01-07T05:25:42.340
85543
2023-06-12T19:00:19.540
44420
question
python selenium
lambda上でheadlesschromeを使ってseleniumを動かそうとするとエラーになる


> chrome-driverのバージョンが古いせいでset_keysが対応しないという記事をいくつか見かけましたが、

環境構築で参考にしたというQiitaの記事のheadless-chromium, chromedriverのバージョンと、  
ローカルのheadless-chromium, chromedriverのバージョンと比較してみてください。

Qiitaの記事では、v1.0.0-37のheadless-
chromiumと、2.37のchromedriver_linux64のダウンロードが解説されていました。

> $ curl -SL <https://github.com/adieuadieu/serverless-
> chrome/releases/download/v1.0.0-37/stable-headless-chromium-
> amazonlinux-2017-03.zip> > headless-chromium.zip

> $ curl -SL
> <https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip>
> > chromedriver.zip

ですが、そのリポジトリにあるheadless-chromiumは、v1.0.0-57がありました。  
<https://github.com/adieuadieu/serverless-chrome/releases/>

chromedriverももっと新しいバージョンが出ています。  
<https://chromedriver.chromium.org/downloads>


CC BY-SA 4.0
2022-01-08T01:23:49.163
85556
2022-01-08T01:23:49.163
28626
85543
answer


私も同様の事象に遭遇しましたが、以下URLを参考に

[code]

    options.add_experimental_option("w3c", True)
    
[/code]

を設定したらうまくいきました。  
全く同じ事象かどうかはわかりませんが、ご参考まで。

<https://stackoverflow.com/questions/69582816/python-selenium-attributeerror-
dict-object-has-no-attribute-get-attribute>

> So, it's another option that could lead to this error. You can fix it by
> removing it or changing its value to True.


CC BY-SA 4.0
2022-03-18T11:28:58.463
87902
2022-03-18T12:06:28.173
2022-03-18T12:06:28.173
3060
51873
85543
answer