GitHub 上使用 Chrome 修复 Selenium 中的 DevToolsActivePort 文件错误

ChromeDriver

克服 CI/CD 管道中的 Chrome 测试失败

运行 Selenium 测试 在 应该是无缝的。然而,许多开发人员面临着令人沮丧的“DevToolsActivePort 文件不存在”错误。当 Chrome 由于某种原因无法在 CI 环境中正常启动时,就会发生这种情况。

该错误消息通常表示 Chrome 意外崩溃,这通常是由于不匹配造成的 和 测试设置中的版本或配置错误的选项。和许多开发人员一样,我也遇到过这个挑战,特别是在部署自动化测试时 环境。

在此设置中,最微小的偏差(例如 ChromeDriver 版本不匹配)都可能导致测试执行停止,从而浪费宝贵的时间和资源。幸运的是,了解根本问题可以让解决问题变得更容易🛠️。

在本指南中,我们将深入探讨预防和解决这一常见错误的实际步骤。从 Chrome 安装细节到正确的驱动程序初始化,您将找到一个分步过程,以确保每次测试都能顺利运行。让我们解决这个问题,让您的测试重回正轨!

命令 使用示例
CHROME_VERSION="117.0.5938.62" 设置特定的 Chrome 版本,这对于在 CI 测试期间确保 ChromeDriver 兼容性至关重要,以防止 Chrome 和 ChromeDriver 之间不匹配。
MAJOR_VERSION=$(echo $CHROME_VERSION | cut -d '.' -f1) 从完整的 Chrome 版本中提取主要版本号。这用于下载匹配版本的 ChromeDriver,确保兼容性。
LATEST_DRIVER=$(wget -qO- ...) 获取指定 Chrome 版本的最新兼容 ChromeDriver 版本,这对于避免自动化脚本中的“DevToolsActivePort”错误至关重要。
if [ -z "$LATEST_DRIVER" ] 检查 ChromeDriver 版本变量是否为空,这表明获取兼容版本时出现错误。这种情况有助于应用回退以防止测试失败。
sudo dpkg -i $CHROME_DEB 使用 dpkg 安装下载的 Chrome 软件包,这在 GitHub Actions 等 Linux 环境中特别有用。
sudo rm -f /usr/local/bin/chromedriver 删除任何以前安装的 ChromeDriver。这可确保新安装期间不会出现版本冲突。
options.addArguments("--no-sandbox") 禁用 Chrome 沙箱功能。这在 CI 环境中尤其重要,因为沙箱可以阻止 Chrome 以无头模式启动。
options.addArguments("--disable-dev-shm-usage") 通过禁用 /dev/shm 使用来增加可用共享内存,这可以防止 Chrome 在内存有限的环境(如容器)中崩溃。
options.addArguments("--remote-debugging-port=9222") 在指定端口上启用远程调试。这是无头 Chrome 在某些环境中正常工作的要求,以防止“DevToolsActivePort”错误。
driver.quit() 关闭所有 Chrome 窗口并结束 WebDriver 会话,释放资源。这在 CI/CD 管道中至关重要,可以防止资源泄漏并避免耗尽可用内存。

CI 中 Chrome 和 ChromeDriver 设置的详细解决方案

上面的脚本旨在安装和配置 Chrome 和 ChromeDriver 环境,特别是解决“DevToolsActivePort 文件不存在”错误。当在无头模式下运行的 Chrome 由于不匹配或内存限制而无法正确启动时,通常会出现此问题。第一个脚本通过指定 Chrome 版本并确保其与 ChromeDriver 的兼容性来解决此问题,这对于运行至关重要 测试。初始命令执行 apt 软件包的更新,并使用 wget 从镜像获取特定版本的 Google Chrome。使用镜像可确保安装正确的版本,特别是在默认存储库缺少此版本的情况下。这种方法可以保证在不同的测试运行中使用一致的 Chrome 版本。

接下来,脚本通过使用解析命令将主要版本与 Chrome 隔离(例如,“117”与“117.0.5938.62”)来安装版本兼容的 ChromeDriver。这允许脚本使用专为 ChromeDriver 版本设计的 URL 模式来获取该特定主要版本所需的确切 ChromeDriver。通过确保这些版本对齐,设置可以防止不匹配的版本导致 ChromeDriver 初始化失败,这通常会触发 DevTools 错误。如果 ChromeDriver 无法下载特定版本,该脚本会包含一个后备选项来下载最新版本,从而保持灵活性。这些步骤在自动化 CI/CD 管道中特别有用,其中快速可靠的解决方案是优先考虑的🔧。

下载后,该脚本会使用“sudo rm -f”从系统中删除任何以前安装的 ChromeDriver,以避免与旧驱动程序发生冲突。这可确保仅使用正确的版本,从而最大限度地减少可能破坏测试稳定性的版本冲突风险。 ChromeDriver 的权限也设置为可执行,这是在 CI/CD 环境中启动驱动程序的必要步骤。在“无头”模式下使用 Chrome 以及“--no-sandbox”和“--disable-dev-shm-usage”等选项也可以减少 Chrome 的资源占用。这些选项使测试能够在资源有限的环境(例如云​​服务器或 CI 管道)中运行,而不会导致 Chrome 崩溃,这是 DevToolsActivePort 错误背后的常见原因之一。

最后,在 WebDriver 设置中,“--disable-gpu”和“--remote-debugging-port=9222”等选项可确保 Chrome 在无头模式下运行更稳定。 “--disable-gpu”标志禁用 GPU 渲染,这在无头模式下是不必要的,有时还会出现问题。同时,“--remote-debugging-port”选项允许 Chrome 打开 Selenium 在 CI 中连接到它所必需的调试端口。总之,这种设置可以防止常见的自动化瓶颈,从而实现更可靠、更强大的测试环境。因此,这些脚本使得在 CI/CD 系统上运行无头 Chrome 成为一种更加流畅的体验,确保自动化测试一致运行,不会出现任何问题。

解决 GitHub Actions 上的 Selenium 测试中的“DevToolsActivePort 文件不存在”错误

解决方案1:Chrome和ChromeDriver的安装和配置脚本

sudo apt-get update
sudo apt-get install -y wget apt-transport-https curl
CHROME_VERSION="117.0.5938.62"
CHROME_DEB="google-chrome-stable_${CHROME_VERSION}-1_amd64.deb"
wget https://mirror.cs.uchicago.edu/google-chrome/pool/main/g/google-chrome-stable/$CHROME_DEB
sudo dpkg -i $CHROME_DEB || sudo apt-get install -f -y
# Install ChromeDriver matching Chrome
sudo apt-get install -y wget unzip
MAJOR_VERSION=$(echo $CHROME_VERSION | cut -d '.' -f1)
LATEST_DRIVER=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$MAJOR_VERSION)
if [ -z "$LATEST_DRIVER" ]; then
  echo "Falling back to latest ChromeDriver version."
  LATEST_DRIVER=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE)
fi
sudo rm -f /usr/local/bin/chromedriver
wget https://chromedriver.storage.googleapis.com/$LATEST_DRIVER/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver

在无头模式下使用 Java 为 GitHub Actions 设置 WebDriver

解决方案 2:配置 Chrome 选项并用 Java 初始化 WebDriver

// Import necessary libraries
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import io.github.bonigarcia.wdm.WebDriverManager;
// Set up ChromeDriver
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--remote-debugging-port=9222");
ChromeDriver driver = new ChromeDriver(options);
// Start Selenium test logic here
driver.quit();

添加单元测试以验证 Chrome 和 WebDriver 兼容性

解决方案 3:单元测试以确保兼容性并防止 CI 执行期间出现错误

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
class WebDriverTests {
  private WebDriver driver;
  @BeforeEach
  void setUp() {
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    options.addArguments("--no-sandbox");
    driver = new ChromeDriver(options);
  }
  @Test
  void testDriverInitialization() {
    driver.get("https://www.google.com");
    assertEquals("Google", driver.getTitle());
  }
  @AfterEach
  void tearDown() {
    driver.quit();
  }
}

使用 GitHub Actions 和 Headless Chrome 优化 Selenium 测试

跑步的一个重要方面 在 GitHub Actions 等 CI/CD 管道中使用 Selenium 正在了解环境限制。在无头模式下运行 Chrome 意味着它无需图形界面即可运行,非常适合 CI 环境。然而,与本地环境相比,无头 Chrome 对系统配置更敏感,并且需要额外的设置。 “DevToolsActivePort 文件不存在”错误通常与 Chrome 初始化失败有关,通常是由于内存限制或配置不匹配造成的。实现内存高效配置,例如 和 有助于克服这些问题,并可以显着稳定内存有限的 CI/CD 环境中的测试。

为了确保兼容性,必须保持 Chrome 和 ChromeDriver 版本一致。版本不一致是 GitHub Actions 中常见的错误来源,因为运行程序可能默认使用最新版本,这可能不符合 ChromeDriver 要求。为了解决这个问题,我们的解决方案包括解析主要 Chrome 版本以获取对应的确切 ChromeDriver 版本,从而提高稳定性。另外,设置 通过启用通信端口,ChromeDriver 可以更可靠地与浏览器交互。当使用 GitHub Actions 或类似工具自动运行时,此设置至关重要 在虚拟机上。

这些配置极大地提高了效率、减少了错误并提高了测试运行的可靠性。通过确保资源高效选项并使用正确的版本,无头 Chrome 运行更有可能成功执行,从而使开发人员免于在测试过程中处理令人沮丧的错误。最终,强大的配置和兼容的依赖关系使 CI/CD 测试体验更加顺畅,使开发人员能够专注于创建和改进他们的应用程序,而不会受到持续设置问题的干扰。

  1. 错误“DevToolsActivePort 文件不存在”是什么意思?
  2. 当 Chrome 无法在无头模式下正常启动时,就会出现此错误,通常是由于设置不匹配或缺乏系统资源。调整内存选项,例如 经常能解决。
  3. 为什么匹配 Chrome 和 ChromeDriver 版本很重要?
  4. 匹配版本可以避免兼容性错误。使用 获取特定的 ChromeDriver 可确保它们顺利协同工作。
  5. 怎么样 有助于无头测试?
  6. 它使 Chrome 的端口能够由 ChromeDriver 控制,从而允许测试更有效地连接浏览器实例并防止 DevTools 错误。
  7. 什么是 做?
  8. 这会禁用 Chrome 的沙盒,这有助于 Chrome 在 CI 环境中启动,因为沙盒有时会导致无头 Chrome 在受限环境中崩溃。
  9. 如果 ChromeDriver 版本下载失败,是否有后备方案?
  10. 是的,我们的脚本包含一个使用的后备 如果匹配版本失败,请确保 ChromeDriver 可用,无论安装的 Chrome 版本如何。
  11. 如何避免 CI/CD 管道中与 Chrome 内存相关的问题?
  12. 使用 重定向共享内存,防止 Chrome 由于 CI 环境中 /dev/shm 空间有限而崩溃。
  13. 我可以在无头模式下调试 Chrome 吗?
  14. 是的,使用 在本地运行测试可以让您打开 Chrome DevTools 以在无头模式下进行调试。
  15. WebDriverManager 是否自动处理 ChromeDriver 更新?
  16. WebDriverManager 在本地简化了驱动程序更新,但在 CI/CD 管道中,设置特定版本(如图所示)对于可重复构建来说更可靠。
  17. 目的是什么 在脚本中?
  18. 此命令通过关闭 Chrome 并结束 WebDriver 会话来释放资源,从而防止 CI/CD 环境中的内存泄漏。
  19. 在提交之前如何在 GitHub Actions 上测试我的 Selenium 设置?
  20. 在本地运行测试 选项和 CI 配置可以在推送到 GitHub 之前捕获问题,从而使调试更容易。
  21. CI 中的 ChromeDriver 需要哪些权限?
  22. ChromeDriver需要执行权限,设置为 ,在 GitHub Actions 中成功运行测试。

确保在 GitHub Actions 上使用无头 Chrome 正确设置 Selenium 测试可以节省时间并提高可靠性。解决诸如“DevToolsActivePort 文件不存在”之类的错误可以使 CI/CD 测试更加无缝,减少开发人员的挫败感。

通过对齐 和 Chrome 版本并配置内存高效选项,此方法有助于在受限环境中高效运行测试。这是一个实用的解决方案,可以让开发人员专注于他们的核心任务,而不必担心测试中断🚀。

  1. 有关在 CI/CD 环境的无头 Chrome 中处理 DevToolsActivePort 问题的详细故障排除指南。 Selenium WebDriver 文档
  2. 持续集成设置中 Chrome 和 ChromeDriver 版本的全面安装和配置说明,由 GitHub 操作文档
  3. ChromeDriver 设置、兼容性和配置选项的分步解决方案可在 WebDriverManager 文档
  4. 有关配置无头 Chrome 以提高 CI/CD 内存效率(尤其是在受限环境中)的最佳实践的参考。阅读更多内容 谷歌浏览器开发者指南