浏览器驱动下载与配置全攻略,解锁Python Selenium
wptr33 2025-03-12 21:11 19 浏览
Selenium 的奇妙世界
在当今数字化时代,Web 应用如潮水般涌现,其功能的丰富性和复杂性也与日俱增。无论是电商平台、社交网络,还是各类在线办公系统,都需要确保在不同浏览器、不同设备上稳定运行,功能无误。这时,Selenium 就如同一位神奇的魔法师,走进了 Web 自动化领域的舞台中央,成为众多开发者和测试人员的得力助手。
Selenium 能够直接驱动浏览器,模拟真实用户的各种操作,如点击按钮、填写表单、滚动页面等 。这使得它在自动化测试领域大放异彩。想象一下,一个大型电商网站,在进行一次重大促销活动前,需要对无数个商品页面、购物流程、支付环节等进行测试,如果依靠人工手动测试,不仅耗时费力,还容易出现疏漏。而 Selenium 可以编写自动化测试脚本,让其在各种主流浏览器(如 Chrome、Firefox、Edge 等)中自动执行测试任务,快速准确地发现潜在的问题,大大提高了测试效率和质量。
除了自动化测试,Selenium 在网页数据抓取方面也有着出色的表现。在大数据时代,从网页中获取有价值的数据变得至关重要。但有些网站的数据是通过 JavaScript 动态加载的,传统的爬虫工具难以获取。Selenium 则可以模拟浏览器的行为,加载并渲染网页,从而获取到这些动态数据。比如,想要分析某热门论坛上用户对某一事件的讨论,Selenium 就可以帮你自动登录论坛,搜索相关话题,并抓取所有的帖子内容和评论。
然而,要让 Selenium 这位魔法师真正施展强大的魔法,离不开一个关键的环节 —— 浏览器驱动的下载与配置使用。不同的浏览器就像是不同的魔法道具,而浏览器驱动则是启动这些道具的魔法钥匙。接下来,就让我们一起深入探索 Python Selenium 各浏览器驱动下载与配置使用的奥秘吧。
一、Selenium 初相识
Selenium,这个在 Web 自动化领域如雷贯耳的名字,它究竟是什么呢?简单来说,Selenium 是一个用于 Web 应用程序测试的开源工具,就像是一位不知疲倦的虚拟测试员,能够模拟真实用户在浏览器中的各种操作 。它支持多种主流浏览器,包括但不限于 Chrome、Firefox、Edge、IE、Opera 等,还能在不同的操作系统上运行,如 Windows、Linux、Mac OS 等,这使得它在跨平台测试中表现出色。
在 Selenium 的体系中,浏览器驱动扮演着不可或缺的角色。为什么这么说呢?我们可以把 Selenium 看作是一个指挥者,它发出各种操作指令,比如打开网页、点击按钮、填写表单等,而浏览器驱动则是执行者,它负责与具体的浏览器进行交互,将 Selenium 的指令转化为浏览器能够理解和执行的动作。不同的浏览器就像是不同型号的汽车,每辆车都有自己独特的驾驶方式和要求,而浏览器驱动就像是适配这些汽车的钥匙,只有找到对应的钥匙,才能启动汽车并让它按照我们的意愿行驶。例如,Chrome 浏览器需要 chromedriver 驱动,Firefox 浏览器需要 geckodriver 驱动,Edge 浏览器需要 MicrosoftWebDriver 驱动等。
如果没有正确配置浏览器驱动,Selenium 就如同失去了与浏览器沟通的桥梁,无法发挥其强大的自动化功能。比如,当我们尝试使用 Selenium 打开 Chrome 浏览器时,如果没有安装或配置好 chromedriver 驱动,程序就会报错,无法正常启动浏览器,更无法进行后续的操作。所以,掌握各浏览器驱动的下载与配置使用,是我们开启 Selenium 自动化之旅的关键一步。接下来,就让我们逐一探索各种常见浏览器驱动的下载与配置方法。
二、各浏览器驱动下载
(一)Chrome 浏览器驱动
Chrome 浏览器驱动(chromedriver)是实现 Selenium 与 Chrome 浏览器交互的关键桥梁。其下载地址较为丰富,主要有:
http://chromedriver.storage.googleapis.com/index.html 以及
https://sites.google.com/a/chromium.org/chromedriver/home 。这两个地址都是官方提供的可靠下载源,能确保我们获取到正版且安全的驱动程序。
在下载 Chrome 浏览器驱动时,关键要依据 Chrome 浏览器的版本来精准匹配。比如,当你查看自己的 Chrome 浏览器版本为 108.0.5359.124 ,重点关注前三位数字 108.0 ,然后在下载地址页面中,找到以 108.0 开头的驱动版本进行下载。通常,选择该开头版本中最新的一个,能保证最佳的兼容性和性能 。若版本不匹配,可能会出现诸如浏览器无法启动、操作指令无法执行等问题。例如,用较低版本的驱动搭配高版本的 Chrome 浏览器,可能会导致某些新功能无法使用,或者在执行自动化脚本时频繁报错。
(二)Firefox 浏览器驱动
Firefox 浏览器驱动(geckodriver)的下载地址为:
https://github.com/mozilla/geckodriver/releases 。这是 Firefox 官方提供的驱动发布平台,能获取到各个版本的驱动。
下载时,一定要留意操作系统的适配问题。因为 geckodriver 针对不同的操作系统(如 Windows、Linux、Mac OS)有不同的版本。如果下载的驱动与操作系统不匹配,在运行时会报错。例如,在 Windows 系统中下载了 Linux 版本的 geckodriver,那么在使用 Selenium 启动 Firefox 浏览器时,就会提示找不到合适的驱动程序,导致自动化任务无法进行。所以,在下载前务必确认自己的操作系统类型,然后选择对应的驱动版本。
(三)Edge 浏览器驱动
Edge 浏览器经历了从 EdgeHTML 到 Chromium 的转变,其驱动下载也有所不同。
对于基于 EdgeHTML 的 Edge 浏览器,驱动下载地址为:
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ 。在下载时,要注意根据操作系统版本(32 位或 64 位)选择对应的驱动。比如,在 64 位的 Windows 10 系统中使用 EdgeHTML 浏览器,就需要下载 64 位版本的驱动,否则可能会出现兼容性问题,导致无法正常驱动浏览器。
而基于 Chromium 的 Edge 浏览器,其驱动下载地址同样是
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ 。虽然下载地址相同,但在选择驱动版本时,要依据基于 Chromium 的 Edge 浏览器版本来确定,确保两者版本匹配,以实现稳定的自动化操作。
(四)IE 浏览器驱动
IE 浏览器驱动(IEDriverServer)的下载地址是:
http://selenium-release.storage.googleapis.com/index.html 。在这个地址中,可以找到不同版本的 IE 浏览器驱动。
下载时,需格外留意操作系统及版本的对应。IE 浏览器驱动不仅区分 32 位和 64 位操作系统,还与不同版本的 IE 浏览器有特定的适配关系。例如,在 Windows 7 系统中使用 IE 11 浏览器,就需要下载与之对应的 32 位或 64 位的 IEDriverServer 驱动版本。如果版本不对应,可能会出现浏览器启动异常、自动化操作失败等问题,严重影响 Selenium 自动化任务的执行。
(五)Opera 浏览器驱动
Opera 浏览器驱动(operadriver)的下载链接为:
https://github.com/operasoftware/operachromiumdriver/releases 。这是获取 Opera 浏览器驱动的官方渠道。
下载时,要注意 Opera 浏览器版本与驱动版本的兼容性。虽然 Opera 浏览器基于 Chromium 开发,但它有自己独特的功能和特性,所以驱动版本也需要与之适配。同时,也要考虑操作系统的因素,选择适合当前操作系统的驱动版本。例如,在 Linux 系统中使用 Opera 浏览器,就要下载适用于 Linux 系统的 operadriver 驱动,以确保 Selenium 能够顺利驱动 Opera 浏览器进行自动化操作。
三、驱动配置之路
(一)Windows 系统配置
在 Windows 系统中,不同浏览器驱动的放置位置各有讲究。以 Chrome 驱动为例,下载并解压后,可将其可执行文件(chromedriver.exe)复制到 Python 安装路径的根目录下。比如,Python 安装在 “C:\Python310”,就把 chromedriver.exe 复制到该目录中。这样做的好处是,在使用 Selenium 编写代码时,无需额外指定驱动路径,程序能够自动识别并调用驱动 。
配置环境变量也是一个重要的步骤。将浏览器驱动所在目录添加到系统环境变量 PATH 中,能让系统在任何位置都能找到并执行驱动程序。例如,若将 Chrome 驱动解压到 “C:\chromedriver” 目录,就需要把该目录添加到 PATH 变量中。具体操作步骤为:右键点击 “此电脑”,选择 “属性”;点击 “高级系统设置”;在 “高级” 选项卡中,点击 “环境变量” 按钮;在 “系统变量” 列表中,找到 “Path” 变量,点击 “编辑”;在弹出的编辑窗口中,点击 “新建”,输入 “C:\chromedriver”,点击 “确定” 保存设置。这样,在运行 Selenium 脚本时,系统就能顺利找到并启动 Chrome 驱动,实现对 Chrome 浏览器的自动化控制。
对于 Firefox 驱动(geckodriver.exe),同样可以将其放置在 Python 安装路径根目录或者添加到环境变量指定的目录中。如果不进行环境变量配置,在代码中就需要显式地指定驱动路径,如driver = webdriver.Firefox(executable_path='C:\geckodriver\geckodriver.exe') ,否则程序会因找不到驱动而报错。
(二)Mac 系统配置
在 Mac 系统下,浏览器驱动的放置目录有一定规范。Chrome 驱动(chromedriver)可以放置在 “/usr/local/bin” 或 “/usr/bin” 目录下。“/usr/local/bin” 目录通常用于存放本地安装的可执行文件,将 Chrome 驱动放置在此处,符合系统的文件管理规范,并且系统能够自动识别该路径下的可执行文件 。如果不确定该目录是否存在,或者没有权限写入该目录,也可以选择将驱动放置在其他目录,如用户主目录下的某个文件夹,但此时需要在代码中通过os.environ["PATH"] += os.pathsep + '
/Users/yourusername/chromedriver_folder'这样的方式将该目录添加到环境变量中,确保程序能够找到驱动。
Firefox 驱动(geckodriver)也可以放置在 “/usr/local/bin” 目录下。若放置在其他自定义目录,同样需要配置环境变量或者在代码中指定驱动路径。例如,将 geckodriver 放置在 “
/Users/yourusername/geckodriver_folder” 目录下,在代码中可以使用driver = webdriver.Firefox(service=Service('
/Users/yourusername/geckodriver_folder/geckodriver'))来指定驱动路径,以保证 Selenium 能够正常驱动 Firefox 浏览器。
四、驱动使用实战
(一)基本使用代码示例
以打开百度网页为例,我们来看看 Python 中使用 Selenium 调用各浏览器驱动的具体代码实现。
首先,我们需要导入必要的模块。对于 Selenium,我们主要导入webdriver模块,它是 Selenium 与浏览器交互的核心模块 。同时,对于不同的浏览器,还需要导入相应的服务模块,比如Service。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.edge.service import Service
import time
接下来,创建各浏览器的驱动对象。这里以 Chrome、Firefox 和 Edge 浏览器为例:
# Chrome浏览器驱动
chrome_service = Service('chromedriver.exe') # 这里假设chromedriver.exe在当前目录,实际需根据路径调整
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('detach', True) # 防止浏览器自动关闭
driver_chrome = webdriver.Chrome(service=chrome_service, options=chrome_options)
# Firefox浏览器驱动
firefox_service = Service('geckodriver.exe') # 假设geckodriver.exe在当前目录,实际需根据路径调整
firefox_options = webdriver.FirefoxOptions()
driver_firefox = webdriver.Firefox(service=firefox_service, options=firefox_options)
# Edge浏览器驱动
edge_service = Service('msedgedriver.exe') # 假设msedgedriver.exe在当前目录,实际需根据路径调整
edge_options = webdriver.EdgeOptions()
driver_edge = webdriver.Edge(service=edge_service, options=edge_options)
然后,使用创建好的驱动对象打开百度网页:
# Chrome浏览器打开百度
driver_chrome.get('https://www.baidu.com')
time.sleep(5) # 等待5秒,以便观察页面加载情况
# Firefox浏览器打开百度
driver_firefox.get('https://www.baidu.com')
time.sleep(5)
# Edge浏览器打开百度
driver_edge.get('https://www.baidu.com')
time.sleep(5)
最后,记得关闭浏览器驱动对象,释放资源:
# 关闭Chrome浏览器驱动
driver_chrome.quit()
# 关闭Firefox浏览器驱动
driver_firefox.quit()
# 关闭Edge浏览器驱动
driver_edge.quit()
(二)无头模式的运用
无头模式,简单来说,就是浏览器在运行时没有可见的用户界面。在这种模式下,浏览器可以在后台执行各种任务,如网页抓取、自动化测试等,而不会弹出浏览器窗口 。这不仅节省了系统资源,还提高了执行效率,特别适合在服务器端或资源有限的环境中运行自动化任务。
下面我们分别看看 Chrome 和 Firefox 浏览器开启无头模式的代码实现。
对于 Chrome 浏览器:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# 设置ChromeOptions来启用无头模式
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速,防止一些潜在问题
# 设置Chrome浏览器驱动路径
driver_path = 'chromedriver.exe'
service = Service(driver_path)
# 创建Chrome浏览器驱动对象并使用
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get('https://www.baidu.com')
print(driver.page_source) # 获取网页源代码
driver.quit()
对于 Firefox 浏览器:
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
# 设置FirefoxOptions来开启无头模式
firefox_options = Options()
firefox_options.add_argument('-headless')
# 设置Firefox浏览器驱动路径
driver_path = 'geckodriver.exe'
service = Service(driver_path)
# 创建Firefox浏览器驱动对象并使用
driver = webdriver.Firefox(service=service, options=firefox_options)
driver.get('https://www.baidu.com')
print(driver.page_source)
driver.quit()
在实际应用无头模式时,也有一些需要注意的事项。一方面,性能优化至关重要。虽然无头模式减少了图形界面的资源消耗,但在处理大量并发请求或复杂网页时,仍可能面临性能瓶颈。例如,在进行大规模网页数据抓取时,如果同时发起过多请求,可能会导致服务器响应变慢甚至拒绝服务。这时,需要合理设置请求频率和并发数,避免对目标服务器造成过大压力。另一方面,兼容性问题也不容忽视。部分网站可能会检测到无头浏览器的访问,并采取限制措施,如返回错误页面或验证码。为了解决这个问题,可以尝试设置合适的用户代理(User - Agent),模拟正常浏览器的访问行为,增加访问的成功率 。
五、常见问题与解决方案
在使用 Python Selenium 进行自动化操作时,配置和使用浏览器驱动的过程中可能会遇到一些问题,以下是一些常见问题及对应的解决方案:
(一)驱动版本不匹配
问题描述:在运行 Selenium 脚本时,报错提示驱动版本与浏览器版本不兼容,如 “Session not created: This version of ChromeDriver only supports Chrome version XX” 。这是因为 ChromeDriver 对版本的匹配要求较为严格,一旦版本不对应,就无法正常启动浏览器。
解决方案:首先,确认浏览器的版本号,可在浏览器的设置或关于页面中查看。然后,前往对应浏览器驱动的官方下载地址,下载与浏览器版本匹配的驱动。以 Chrome 浏览器为例,若浏览器版本为 108.0.5359.124 ,则在
http://chromedriver.storage.googleapis.com/index.html 下载页面中,找到以 108.0 开头的最新版本的 chromedriver 驱动进行下载。如果不确定具体版本,可先卸载现有驱动,然后尝试下载最新版本的驱动,因为最新版本通常兼容性更好,能支持较新的浏览器版本。
(二)路径配置错误
问题描述:当运行 Selenium 代码时,出现 “
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH” 等错误,这表明系统无法找到浏览器驱动的可执行文件,通常是因为驱动路径配置错误 。比如,将 Chrome 驱动放置在错误的目录,或者没有将驱动所在目录添加到系统环境变量中。
解决方案:如果是 Windows 系统,可将浏览器驱动(如 chromedriver.exe)复制到 Python 安装路径的根目录下,或者将驱动所在目录添加到系统环境变量 PATH 中。具体操作是在 “此电脑” 上右键点击,选择 “属性”,进入 “高级系统设置”,在 “环境变量” 中编辑 “Path” 变量,添加驱动所在目录。若在 Mac 系统中,可将驱动放置在 “/usr/local/bin” 或 “/usr/bin” 目录下,若放置在其他自定义目录,则需在代码中通过os.environ["PATH"] += os.pathsep + '/自定义目录'的方式将该目录添加到环境变量中,或者在创建驱动对象时显式指定驱动路径,如driver = webdriver.Chrome(executable_path='/自定义目录/chromedriver') 。
(三)无头模式访问受限
问题描述:在使用无头模式时,部分网站可能会检测到无头浏览器的访问,并采取限制措施,如返回错误页面、验证码或者拒绝访问 。这是因为无头模式下浏览器的行为特征与正常浏览器有所不同,容易被网站的反爬虫机制识别。
解决方案:可以通过设置合适的用户代理(User - Agent)来模拟正常浏览器的访问行为。在 Python 中,使用 Selenium 时,对于 Chrome 浏览器,可在设置 ChromeOptions 时添加如下代码:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"')
对于 Firefox 浏览器,在设置 FirefoxOptions 时添加:
firefox_options = webdriver.FirefoxOptions()
firefox_options.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"')
通过设置与正常浏览器相似的 User - Agent,能增加无头模式下访问网站的成功率,减少被检测和限制的概率。
在本次探索 Python Selenium 各浏览器驱动下载与配置使用的旅程中,我们收获颇丰。从 Selenium 的神奇功能,到各种浏览器驱动的精准下载,再到不同系统下的驱动配置,以及实际的代码运用和常见问题的解决,每一步都让我们更加深入地了解了 Web 自动化的世界。
我们知道了 Chrome 浏览器驱动需在特定官网依据版本精准匹配下载,Firefox、Edge 等浏览器驱动也各有其下载要点和适配规则。在配置驱动时,Windows 和 Mac 系统有着不同的路径规范和环境变量设置方法 。而在实际使用中,我们不仅能通过简单的代码操控浏览器打开网页,还能运用无头模式在后台高效执行任务,并且学会了如何应对可能出现的驱动版本不匹配、路径配置错误等问题。
Selenium 的应用前景极为广阔。在自动化测试领域,它能帮助测试人员快速、准确地对 Web 应用进行多浏览器兼容性测试,大大提高测试效率和质量,确保产品在各种浏览器环境下都能稳定运行。在网页数据抓取方面,对于那些数据动态加载的网站,Selenium 能够模拟真实用户操作,获取到传统爬虫难以获取的数据,为数据分析和挖掘提供了有力支持。
希望各位读者能将所学的 Selenium 知识运用到更多实际项目中。无论是开发一个高效的自动化测试框架,还是搭建一个智能的数据抓取系统,都可以充分发挥 Selenium 的强大功能。也期待大家在实践中不断探索 Selenium 的更多可能性,挖掘出它更多的潜力,让 Web 自动化为我们的工作和生活带来更多的便利和惊喜 。
相关推荐
- 开发者必看的八大Material Design开源项目
-
MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...
- 另类插这么可爱,一定是…(另类t恤)
-
IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...
- Android常用ADB命令(安卓adb工具是什么)
-
杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...
- 微软Mac版PowerPoint测试Reading Order Pane功能
-
IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
-
前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
-
Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...
- iOS文本编辑控件UITextField和UITextVie
-
记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...
- Android入门图文教程集锦(android 入门教程)
-
Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
-
在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...
- 原生安卓开发app的框架frida常用关键代码定位
-
前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...
- 教程10 | 三分钟搞定一个智能输入法程序
-
一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...
- (Android 8.1) 功能与新特性(android的功能)
-
和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...
- 怎样设置EditText内部文字被锁定不可删除和修改
-
在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...
- 如何阻止 Android 活动启动时 EditText 获得焦点
-
技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 开发者必看的八大Material Design开源项目
- 另类插这么可爱,一定是…(另类t恤)
- Android常用ADB命令(安卓adb工具是什么)
- 微软Mac版PowerPoint测试Reading Order Pane功能
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
- 用云存储30分钟快速搭建APP,你信吗?
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
- iOS文本编辑控件UITextField和UITextVie
- Android入门图文教程集锦(android 入门教程)
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)