使用 Python 的 Selenium - Geckodriver 可执行文件需要位于 PATH 中

2024-11-25 08:49:00
admin
原创
272
摘要:问题描述:我正在阅读 Sweigart 的《用 Python 自动化无聊的事情》一文。我正在使用IDLE,并且已经安装了 Selenium 模块和 Firefox 浏览器。每当我尝试运行 webdriver 函数时,我都会收到以下信息:from selenium import webdriver browse...

问题描述:

我正在阅读 Sweigart 的《用 Python 自动化无聊的事情》一文。我正在使用IDLE,并且已经安装了 Selenium 模块和 Firefox 浏览器。

每当我尝试运行 webdriver 函数时,我都会收到以下信息:

from selenium import webdriver
browser = webdriver.Firefox()

例外:

Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.firefox.service.Service object at 0x00000249C0DA1080>>
Traceback (most recent call last):
  File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 163, in __del__
    self.stop()
  File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 135, in stop
    if self.process is None:
AttributeError: 'Service' object has no attribute 'process'
Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.firefox.service.Service object at 0x00000249C0E08128>>
Traceback (most recent call last):
  File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 163, in __del__
    self.stop()
  File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 135, in stop
    if self.process is None:
AttributeError: 'Service' object has no attribute 'process'
Traceback (most recent call last):
  File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 64, in start
    stdout=self.log_file, stderr=self.log_file)
  File "C:PythonPython35libsubprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "C:PythonPython35libsubprocess.py", line 1224, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified

在处理上述异常的过程中,又发生了另一个异常:

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    browser = webdriver.Firefox()
  File "C:PythonPython35libsite-packagesseleniumwebdriverirefoxwebdriver.py", line 135, in __init__
    self.service.start()
  File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 71, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.

我想我需要设置路径geckodriver,但我不确定如何设置,那么我该怎么做呢?


解决方案 1:

selenium.common.exceptions.WebDriverException:消息:'geckodriver' 可执行文件需要在 PATH 中。

首先,你需要从这里下载最新的可执行 geckodriver,以便使用 Selenium 运行最新的 Firefox

实际上,Selenium 客户端绑定会尝试geckodriver从系统中定位可执行文件PATH。您需要将包含可执行文件的目录添加到系统路径。

  • 在 Unix 系统上,如果您使用与 Bash 兼容的 shell,则可以执行以下操作将其附加到系统的搜索路径:

export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step
  • 在 Windows 上,您需要更新Path 系统变量,以手动或命令行方式添加可执行 geckodriver 的完整目录路径 (将可执行 geckodriver 添加到系统 PATH 后,不要忘记重新启动系统才能生效)。其原理与 Unix 相同。

现在您可以按照如下所示运行代码:-

from selenium import webdriver

browser = webdriver.Firefox()

selenium.common.exceptions.WebDriverException:消息:预期的浏览器二进制位置,但无法在默认位置找到二进制文件,没有提供“moz:firefoxOptions.binary”功能,并且命令行上没有设置二进制标志

异常明确指出您已将 Firefox 安装在其他位置,而 Selenium 正在尝试查找 Firefox 并从默认位置启动,但找不到它。您需要提供明确的 Firefox 安装二进制位置来启动 Firefox,如下所示:-

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('path/to/installed firefox binary')
browser = webdriver.Firefox(firefox_binary=binary)

解决方案 2:

这帮我解决了这个问题。

from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'yourpathgeckodriver.exe')
driver.get('http://inventwithpython.com')

解决方案 3:

这些步骤帮我解决了Ubuntu 和 Firefox 50 上的问题。

  1. 下载geckodriver

  2. 将 geckodriver 复制到文件夹/usr/local/bin

不需要添加:

firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
firefox_capabilities['binary'] = '/usr/bin/firefox'
browser = webdriver.Firefox(capabilities=firefox_capabilities)

解决方案 4:

我看到讨论仍然在谈论通过下载二进制文件并手动配置路径来设置 geckodriver 的老方法。

这可以使用webdriver-manager自动完成

pip install webdriver-manager

现在问题中的上述代码只需进行以下更改即可运行,

from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())

解决方案 5:

在已安装Homebrew的 macOS 上,您只需运行终端命令:

brew install geckodriver

因为 Homebrew 已经扩展了,所以PATH不需要修改任何启动脚本。

解决方案 6:

saurabh 的回答解决了这个问题,但是并没有解释为什么“使用 Python 自动化无聊的事情”不包含这些步骤。

这是因为本书基于 Selenium 2.x,而该系列的 Firefox 驱动程序不需要 Gecko 驱动程序。在开发 Selenium 时,驱动浏览器的 Gecko 接口尚未可用。

Selenium 2.x 系列的最新版本是2.53.6(例如,请参阅这些答案,以更轻松地查看版本)。

2.53.6 版本页面根本没有提到 Gecko。但从 3.0.2 版本开始,文档明确指出您需要安装 Gecko 驱动程序。

如果在升级(或在新系统上安装)后,你之前运行良好的软件(或在旧系统上)不再工作,并且你很着急,可以通过执行以下操作将 Selenium 版本固定在虚拟环境中

pip install selenium==2.53.6

但当然,开发的长期解决方案是使用最新版本的 selenium 设置一个新的虚拟环境,安装 Gecko 驱动程序并测试一切是否仍按预期工作。

但是主要版本的升级可能会引入书中未涵盖的其他 API 更改,因此您可能需要坚持使用旧版 Selenium,直到您有足够的信心可以自己修复 Selenium 2 和 Selenium 3 API 之间的任何差异。

解决方案 7:

为 Selenium Python 设置 geckodriver:

需要使用 FirefoxDriver 设置 geckodriver 路径,如下代码:

self.driver = webdriver.Firefox(executable_path = 'D:Selenium_RiponAlWasimgeckodriver-v0.18.0-win64geckodriver.exe')

为您的操作系统下载合适的 geckodriver(从https://github.com/mozilla/geckodriver/releases)→将其解压到您选择的文件夹中→按照上面所述正确设置路径。

我在 Windows 10 上使用 Python 3.6.2 和 Selenium WebDriver 3.4.3。

设置 geckodriver 的另一种方法:

i) 只需将 geckodriver.exe 粘贴到 /Python/Scripts/ 下(在我的情况下,该文件夹为:C:Python36Scripts

ii) 现在编写如下简单代码:

self.driver = webdriver.Firefox()

解决方案 8:

Ubuntu 18.04 + 和最新版本的 geckodriver

这也适用于其他类 Unix 版本。

export GV=v0.30.0
wget "https://github.com/mozilla/geckodriver/releases/download/$GV/geckodriver-$GV-linux64.tar.gz"
tar xvzf geckodriver-$GV-linux64.tar.gz
chmod +x geckodriver
sudo cp geckodriver /usr/local/bin/

对于 Mac,请更新至:

geckodriver-$GV-macos.tar.gz

解决方案 9:

如果您使用的是Anaconda,那么您所要做的就是激活您的虚拟环境,然后使用以下命令安装geckodriver

conda install -c conda-forge geckodriver

解决方案 10:

适用于 Windows 的最简单方法!

geckodriver从这里下载最新版本。将geckodriver.exe文件添加到 Python 目录(或任何其他已经在的目录PATH)。这应该可以解决问题(已在 Windows 10 上测试过)。

解决方案 11:

geckodriver默认情况下未安装。

geckodriver

输出:

Command 'geckodriver' not found, but it can be installed with:

sudo apt install firefox-geckodriver

以下命令不仅安装它,而且还将其放入可执行文件中PATH

sudo apt install firefox-geckodriver

只需一步即可解决问题。我遇到了和你一模一样的错误,但安装后问题就消失了。快来试试吧。

which geckodriver

输出:

/usr/bin/geckodriver

geckodriver

输出:

1337    geckodriver    INFO    Listening on 127.0.0.1:4444
^C

解决方案 12:

对于Ubuntu 16.04 (Xenial Xerus) 及更高版本,您可以执行以下操作:

对于 Firefox:

sudo apt-get install firefox-geckodriver

对于 Chrome:

sudo apt-get install chromium-chromedriver

解决方案 13:

Mac 的操作步骤

简单的解决方案是下载 GeckoDriver 并将其添加到系统 PATH。您可以使用以下两种方法之一:

简短方法

  1. 下载并解压Geckodriver。

  2. 启动驱动程序时提及路径:

driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')

长方法

  1. 下载并解压Geckodriver。

  2. 打开.bash_profile。如果你还没有创建它,你可以使用以下命令创建它:touch ~/.bash_profile。然后使用以下命令打开它:open ~/.bash_profile

  3. 考虑到 GeckoDriver 文件存在于您的下载文件夹中,您可以将以下行添加到该.bash_profile文件中:

PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
export PATH

这样,您就将 GeckoDriver 的路径附加到系统 PATH。这会告诉系统在执行 Selenium 脚本时 GeckoDriver 的位置。

  1. 保存.bash_profile并强制执行。这会立即加载值,而无需重新启动。为此,您可以运行以下命令:

source ~/.bash_profile

  1. 就这样。你完成了!你现在可以运行 Python 脚本了。

解决方案 14:

一些额外的输入/澄清:

以下内容足以作为 Windows 7、Python 3.6 和 Selenium 3.11 的解决方案:

dsalaj对 Unix 的另一个答案的注释也适用于 Windows;可以避免在 Windows 级别修改 PATH 环境变量并重新启动 Windows 系统。

(1)下载 geckodriver(如本帖前面所述)并将(解压后的)geckdriver.exe 放在 X:\Folder\of\your\choice

(2)Python代码示例:

import os;
os.environ["PATH"] += os.pathsep + r'X:Folderofyourchoice';

from selenium import webdriver;
browser = webdriver.Firefox();
browser.get('http://localhost:8000')
assert 'Django' in browser.title

笔记:

(1)上述代码可能需要大约 10 秒钟才能打开指定 URL 的 Firefox 浏览器。

(2) 如果指定的 URL 上没有运行服务器,或者没有提供标题包含字符串“Django”的页面,Python 控制台将显示以下错误:

selenium.common.exceptions.WebDriverException:消息:到达错误页面:about:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/&c=UTF-8&f=regular&d=Firefox%20can%E2%80%9

解决方案 15:

我实际上发现你可以使用最新的 geckodriver,而无需将其放入系统路径中。目前我正在使用

https://github.com/mozilla/geckodriver/releases/download/v0.12.0/geckodriver-v0.12.0-win64.zip

Firefox 50.1.0

Python 3.5.2

硒 3.0.2

Windows 10

我正在运行 VirtualEnv (我使用PyCharm进行管理,并且我假设它使用 Pip 来安装所有内容)。

在下面的代码中,我可以使用 executable_path 参数为 geckodriver 使用特定路径(我通过查看 Lib\site-packages\selenium\webdriver\firefox\webdriver.py 发现了这一点)。注意,我怀疑调用 webdriver 时参数参数的顺序很重要,这就是为什么 executable_path 在我的代码中排在最后(最右边的倒数第二行)。

您可能还注意到,我使用自定义 Firefox 配置文件来解决 sec_error_unknown_issuer 问题,如果您测试的站点有不受信任的证书,您将会遇到此问题。请参阅如何使用 Selenium 禁用 Firefox 的不受信任连接警告?

经过调查发现,Marionette 驱动程序尚未完成且仍在开发中,无论设置多少种功能或配置文件选项来解除或设置证书都无法奏效。因此,使用自定义配置文件会更简单。

无论如何,下面是我如何让 geckodriver 在不在路径中的情况下工作的代码:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True

#you probably don't need the next 3 lines they don't seem to work anyway
firefox_capabilities['handleAlerts'] = True
firefox_capabilities['acceptSslCerts'] = True
firefox_capabilities['acceptInsecureCerts'] = True

# In the next line I'm using a specific Firefox profile because
# I wanted to get around the sec_error_unknown_issuer problems with the new Firefox and Marionette driver
# I create a Firefox profile where I had already made an exception for the site I'm testing
# see https://support.mozilla.org/en-US/kb/profile-manager-create-and-remove-firefox-profiles#w_starting-the-profile-manager

ffProfilePath = 'D:WorkPyTestFrameworkFirefoxSeleniumProfile'
profile = webdriver.FirefoxProfile(profile_directory=ffProfilePath)
geckoPath = 'D:WorkPyTestFrameworkgeckodriver.exe'
browser = webdriver.Firefox(firefox_profile=profile, capabilities=firefox_capabilities, executable_path=geckoPath)
browser.get('http://stackoverflow.com')

解决方案 16:

避免错误的新方法是使用Conda环境。

使用conda install -c conda-forge geckodriver时您不必在路径中添加任何内容或编辑代码!

解决方案 17:

如果你使用的是Linux,则可以使用一个简单的命令来解决此问题

  1. 首先,下载(https://github.com/mozilla/geckodriver/releases)并解压 ZIP 文件

  2. 打开解压的文件夹

  3. geckodriver从文件夹(解压后文件所在的位置)打开终端

在此处输入图片描述

  1. 现在在你的终端上运行这个简单的命令将 geckodriver 复制到正确的文件夹中:

 sudo cp geckodriver /usr/local/bin

解决方案 18:

考虑安装一个容器化的 Firefox:

docker pull selenium/standalone-firefox
docker run --rm -d -p 5555:4444 --shm-size=2g selenium/standalone-firefox

使用以下方式连接webdriver.Remote

driver = webdriver.Remote('http://localhost:5555/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://toolbox.googleapps.com/apps/browserinfo/')
driver.save_screenshot('info.png')

解决方案 19:

令人遗憾的是,没有一本关于 Selenium/Python 的书籍和 Google 上关于这个问题的大多数评论都没有清楚地解释在 Mac 上设置它的路径逻辑(一切都是 Windows!)。YouTube 视频都在“之后”设置路径(在我看来,这是最便宜的出路!)。因此,对于您出色的 Mac 用户,请使用以下命令编辑您的 Bash 路径文件:

touch ~/.bash_profile; open ~/.bash_profile*

然后添加类似这样的路径......

# Setting PATH for geckodriver
PATH=“/usr/bin/geckodriver:${PATH}”
export PATH

# Setting PATH for Selenium Firefox
PATH=“~/Users/yourNamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/selenium/webdriver/firefox/:${PATH}”
export PATH

# Setting PATH for executable on Firefox driver
PATH=“/Users/yournamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/selenium/webdriver/common/service.py:${PATH}”
export PATH*

这对我有用。

解决方案 20:

我在 Linux 桌面上开发了一个脚本,用于部署在我的无头服务器上。我需要在 Windows 上运行更新,但由于以下几个原因,出现了同样的错误:

“selenium.common.exceptions.sessionnotcreatedexception:消息:预期的浏览器二进制位置,但无法在默认位置找到二进制文件,没有提供‘moz:firefoxoptions.binary’功能,并且命令行上没有设置二进制标志”

这是 Windows;我需要安装 Firefox,但我可能搞错了,因为它滞后了,而且我一度有两个安装正在进行。

安装 Firefox 后,我找到了一个确认的解决方案(例如https://stackoverflow.com/a/42122284),指导我使用executable_path

from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'yourpathgeckodriver.exe')

这个参数几年前就无法识别了。我需要一个Service实例。我把它添加到我的选项中,这是必需的,因为仍然找不到 Firefox(这可能是我的不耐烦双重安装造成的):

from selenium import webdriver
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.firefox.service import Service
opts.binary_location = r"C:Program FilesMozilla Firefoxirefox.exe"
service = Service(r"C:UserspythonistaPycharmProjectsworld_eatergeckodriver.exe")
driver = webdriver.Firefox(service=service, options=opts)

这是我目前唯一的 selenium 项目,它可以管理自己的 geckodriver。

解决方案 21:

我正在使用 Windows 10,这对我有用:

  1. 从这里下载 geckodriver 。下载适合您使用的计算机的正确版本。

  2. 解压刚刚下载的文件并剪切/复制其中包含的“.exe”文件

  3. 导航到 C:{你的 python 根文件夹}。我的是 C:\Python27。将 geckodriver.exe 文件粘贴到此文件夹中。

  4. 重新启动您的开发环境。

  5. 尝试再次运行代码。现在应该可以正常工作了。

解决方案 22:

from webdriverdownloader import GeckoDriverDownloader # vs ChromeDriverDownloader vs OperaChromiumDriverDownloader
gdd = GeckoDriverDownloader()
gdd.download_and_install()
#gdd.download_and_install("v0.19.0")

这将获取 Windows 上 gekodriver.exe 的路径。

from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'C:\\Users\/username\\in\\geckodriver.exe')
driver.get('https://www.amazon.com/')

解决方案 23:

对于MacBook 用户

步骤 1:

打开此链接并复制Homebrew路径,将其粘贴到终端并安装。

第 2 步:

brew install geckodriver

步骤3:

pip install webdriver-manager

解决方案 24:

Selenium 在其DESCRIPTION.rst文件中回答了这个问题:

驱动程序

========

Selenium 需要驱动程序来与所选浏览器交互。例如,Firefox 需要geckodriver <https://github.com/mozilla/geckodriver/releases>_,需要先安装它才能运行以下示例。确保它在您的 中PATH,例如,将其放在/usr/bin或 中/usr/local/bin

未能遵守此步骤将会导致错误“selenium.common.exceptions.WebDriverException:消息:'geckodriver'可执行文件需要在PATH中。

基本上只需下载 geckodriver,解压并将可执行文件移动到/usr/bin文件夹。

解决方案 25:

对于 Windows 用户

使用原始代码如下:

from selenium import webdriver
browser = webdriver.Firefox()
driver.get("https://www.google.com")

然后从以下位置下载驱动程序:mozilla/geckodriver

将其放置在固定路径中(永久)...作为示例,我将其放置在:

目录:\Python35

然后进入系统的环境变量。在“系统变量”网格中查找Path变量并添加:

;C:\Python35\geckodriver

geckodriver,而不是 geckodriver.exe

解决方案 26:

如果你使用虚拟环境和 Windows 10(其他系统可能也一样),你只需要将 geckodriver.exe 放入虚拟环境目录中的以下文件夹中:

...\我的虚拟环境目录\Scripts\geckodriver.exe

解决方案 27:

的重大变化selenium 4.10.0意味着,如果您升级版本,您将不再看到 Geckodriver 错误消息seleniumselenium有一个内置驱动程序管理器(现在完全脱离测试阶段),geckodriver如果您的系统上找不到它,它将自动为您下载PATH。甚至方法 argexecutable_path也已从中删除webdriver.Firefox(),如下所示:

https://github.com/SeleniumHQ/selenium/commit/9f5801c82fb3be3d5850707c46c3f8176e3ccd8e

Selenium_4_10_0 中的变化

现在,这就是启动 Firefox 所需的全部内容,即使它不在您的系统路径上:

from selenium import webdriver
driver = webdriver.Firefox()
# ...
driver.quit()

要定制 Firefox,请使用optionsservice参数:

from selenium import webdriver
from selenium.webdriver.firefox.service import Service

service = Service()
options = webdriver.FirefoxOptions()
driver = webdriver.Firefox(service=service, options=options)
# ...
driver.quit()

(与以前一样,geckodriver如果您的系统上未找到它,将自动下载PATH。)

解决方案 28:

在macOS v10.12.1 (Sierra) 和 Python 2.7.10 上,这对我来说有效:

def download(url):
    firefox_capabilities = DesiredCapabilities.FIREFOX
    firefox_capabilities['marionette'] = True
    browser = webdriver.Firefox(capabilities=firefox_capabilities,
                                executable_path=r'/Users/Do01/Documents/crawler-env/geckodriver')
    browser.get(url)
    return browser.page_source

解决方案 29:

在 Raspberry Pi 上,我必须从 ARM 驱动程序创建它,并在文件webdriver.py中设置 geckodriver 和日志路径:

sudo nano /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py
def __init__(self, firefox_profile=None, firefox_binary=None,
             timeout=30, capabilities=None, proxy=None,
             executable_path="/PATH/gecko/geckodriver",
             firefox_options=None,
             log_path="/PATH/geckodriver.log"):

解决方案 30:

geckodriver对我来说,只需在相同的环境中安装就足够了:

brew install geckodriver

并且代码没有改变:

from selenium import webdriver
browser = webdriver.Firefox()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1590  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1361  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   18  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   18  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   19  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用