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

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

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

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

该错误消息通常表示 Chrome 意外崩溃,这通常是由于不匹配造成的 铬合金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 GitHub 操作 环境,特别是解决“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 初始化失败有关,通常是由于内存限制或配置不匹配造成的。实现内存高效配置,例如 --禁用-dev-shm-用法--无沙箱 有助于克服这些问题,并可以显着稳定内存有限的 CI/CD 环境中的测试。

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

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

在 GitHub Actions 中使用 Chrome 运行 Selenium 的常见问题和解决方案

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

关于配置 Headless Chrome 进行 CI/CD 测试的最终想法

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

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

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