Python Selenium - 在无图形Linux机器上使用selenium的几种方案

探讨了在无图形Linux环境中使用ChromeHeadless进行Web自动化测试的方法,并对比了PhantomJS,介绍了如何安装配置及其实现的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究爬虫的时候,用到了chrome headless,于是想到PhantomJS停止维护了,headless Chrome能否完全替代PhantomJS,是否需要其他的驱动安装呢?做了一些简单的实验并记录一下在无图形Linux机器上使用selenium的几种方案。


为什么我们要无头启动浏览器?

在无图形的Linux机器上使用selenium运行自动化用例,将能够节约资源和执行时间。

1) 可以将大量自动化用例串行发布到多台精简的Linux机器(Lean,VM)上执行

2) 隐式执行web自动化用例的效率比启动浏览器要快,无论是加在页面元素还是执行javascript脚本等。


怎么做?下面列出一些解决方案。

PhantomJS 

- http://phantomjs.org/, 相信也是chrome支持headless之前,大多数人采用的解决方案。

brew install phantomjs
from pyvirtualdisplay import Display
from selenium import webdriver

driver = webdriver.PhantomJS()
driver.set_window_size(1920, 1080)
driver.get("https://www.baidu.com/")
driver.find_element_by_id('kw').send_keys("鲁冰花")
driver.find_element_by_id("su").click()
print driver.current_url
driver.quit()


Xvfb 和 PyVirtualDisplay

使用这个解决方案,将可以兼容多种浏览器的webdriver,chrome,firefox,等等
yum/apt-get install Xvfb
pip install PyVirtualDisplay

检查DISPLAY设置,默认应该是 :1 

env | grep DISPLAY
from pyvirtualdisplay import Display 
display = Display(visible=0, size=(1920, 1080)) 
display.start() 
driver = webdriver.Chrome(driver_path='<path-to-driver>/chromedriver') # driver = webdriver.Firefox() ...
driver.get('https://www.baidu.com') 
print(driver.title) 
driver.quit()
display.stop()

Chrome Headless

最新版的chrome支持headless模式,这导致phamtomJS的维护者中止了该项目的维护。 :( 实验时候发现Chrome Headless除了新版的google-chrome和chromedriver之外,不需要额外安装其他组件或驱动。在headless模式下,可以实现所有操作,完美替代PhantomJS。

更新google-chrome到最新版,下载新版chromedriver

yum update google-chrome
wget https://chromedriver.storage.googleapis.com/2.35/chromedriver_linux64.zip
unzip chromedriver_linux64.zip

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') 
chrome_options.add_argument('--no-sandbox')  
driver = webdriver.Chrome(driver_path='<path-to-driver>/chromedriver', chrome_options=chrome_options,
  service_args=['--verbose', '--log-path=<path-to-log>/chromedriver.log'])
...

headless模式下,chromedriver会打印一行错误信息,

[0515/160034.252:ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context.

这是因为在headless模式下,浏览器无法调用GPU的接口。

这导致基于类似WebGL实现的应用,没办法在chrome headless模式下完成element捕捉。(也许有解决方案,但是尚未学习到。)


想要了解更多chrome headless的信息:

https://developers.google.com/web/updates/2017/04/headless-chrome 

### 在 Linux 系统下运行 Selenium 的方法 Linux 系统完全支持运行 Selenium 自动化测试工具。为了在 Linux 上成功运行 Selenium,通常需要完成以下几个方面的准备工作:安装必要的依赖项、配置 Chrome 或 Firefox 浏览器及其对应的驱动程序(如 Chromedriver)、设置无头模式(Headless Mode),或者通过虚拟显示服务器(Xvfb)实现有头模式运行。 以下是详细的说明和操作步骤: --- #### 1. 安装浏览器及相关驱动 要使 Selenium 正常工作,首先需要确保系统中已安装目标浏览器(例如 Google Chrome 或 Mozilla Firefox)。对于 Chrome 用户来说,还需要额外下载并配置适合的 Chromedriver 版本。 ##### (1)安装 Google Chrome 可以通过官方仓库或其他可信资源获取最新版 Chrome 浏览器包进行安装[^1]。 ```bash wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome*.deb; sudo apt-get -f install ``` ##### (2)安装 Chromedriver Chromedriver 是用于控制 Chrome 浏览器的核心组件之一。将其放置至系统的 PATH 下以便 Python 脚本能自动定位它[^2]。 ```bash unzip chromedriver_linux64.zip && chmod +x chromedriver sudo mv chromedriver /usr/local/bin/ ``` --- #### 2. 配置无头模式(推荐) 如果是在没有图形界面的远程服务器上部署,则应启用无头模式以避免因缺少 X Window System 支持而产生的错误。 下面是一段简单的 Python 示例代码演示如何开启无头选项: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless") # 启用无头模式 options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在报错问题 options.add_argument('--disable-gpu') # 禁用GPU加速(可选) driver = webdriver.Chrome(options=options) print(driver.title) # 输出页面标题验证连接正常与否 driver.quit() ``` --- #### 3. 使用虚拟帧缓冲区(Xvfb) 实现有头模式 另一种方式是借助 XVFB 工具模拟出完整的桌面环境供传统 GUI 应用程序使用。这种方法特别适用于那些无法良好兼容 headless 参数的老版本软件或插件[^4]。 先安装 xvfb 组件: ```bash sudo apt-get update && sudo apt-get install -y xvfb ``` 接着修改脚本入口命令如下所示即可: ```bash xvfb-run python3 your_script.py -screen 0 1920x1080x24 ``` 此处 `-screen` 参数指定了虚拟屏幕分辨率与颜色深度信息。 --- #### 4. 利用 Docker 构建隔离化的测试环境 对于更复杂项目需求而言,采用容器技术能够极大简化跨平台移植过程同时也增强了安全性保障。具体做法包括但不限于搭建 Selenium Grid 分布式集群架构来管理多个节点设备共同协作完成大规模并发任务[^3]。 简单示例构建单机版 hub+node 结构: ```bash # Pull official images from dockerhub registry. docker pull selenium/hub:latest docker pull selenium/node-chrome-debug:latest # Start services sequentially according to dependency relationship rules. docker run -d --name selenium-hub -p 4444:4444 selenium/hub:latest sleep 5s # Wait until hub fully initialized. docker run -d --link selenium-hub \ -e HUB_HOST=selenium-hub \ -e SCREEN_WIDTH=1920 \ -e SCREEN_HEIGHT=1080 \ -P selenium/node-chrome-debug:latest ``` 之后就可以基于 RemoteWebDriver API 编写客户端请求发送给远端服务端执行相应指令啦! --- ### 总结 综上所述,在不同条件下可以选择多种途径达成目的——无论是轻量级本地开发还是企业级生产环境中都存在可行方案满足各自独特的要求。希望以上介绍对你有所帮助! ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值