1

tl;Selenium 脚本的 dr chrome 配置文件每次都在非无头模式下工作,但(有时)在无头模式下失败。

我有一个每隔一小时运行一次的 Selenium python 脚本,需要我登录 Instagram。因为我在 Heroku 上部署它(如果 insta 检测到异常登录,我会强制我经常更改密码),我的脚本使用无头 Chrome 浏览器登录一次(从登录屏幕到 insta feed 屏幕)第一次运行,创建一个 chrome 配置文件,然后为我的后续脚本会话运行使用相同的 chrome 配置文件(带有保存的 cookie 等),以消除每次登录的需要。如果它检测到我尚未作为后备登录,它还会在以后的运行中重新登录我。

当我在 MacOS 上本地运行脚本时,我的脚本始终有效headless=False- 第一次运行始终正确登录并创建 chrome 配置文件,该配置文件成功用于在下一次运行中直接进入我的 insta 提要。但是,当我使用 本地(或在 Heroku 中)运行它时headless=True,配置文件有时不会保存我的登录信息(然后我最终需要在下次运行时重新登录)。以下是我传递给我的网络驱动程序的选项:

from selenium import webdriver
import os

def get_chrome_options(self, headless=True):
    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument('--remote-debugging-port=9222') 
    if headless:
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--window-size=1200x762')
    chrome_options.add_argument('--user-data-dir=' + os.getcwd() + '/chrome_profile_1')
    chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN")
    return chrome_options

如果需要,我正在尝试使用该user-data-dir选项创建配置文件(请注意,/chrome_profile_1 在第一次运行之前在 repo 中不存在),如果它已经存在,则检索它。

我已经验证,在我的所有运行中,驱动程序最终都会到达 insta 提要视图,因此我的登录逻辑没有问题。即使在登录没有正确保存的时候,脚本仍然总是成功地创建 chrome_profile 目录。我尝试将我的 chrome_profile_1 直接推送到我的 Heroku 实例,但它也不起作用(我认为 Heroku-buildpack-google-chrome 与我的本地 chrome 实例生成的配置文件不兼容)。

除了最后,我还尝试添加driver.close()一些额外的时间,driver.quit()以防 chrome 无头浏览器的不当关闭可能是无头与非无头运行的区别,但这似乎并不能解决问题。另外,我尝试添加诸如--profile-directory=, 'disable-dev-shm-usage', --hide-scrollbars, --single-process, --ignore-certificate-errors.

PS:在相关说明中,Heroku 似乎在两次运行之间丢弃了创建的 chrome 配置文件目录(https://help.heroku.com/K1PPS2WM/why-are-my-file-uploads-missing-deleted) - 一旦我弄清楚如何正确创建 chrome 配置文件,有没有办法在 Heroku 实例本身的运行之间保存它,或者我必须将它存储在外部,然后在下次运行时将其拉入 Heroku?

4

0 回答 0