rustprogram2022
@rustprogram2022 (rust coo)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Heroku上でpython chromedriverでscreenshotがしたい

解決したいこと

Heroku上でpython chromedriverでscreenshotがしたいです。。

driver.save_screenshot('scsho.png')をした時
返り値はTrueですが実際にheroku run bashで中身を見ても保存されません。

どのようにして保存しデータベースに格納することができるでしょうか?

 もしくは不可能なのでしょうか・・

また、Cloudinaryを使うことでadminからは画像を保存することができています。

該当するソースコード


    def sele_test(request):
    driver_path = '/app/.chromedriver/bin/chromedriver'
    options = Options()
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-extensions')
    options.add_argument('--proxy-server="direct://"')
    options.add_argument('--proxy-bypass-list=*')
    options.add_argument('--start-maximized')
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
   #herokuでこのoptionを付けると保存できるという記事をみたので、意味は理解していませんがとりあえず貼ってみました。
    options.binary = '/app/.apt/usr/bin/google-chrome'

    driver = webdriver.Chrome(executable_path=driver_path, chrome_options=options)
    driver.get('https://weather.yahoo.co.jp/weather/')
    driver.set_window_size(1250, 1036)
    a = driver.save_screenshot('/app/a.png')
    b = driver.save_screenshot('b.png')
    c = driver.save_screenshot('/tmp/c.png')
    UploadedImage.objects.create(image='/app/a.png')
    UploadedImage.objects.create(image='b.png')
    UploadedImage.objects.create(image='/temp/media/b.png')
    try:
        UploadedImage.objects.create(image='/tmp/c.png')
    except:
        pass

 #models.py
class UploadedImage(models.Model):
    image = CloudinaryField('image', blank=True, null=True,
                            folder="media")
    author = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True
    )
    created_at = models.DateTimeField(auto_now_add=True)
    token = models.CharField(max_length=256, null=True, blank=True)
 

   


### 自分で試したこと
色々なオプションを追加したり、たくさんのpathを入れてみました。
また、Cloudinaryを使うことでadminからは画像を保存することができるのですが
screenshotからどのように保存するのかをこの2日試し続けましたが質問させて頂きます。。。。。

何卒お手隙の方よろしくお願い申し上げます。
0

1Answer

heroku run bash はスクリーンショットを保存したのとは別の新しい dyno1 で bash を実行します。そこにはファイルは存在しません。スクリーンショットを撮った直後であれば、その dyno にはファイルが存在するので、どこかにアップロードしてください。

なお Heroku の制限により、 dyno が再起動するとデプロイ時に存在したファイル以外は消去されるため、スクリーンショットも消えます。

  1. Heroku 用語でいうマシンのこと

0Like

Comments

  1. @uasiさんご回答心から感謝します。ありがとうございます。

    dynoについて調べてみたらこのように書いてありました。


    '''
    一時的なファイルシステム
    各 dyno には、最も最近デプロイされたコードの新しいコピーが含まれる、独自の一時的なファイルシステムがあります。dyno の生存期間中、実行中のプロセスでこのファイルシステムを一時的なスクラッチパッドとして使用できますが、書き込まれたファイルは他の dyno のプロセスでは表示されず、書き込まれたすべてのファイルは dyno が停止または再起動した時点で破棄されます。この破棄は、アプリケーションのデプロイによって dyno が置き換えられるたび、および通常の dyno 管理の一環としておよそ一日一回発生します。'''


    heroku run bashは別のdynoを使うからheroku run bash自体は使わずに
    どのようにしてスクリーンショットが一時的に保存された場所(dyno)にアクセスするのでしょうか...?
    もし、お時間ありましたらご回答よろしくお願いします。。。
  2. できました。。。。。。。。泣

    ありがとうございます!!!

    感謝しかありません。

    大変勉強になりました。
    ありがとうございました!精進します。

Your answer might help someone💌