playwright 在 Centos 的安裝和問題處理

杨腾發表於2024-05-10

前言

近期在公司提供的 Centos7 伺服器上完成了 playwright 的安裝,安裝過程磕磕絆絆,回過頭去翻官方說明文件才發現 Centos 並不在支援的系統範圍裡,加上使用的是一個相對純淨的映象,使用預設的依賴安裝命令都會報錯,我這記錄下遇到的問題和安裝過程。主要是以下幾個問題:

  • 執行 playwright 提示缺失 GLIBC 庫
  • 安裝 GLIBC 提示需要升級 gcc 和 make 版本
  • 安裝 CXXABI 庫
  • 安裝 playwright 瀏覽器提示缺失依賴
  • 升級和安裝完成後導致系統中文字元亂碼

下邊詳細說下我的安裝過程

playwright 安裝

playwright 安裝只涉及到以下兩個命令(我使用的是 python 版本)

pip3 install playwright
playwright install

執行 playwright 提示缺失 GLIBC 庫

完第一步安裝以後,執行 playwright 會提示

/root/ui_test/lib/python3.9/site-packages/playwright/driver/node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by /root/ui_test/lib/python3.9/site-packages/playwright/driver/node)
/root/ui_test/lib/python3.9/site-packages/playwright/driver/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /root/ui_test/lib/python3.9/site-packages/playwright/driver/node)
/root/ui_test/lib/python3.9/site-packages/playwright/driver/node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /root/ui_test/lib/python3.9/site-packages/playwright/driver/node)
/root/ui_test/lib/python3.9/site-packages/playwright/driver/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /root/ui_test/lib/python3.9/site-packages/playwright/driver/node)
/root/ui_test/lib/python3.9/site-packages/playwright/driver/node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by /root/ui_test/lib/python3.9/site-packages/playwright/driver/node)
/root/ui_test/lib/python3.9/site-packages/playwright/driver/node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by /root/ui_test/lib/python3.9/site-packages/playwright/driver/node)

主要提示的內容是 GLIBC 和 CXXABI 這兩個缺失動態連結庫的特定版本,既然缺失的話,我們補充安裝這兩個連結庫既可以。

wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar -xzvf glibc-2.28.tar.gz
cd glibc-2.28

## 建立臨時檔案
mkdir build && cd build
## 編譯這一步一般會提示編譯工具過舊
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-werror

make
make install

直接安裝會提示編譯工具過舊

These critical programs are missing or too old: make compiler

需要先做如下處理

安裝 GLIBC 提示需要升級 gcc 和 make 版本

升級 gcc

# 安裝devtoolset-8-gcc
 yum install centos-release-scl
 yum install devtoolset-8
 scl enable devtoolset-8 -- bash

# 啟用工具
 source /opt/rh/devtoolset-8/enable 

# 安裝GCC-8
 yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils

# 設定環境變數
 echo "source /opt/rh/devtoolset-8/enable" >> /etc/profile
 source /etc/profile

升級 make

# 下載並解壓安裝包
 wget https://ftp.gnu.org/gnu/make/make-4.3.tar.gz
 tar -xzvf make-4.3.tar.gz 
 cd make-4.3/

# 安裝到指定目錄
 ./configure  --prefix=/usr/local/make
 make
 make install 

# 建立軟連結
 cd /usr/bin/
 mv make make.bak # backup
 ln -sv /usr/local/make/bin/make /usr/bin/make

完成後再重新執行第一步的編譯即可

安裝 CXXABI 庫

接下來繼續完成 CXXABI 庫安裝

# 建立臨時安裝檔案目錄
mkdir -p ~/work && cd ~/work
yum install libstdc++.so.6 -y
# 檢視動態連結庫 -- 發現並沒有需要的1.3.9
strings /usr/lib/libstdc++.so.6 | grep 'CXXABI'
# 下載需要的版本庫,之後軟連線到執行系統上
wget http://ftp.de.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.3.0-6_amd64.deb
ar -x libstdc++6_8.3.0-6_amd64.deb
tar -xvf data.tar.xz
cp usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25 /usr/lib64/
find / -name "libstdc++*"
# 刪除低版本庫的軟連線
rm -rf /usr/lib64/libstdc++.so.6
ll /usr/lib64/libstd*
ln -s /usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6

# 移除臨時安裝檔案目錄
cd ~ && rm -rf ~/work
# 或者刪除檔案與目錄
rm -rf glibc-2.28 usr make-4.3 libstdc++6_8.3.0-6_amd64.deb make-4.3.tar.gz glibc-2.28.tar.gz data.tar.xz control.tar.xz
# 檢驗
playwright install

安裝 playwright 瀏覽器提示缺失依賴

接著上邊命令執行 playwright install 就不會報錯了,但是再執行 playwright 會提示缺失依賴

BrowserType.launch: 
╔══════════════════════════════════════════════════════╗
║ Host system is missing dependencies to run browsers. ║
║ Please install them with the following command:      ║
║                                                      ║
║     playwright install-deps                          ║
║                                                      ║
║ Alternatively, use apt:                              ║
║     apt-get install libatk1.0-0\                     ║
║         libatk-bridge2.0-0\                          ║
║         libatspi2.0-0\                               ║
║         libxcomposite1\                              ║
║         libxdamage1\                                 ║
║         libxfixes3\                                  ║
║         libxrandr2\                                  ║
║         libgbm1\                                     ║
║         libxkbcommon0\                               ║
║         libpango-1.0-0\                              ║
║         libcairo2                                    ║
║                                                      ║
║ <3 Playwright Team                                   ║
╚══════════════════════════════════════════════════════╝

上邊提示的缺失依賴包都是 Ubuntu 的,我使用 Centos 的話需要按照對應的依賴

yum -y install libXcomposite libXtst gtk3 atk at-spi2-atk cups-libs libxkbcommon libXdamage libXrandr mesa-libgbm alsa-lib-devel

yum -y install fontconfig
yum -y install cjkuni-ukai-fonts cjkuni-uming-fonts
fc-cache -fv

升級和安裝完成後導致系統中文字元亂碼

一般完成如上安裝升級再執行 playwright 就不會報錯了,但是我的測試整合在 Jenkins 上,放的是一箇中文資料夾,實際構建的時候又出現了下邊的報錯

Caused by: java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: /var/lib/jenkins/workspace/????????????-???????????????
    at java.base/sun.nio.fs.UnixPath.encode(UnixPath.java:145)
    at java.base/sun.nio.fs.UnixPath.<init>(UnixPath.java:69)
    at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:279)
    at java.base/java.io.FilePermission.<clinit>(FilePermission.java:207)

中文部分都是問號,看起來是系統中文字元編碼出了問題,也不知道是哪個升級環節影響了,一番查詢後,使用下邊這個命令解決了。

localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

如上就是這一次的安裝記錄,希望能幫助遇到同樣問題的夥伴。

相關文章