Tys*_*aul 2 node.js selenium-chromedriver selenium-webdriver aws-lambda
几天前,我们收到了有关“ Lambda操作通知”的通知,将我们的Node.js 8.10运行时更新为Node.js 10.x运行时。
响应此通知,我们在开发系统中安装了Node.js版本v10.16.3,并测试了现有代码。我们发现代码在我们的开发系统中运行良好,但是当我们在带有Node.js 10.x运行时的AWS Lambda中测试相同的代码时,出现以下错误:
2019-10-28T12:03:31.771Z 8e2472b4-a838-4ede-bc70-a53aa41d9b79 INFO错误:服务器在EarlyTermination.catch.e(/ var / task / node_modules / selenium-webdriver / remote / index。 js:251:52)在process._tickCallback(内部/进程/next_tick.js:68:7)
'aws-sdk','selenium-webdriver'npm软件包和google chrome二进制文件是我们项目中唯一使用的依赖项。
我们的项目具有以下文件结构。
/var/task/
??? index.js
??? lib
? ??? chrome
? ??? chromedriver
? ??? libgconf-2.so.4
? ??? libORBit-2.so.0
? ??? libosmesa.so
??? node_modules
??? selenium-webdriver
??? ...
Run Code Online (Sandbox Code Playgroud)
由于此代码不会在我们的开发系统中引发任何错误,因此我们怀疑它与新的运行时有关。
我们尝试使用setChromeBinaryPath()设置二进制路径
这是我们正在使用的代码。调用build()方法时发生错误。
var webdriver = require('selenium-webdriver');
var chrome = require('selenium-webdriver/chrome');
var builder = new webdriver.Builder().forBrowser('chrome');
var chromeOptions = new chrome.Options();
const defaultChromeFlags = [
'--headless',
'--disable-gpu',
'--window-size=1280x1696', // Letter size
'--no-sandbox',
'--user-data-dir=/tmp/user-data',
'--hide-scrollbars',
'--enable-logging',
'--log-level=0',
'--v=99',
'--single-process',
'--data-path=/tmp/data-path',
'--ignore-certificate-errors',
'--homedir=/tmp',
'--disk-cache-dir=/tmp/cache-dir'
];
chromeOptions.setChromeBinaryPath("/var/task/lib/chrome");
chromeOptions.addArguments(defaultChromeFlags);
builder.setChromeOptions(chromeOptions);
var driver = await builder.build();
Run Code Online (Sandbox Code Playgroud)
我们最近面临着完全相同的问题。从Node v8.x升级到AWS Lambda Node v10.x之后,chrome和chromedriver停止工作。简而言之,根本原因是Lambda Node 10.x在Amazon Linux 2上运行,而Lambda Node v8在Amazon Linux上运行。与以前的版本相比,Amazon Linux 2缺少许多软件包,使其更加轻巧,但同时如果您要设置自定义运行时环境,则很麻烦。在我给出解决此问题的步骤之前,让我首先重点介绍一些有用的链接,这些链接可以帮助我找到正确的二进制文件集,这些二进制文件也必须包含在lambda部署程序包中。
只要记住!解决此问题的方法是找出Lambda部署程序包中缺少哪些二进制文件并将其添加。
因此,这是您需要做的:
sudo yum install -y yum-utils rpmdevtoolscd /tmp mkdir lib cd libyumdownloader --resolve GConf2 glibc glib2 libblkid libffi libgcc libmount libsepol libstdc++ libuuid pcre zlib libselinux dbus-glib mozjs17 polkit polkit-pkla-compat libX11 libX11-common libXau libxcb fontconfig expat fontpackages-filesystem freetype stix-fonts gnu-free-sans-fonts fontpackages-filesystem gnu-free-fonts-common nss nspr nss-softokn nss-softokn-freebl nss-util dbus-libs audit-libs bzip2-libs cracklib elfutils-libelf elfutils-libs libattr libcap libcap-ng libcrypt libdb libgcc libgcrypt libgpg-error libsepol lz4 pam systemd-libs xz-libs mesa-libOSMesa-devel mesa-libOSMesa mesa-libglapi sqliterpmdev-extract *rpmsudo mkdir -p /var/tasksudo chown ec2-user:ec2-user /var/taskcd /var/taskmkdir libmkdir fonts/bin/cp /tmp/lib/*/usr/lib64/* /var/task/lib/bin/cp /tmp/lib/*/lib64/* /var/task/lib/bin/cp /tmp/lib/*/usr/share/fonts/*/*.ttf /var/task/fontszip -r ./lib.zip ./*<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/var/task/fonts/</dir>
<cachedir>/tmp/fonts-cache/</cachedir>
<config></config>
</fontconfig>
Run Code Online (Sandbox Code Playgroud)
process.env.FONTCONFIG_PATH = `${process.env.LAMBDA_TASK_ROOT}/fonts`;
if (process.env.LD_LIBRARY_PATH.startsWith("/var/task/lib:") !== true) {
process.env.LD_LIBRARY_PATH = [...new Set(["/var/task/lib", ...process.env.LD_LIBRARY_PATH.split(':')])].join(':');
}
Run Code Online (Sandbox Code Playgroud)
docker pull lambci/lambdadocker run --rm -v "$THE_LOCAL_DIR_OF_YOUR_UNCOMPRESSED_LAMDA_PACKAGE":/var/task lambci/lambda:nodejs10.x index.handler
Run Code Online (Sandbox Code Playgroud)
const childProcess = require('child_process');
childProcess.execFileSync(`${process.env.LAMBDA_TASK_ROOT}/lib/chrome`);
Run Code Online (Sandbox Code Playgroud)
这是一个繁琐的过程,但是最终,您要做的就是将更多的二进制文件添加到程序包中,并在处理程序中添加3行代码以更新lib和fonts环境变量。
以防万一,在下面添加我们正在使用的chrome标志:
const defaultChromeFlags = [
"--headless",
"--disable-gpu",
"--window-size=1280x1024",
"--no-sandbox",
"--user-data-dir=/tmp/user-data",
"--hide-scrollbars",
"--enable-logging",
"--v=99",
"--single-process",
"--data-path=/tmp/data-path",
"--ignore-certificate-errors",
"--homedir=/tmp",
"--disk-cache-dir=/tmp/cache-dir"
];
Run Code Online (Sandbox Code Playgroud)
祝好运!
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |