当前位置: 首页 > 知识库问答 >
问题:

硒/铬/铬(86)发行AWS Lambda

郜昊苍
2023-03-14

我在过去的一周里一直在处理这个问题,脑子里想不起来,所以我决定寻求帮助。我正在尝试使用Chromium 86构建在AWS Lambda中运行Selenium。我不断收到的错误消息如下:

{
  "errorMessage": "Message: unknown error: Chrome failed to start: exited abnormally.\n  (chrome not reachable)\n  (The process started from chrome location /opt/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)\n",
  "errorType": "WebDriverException"
}

以下是我的版本:

Selenium 3.14
Chromium 86.0.4240.0 (https://github.com/vittorio-nardone/selenium-chromium-lambda/blob/master/chromium.zip) which is forked from (https://github.com/puppeteer/puppeteer)
Chromedriver 86.0.4240.22.0 (https://chromedriver.storage.googleapis.com/index.html?path=86.0.4240.22/)

这是我的代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    chrome_options = webdriver.ChromeOptions()
#   chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("disable-infobars")
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--window-size=1024x768')
    chrome_options.add_argument('--user-data-dir=/tmp/user-data')
    chrome_options.add_argument('--profile-directory=/tmp')
    chrome_options.add_argument('--hide-scrollbars')
    chrome_options.add_argument('--enable-logging')
    chrome_options.add_argument('--log-level=0')
    chrome_options.add_argument('--v=99')
#   chrome_options.add_argument('--single-process')
    chrome_options.add_argument('--data-path=/tmp/data-path')
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_argument('--homedir=/tmp')
    chrome_options.add_argument('--disk-cache-dir=/tmp/cache-dir')
    chrome_options.add_argument('user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.3163.100 Safari/537.36')
    chrome_options.add_argument('--remote-debugging-port=9222')
    chrome_options.binary_location = "/opt/bin/chromium"

    driver = webdriver.Chrome(executable_path="/opt/bin/chromedriver",options=chrome_options)
    driver.get('https://www.google.com/')

到目前为止我已经尝试过的事情:

  1. 尝试了各种运行时Python 3.6、3.7、3.8,但没有成功
  2. 尝试使用和不使用Lambda层。尝试使用Lambda逐层文件夹结构时相对简单:
.
├── bin
│   ├── chromedriver (binary)
│   └── chromium (binary)
└── python
    ├── selenium
    ├── selenium-3.14.0.dist-info
    ├── urllib3
    └── urllib3-1.26.7.dist-info

Chrome驱动程序和Chromium二进制文件不在aws lambda上工作

WebDriverException:消息:未知错误:Chrome无法启动:在Amazon Linux上通过Selenium Python使用ChromeDriver Chrome时出错。。等

我唯一注意到的是,如果我使用某些参数,有时它会抛出selenium。常见的例外情况。WebDriverException:消息:未知错误:无法在chrome中发现打开的窗口,而不是chrome无法启动:异常退出。作为我的最后一个想法,我正在考虑编译自己的Chrome86版本。有没有人能够在AWS Lambda上运行build 86或更高版本?

共有1个答案

施晗日
2023-03-14

我花了几天时间试图找出我的整个设置中可能存在的问题。是密码吗?我使用lambda/layers的方式?二进制文件?运行时环境?运动部件太多,我不想退回到Chromium 6x(这是我最后一次工作设置),因为这是非常古老的,我需要的某些功能并不存在。。类似于Chrome DevTools协议的功能。

然后,我偶然发现了这个存储库,其中讨论了如何将Amazon ECS与Lambda结合使用:

https://github.com/umihico/docker-selenium-lambda

基本上在几分钟内,我就可以设置链接到Lambda的容器图像,并且它正在运行:

  1. Python 3.9.8

然后我移植了我的函数代码,通过一些更改,我终于设法让它工作了!以下是我的工作参数:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-dev-tools')
chrome_options.add_argument('--remote-debugging-port=9222')
chrome_options.add_argument('--window-size=1280x1696')
chrome_options.add_argument('--user-data-dir=/tmp/chrome-user-data')
chrome_options.add_argument('--single-process')
chrome_options.add_argument("--no-zygote")
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.binary_location = "/opt/chrome/chrome"

driver = webdriver.Chrome
driver = webdriver.Chrome("/opt/chromedriver",options=chrome_options)
driver.get('https://www.google.com/')

此设置与纯Lambda之间的主要区别在于,您使用ECS(基于容器)图像,并且您不是运行无头chrome或无服务器chrome,而是从chrome快照运行守护进程。

https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html

 类似资料:
  • 也许有人可以帮助Windows、Python、Selenium和使用Chrome webdriver与ChromePortable。 我定义了一个新文件夹 你知道吗?提前谢谢你,祝你一天愉快安德烈亚斯

  • 运行我能想到的最基本的硒测试。 我在使用, Chrome版本52.0.2743.82M ChromeDriver 2.22 Selenium WebDriver 2.53.1 Selenium WebDriver支持类2.53.1 Win10(最近升级) 我已经尝试卸载和重新安装chrome和删除用户配置文件。 我得到的错误是, 测试名称:TestMethod1测试全名:UnitTestProje

  • 作为项目设置的一部分,我有两个项目,一个作为库,另一个作为Selenium。我在libraries项目中设置了所有浏览器,其中/src/main/resource具有chromedriver。exe Selenium项目具有所有pagefactory类,并且该项目依赖于库。但是,当我在从属服务器上运行project时,我收到以下错误消息:

  • 我使用Selenium和PhantomJS开发了几个Python脚本。当我转向自动下载时,我切换到了(headed)Firefox(有效),然后是Chrome,有了headless选项,这样浏览器就不会在我面前打开了。 我的第一个脚本访问一个页面和几个HTML元素,与无头Chrome完美地工作。 第二个,然而,工作与头铬。如果我加上“无头”选项,它就不再起作用了。当我试图以headless模式打印

  • 我在使用html2canvas。js库,用于与selenium一起拍摄全页屏幕截图。 我保存了html2canvas。我的java项目的类路径中的js文件。我用来获取屏幕截图的java脚本代码是: 我能够捕获flipkart页面的全页屏幕截图,但其中没有任何图像。 我无法使用Chrome的TakeScreenshot实用程序,因为它不允许使用Chrome浏览器拍摄整页屏幕截图。

  • 我试图在Ubuntu 16.10服务器上运行selenium,但收到WebDriverException:消息:chrome不可访问(驱动程序信息:chromedriver 2.9.248304,platform=Linux 4.8.0-22-generic x86_64) Chrome安装: 谷歌浏览器57.0.2987.110