热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SeleniumIDE:这是什么?&为什么必须进行每个质量检查?

早期的测试人员通常会避免使用SeleniumIDE等记录和重播工具进行自动化测试,而宁愿选择使用SeleniumWebdriver,WebDriverI

早期的测试人员通常会避免使用Selenium IDE等记录和重播工具进行自动化测试,而宁愿选择使用Selenium Webdriver ,WebDriverIO,Cypress等脚本框架。毕竟,为什么不使用这些工具,事实证明它们是更有效,对测试的控制更多!

即使Selenium IDE提供了易用性,它仍然存在很多问题,它不支持跨浏览器测试,运行并行测试等等。 这就是原因,当Selenium IDE的开发于2017年停止时,许多测试人员都对Selenium IDE死亡感到印象深刻。

但是,随着Selenium IDE再次受到关注并且其使用率逐渐增加,这种情况最近有所改变。 原因? Selenium IDE克服了以前的局限性,现在支持跨浏览器测试,并行测试等等!

在我们较早的博客之一中,用于测试自动化的Selenium IDE被包括为2020年值得关注的顶级自动化测试趋势之一。在本Selenium IDE教程中,我将告诉您为什么需要考虑将Selenium IDE用于测试自动化。

什么是Selenium IDE?

Selenium IDE于2006年引入,是一种用于开发Selenium测试用例的记录和重播工具。 IDE易于上手,因为不需要任何特殊设置。

要开始使用Selenium IDE进行Selenium测试自动化,您需要为相应的浏览器安装扩展(或附加组件)。 IDE提供了一个GUI,用于记录与网站的交互。

尽管Selenium IDE以前仅适用于Firefox,但现在也适用于Chrome。 Selenium IDE的最新版本是3.17.0。 IDE现在具有跨浏览器支持,还支持并行测试执行。 您可以使用下面的链接下载Selenium IDE的Chrome和Firefox扩展。

  • Selenium IDE的Chrome扩展
  • Selenium IDE的Firefox插件

一旦安装了扩展(或附加组件),就可以开始记录测试。 与网站(正在测试)的交互被记录并归类为以下几类。

  • 命令
  • 目标
  • 说明(可选)

Selenium IDE的主要功能

Selenium IDE是易于使用的工具,可提供即时反馈,并允许您使用Selenium IDE的SIDE(或命令行)运行器在任何浏览器+操作系统组合上运行测试。

以下是一些关键功能:

  • 执行测试(和测试套件)– Selenium IDE使您可以执行特定的测试或包含一组测试的完整测试套件。
  • 跨浏览器测试–它可以用于自动浏览器测试,因为可以使用SIDE运行器执行跨浏览器测试。
  • 调试–设置断点并暂停异常,可以很容易地从IDE本身调试测试。
  • 丰富的命令集– Selenium IDE支持许多命令,这些命令可用于引发断言,插入等待,创建循环等。
  • 控制流– Selenium IDE具有广泛的命令集,可启用控制流结构。 if,if..else等命令有助于从IDE执行条件测试。
  • 测试用例重用–运行命令使您可以在另一个测试用例(或测试套件)中重用特定的测试用例。
  • Selenese命令的分组– Selenium IDE支持Selenese命令(或Selenium命令集)的分组,使您可以运行测试。 一系列Selenese命令构成一个测试脚本。
  • 轻松修改和比较测试用例–使用Selenium IDE创建的测试脚本存储为JSON文件。 这样可以轻松比较,修改和检查测试。

下面显示了我们的Selenium IDE教程(Google-Search.side)的示例测试脚本,以在Google上搜索LambdaTest:

{"id": "0cbf9be7-7cdf-4ab8-ae1e-ece61b57d861","version": "2.0","name": "Google Search","url": "https://www.google.com","tests": [{"id": "b3d88a58-3a4f-4189-8614-416817684027","name": "Untitled","commands": [{"id": "546f6852-8b27-40c6-9b69-ba88401879ff","comment": "","command": "open","target": "/","targets": [],"value": ""}, {"id": "6120c120-3234-4bc2-bed5-d1dde618704b","comment": "","command": "setWindowSize","target": "1382x754","targets": [],"value": ""}, {"id": "023d8f6e-a411-435d-89d0-e750d19de066","comment": "","command": "click","target": "name=q","targets": [["name=q", "name"],["css=.gLFyf", "css:finder"],["xpath=//input[@name='q']", "xpath:attributes"],["xpath=//form[@id='tsf']/div[2]/div/div/div/div[2]/input", "xpath:idRelative"],["xpath=//div[2]/input", "xpath:position"]],"value": ""}, {"id": "927b9fb7-7ade-4e86-be50-a3dec1baacf7","comment": "","command": "type","target": "name=q","targets": [["name=q", "name"],["css=.gLFyf", "css:finder"],["xpath=//input[@name='q']", "xpath:attributes"],["xpath=//form[@id='tsf']/div[2]/div/div/div/div[2]/input", "xpath:idRelative"],["xpath=//div[2]/input", "xpath:position"]],"value": "Lambdatest"}, {"id": "8f1cdac3-4e91-4ea1-bc08-7c43b15f5659","comment": "","command": "sendKeys","target": "name=q","targets": [["name=q", "name"],["css=.gLFyf", "css:finder"],["xpath=//input[@name='q']", "xpath:attributes"],["xpath=//form[@id='tsf']/div[2]/div/div/div/div[2]/input", "xpath:idRelative"],["xpath=//div[2]/input", "xpath:position"]],"value": "${KEY_ENTER}"}, {"id": "44a1d7f3-bb19-492f-bd66-2e1240f9a46c","comment": "","command": "click","target": "css=.g > div > .rc .LC20lb","targets": [["css=.g > div > .rc .LC20lb", "css:finder"],["xpath=//div[@id='rso']/div/div/div/div/a/h3", "xpath:idRelative"],["xpath=//div/div/a/h3", "xpath:position"],["xpath=//h3[contains(.,'LambdaTest: Most Powerful Cross Browser Testing Tool Online')]", "xpath:innerText"]],"value": ""}]}],"suites": [{"id": "ac1e77d7-5be7-4359-baf9-b635ab97bb36","name": "Default Suite","persistSession": false,"parallel": false,"timeout": 300,"tests": ["b3d88a58-3a4f-4189-8614-416817684027"]}],"urls": ["https://www.google.com/"],"plugins": []
}

在StackOverflow上标记为Selenium IDE的问题越来越多,这确实表明,测试Selenium测试自动化的测试人员已经注意到Selenium IDE,并且对该社区的兴趣正在增长。 它还可以帮助开发团队确定在以后的版本中应该使用的下一组功能的优先级。

对于需要进行自动浏览器测试的测试人员,Selenium IDE是一个值得探索的选择,因为它可以将测试用例(使用IDE创建)导出到流行的编程语言,例如Python,带有xUnit的C#等。 随着对IDE的好奇心的增加,让我们在本Selenium IDE教程中更详细地了解IDE的积极方面。

为什么Selenium IDE在质量检查世界中呈趋势

Selenium IDE远非完美,但其优点在于,它不仅仅是功能强大的记录和播放工具。 尽管不能认为它是广泛用于Selenium测试自动化的Selenium WebDriver的替代品,但它无疑为自动化浏览器测试增加了价值。 让我们深入研究此Selenium IDE教程的原因:

围绕“无代码自动化测试工具”的日益增长的牵引力

由于有助于加快测试场景的创建,对有助于在AI和可视化建模基础上进行无代码自动化测试的工具的需求有望增长。 由于测试人员不需要编码知识来提出测试用例,因此降低了进入的门槛。 它还可以最大程度地减少重复测试用例上花费的时间。

本Selenium IDE教程中的Selenium测试自动化入门仅需要安装附加组件(或扩展名)。 Selenium IDE允许您通过记录作为测试一部分的操作来从IDE生成测试用例。 “无代码”工具正变得越来越流行,Selenium IDE的开发时间表使无代码自动化测试的前提变得更加有趣!

积极的“功能开发”时间表

Selenium IDE项目开发于2017年停止。该功能仅可用于Firefox浏览器,并且宣布从Firefox 55起, 将不再支持Selenium IDE 。

后来,IDE使用现代API和Selenium测试自动化的重要功能(例如并行测试,跨浏览器支持,测试弹性)进行了重建,现在Selenium IDE中已包含了更多功能。

新的Selenium IDE是开源的,您可以在GitHub上找到代码。 与Selenium测试套件中的其他工具一样,它也由Selenium社区管理。

用于跨浏览器测试的SIDE Runner

多种浏览器的可用性使跨浏览器测试变得极为重要,因为您的Web应用程序需要在不同的浏览器之间无缝运行。 如本Selenium IDE教程中先前所述,可以在不同的浏览器和Selenium WebDriver服务器上执行并行测试执行,而无需编写任何代码!

这是可能的使用SIDE转轮 ,在硒IDE命令行测试运行。 要开始在本Selenium IDE教程中进行自动浏览器测试,如果必须在本地执行测试,则只需安装SIDERunner并获取必要的浏览器驱动程序。

可以通过从终端触发以下命令来安装SIDE 运行程序 (在发出命令之前必须安装与Node.js一起分发的npm软件包 ):

npm install -g selenium-side-runner

一旦安装了SIDE运行程序,就必须执行以下命令来为不同的Web浏览器安装Selenium WebDrivers:

# Installation of Chrome WebDriver  
npm install -g chromedriver
# Installation of Microsoft Edge Driver
npm install -g edgedriver
# Installation of Geckodriver for Firefox
npm install -g geckodriver
# Installation of IE WebDriver
npm install -g iedriver

使用Selenium IDE记录的测试方案必须另存为.side文件。

在此Selenium IDE教程中,可以使用以下命令在不同的浏览器上执行测试以进行本地测试:

selenium-side-runner -c "browserName=chrome"
selenium-side-runner -c "browserName='internet explorer'"
selenium-side-runner -c "browserName=edge"
selenium-side-runner -c "browserName=firefox"
selenium-side-runner -c "browserName=safari"

下面显示的是此Firefox上执行的Selenium IDE教程中的Google搜索(用于LambdaTest)示例的执行快照:

有关在Selenium Grid上进行并行测试的SIDE Runner的更多详细信息,请参见此处 。

通过SIDE运行器并行执行脚本

旧的Selenium IDE只能以串行方式执行测试用例(或测试套件)。 对于自动浏览器测试, 并行测试非常重要,因为它可以加快测试过程。

新的Selenium IDE使您可以并行执行测试。 通过更改Selenium IDE中的相关设置,可以在测试套件中进行测试并行化。 SIDE运行程序还允许您通过输入必须执行的并行进程数来并行执行测试。 -w选项用于控制正在运行的并行进程的数量。

下面显示的是一个测试套件的执行快照,该套件包含此Selenium IDE教程中的两个测试-Google搜索LambdaTest,DuckDuckGo搜索LambdaTest。

Selenium IDE现在提供更多的弹性测试

在自动化测试过程中,您会遇到以下情况:上一个软件版本中通过的自动化测试在当前版本中失败。 该视域在Selenium测试自动化中很常见,并用于自动化浏览器测试。

由于UI代码的更改,对其执行操作的Web定位器(作为自动化测试的一部分)可能已更改。 随着产品的发展,测试变得更加复杂,并且由于某些对象定位器的可访问性问题而导致的某些测试失败会降低测试效率。

Selenium IDE在自动化测试中建立了弹性,因为它为与之交互的每个元素记录了多个定位符。 在播放过程中,如果Selenium IDE找不到特定的定位器,它将尝试与网页上的所有其他定位器一起使用,直到其中一个成功。

下面显示的是Selenium IDE教程示例,其中介绍了IDE如何构建测试弹性。 除了基于CSS的定位器之外,Selenium IDE还捕获Click命令的XPath表达式。

新Selenium IDE提供的支持

如本Selenium IDE教程前面所述,旧的Selenium IDE在功能上有很多限制。 但是现在它提供了很多功能,任何测试人员都不会介意使用此工具。 以下是Selenium IDE现在支持的一些功能:

在Selenium测试自动化过程中,您会遇到仅在满足某些条件时才必须执行一组命令的场景。 例如,在您使用任何COOKIE,新闻通讯订阅等之前,有关用户同意的弹出式窗口(或通知)。

Selenium IDE可以通过条件分支实现条件逻辑(或控制流程),从而可以更改测试中的行为。 它还支持循环测试,在测试中可以基于预定义的标准重复执行一组命令。

一些有助于Selenium IDE中条件分支和循环的流行控制流命令包括:

  • 如果,否则,如果结束
  • 次,结束
  • 做,如果重复
  • 同时,结束

下面显示的是此Selenium IDE教程中的条件分支示例:

图片来源

在此Selenium IDE中,您将看到新的IDE使您可以通过执行脚本或执行异步脚本命令来利用Javascript及其广泛的库的优势。 这使您可以在测试脚本中执行Javascript代码段。

脚本执行的测试结果可以随后在控制流命令中使用以执行条件执行。

要执行Javascript代码段,请在需要调用代码段的位置执行Insert new命令,然后您需要执行脚本。

这看起来像一个基本功能,但它不是旧版本的Selenium IDE的一部分。 如果旧的测试脚本在新版本中不起作用,则必须再次记录整个脚本。 如果无法编辑脚本,则自动化(甚至记录和回放)测试的全部目的将丧失。

使用新的Selenium IDE,由于记录的测试(* .side)以JSON格式存储,因此可以修改测试。 Selenium IDE还支持编辑测试脚本,可以在其中插入,删除或删除命令。 如果您精通JSON,并且需要进行少量编辑,则可以打开.side文件并相应地编辑测试脚本。 但是,应该使用Selenium IDE来编辑涉及重大更改的测试脚本。

下面显示的是此Selenium IDE教程中编辑测试脚本的示例:

旧的Selenium IDE不支持调试测试脚本。 就像缺乏编辑脚本一样,对于希望使用IDE进行Selenium测试自动化的测试人员来说,不支持调试也被认为是一个难题。

您还可以获得暂停异常和设置断点等功能。 单击测试脚本中必须插入断点的位置,然后单击“切换断点”。 在下面的示例中,执行已在遇到断点的位置暂停:

将测试用例导出为流行的编程语言

使用Selenium IDE中的“导出”功能,可以将一个测试或一组测试导出为流行的编程语言。 当前,支持的语言和测试框架是:

  • C#NUnit
  • C#xUnit
  • Java JUnit
  • Javascript摩卡
  • Ruby RSpec
  • Python PyTest

如Selenium IDE的官方文档中所述,其目的是支持Selenium的其他编程语言绑定,例如Java,Javascript,C#,Python和Ruby。 如果您想针对诸如Python,C#等语言提出Selenium测试自动化方案,则导出功能可以节省大量时间。

要导出测试用例/测试套件,请右键单击测试,选择“导出”,然后选择所需的编程语言。

重用测试用例

在某些情况下,需要在不同的测试之间执行特定的测试逻辑。 为各种测试重新创建测试逻辑(或测试步骤)不是可行的解决方案。 例如,对LambdaTest网站的不同部分执行自动化测试的条件要求有效的用户名和密码,用户使用该用户名和密码登录平台。 前提条件(即登录以登录LambdaTest)可以作为单独的脚本创建。

Selenium IDE现在支持模块化测试,使您可以在另一个内部重新使用一个测试用例。 在本Selenium IDE教程的以上示例中,可以由不同的测试脚本调用Login逻辑,从而简化了测试套件的维护。 Selenium IDE中的运行脚本命令用于从另一个脚本中调用一个脚本。

插件的可扩展性

通过使用插件可以扩展新的Selenium IDE。 可在此处找到有关Selenium IDE的详细插件指南。

这使集成第三方服务或向IDE引入新命令变得更加容易。 拥有用于Selenium测试自动化的集成Selenium WebDriver产品的公司可能会对开发Selenium IDE的插件感兴趣。

有条件的等待测试自动化

在Selenium测试自动化中使用等待来处理网页(或Web应用程序)上元素的动态加载。 尝试与尚未加载的Web元素进行交互的测试脚本将导致失败。

现在,Selenium IDE首先等待页面加载,以确保必须在其上执行命令的Web元素可用。 除此之外,IDE还具有从工具栏控制测试执行速度的选项。

IDE还提供了set speed命令,可通过添加影响所有测试运行直到更改的全局延迟来设置执行速度。

在IDE中的内置等待策略无法满足要求的情况下,还可以选择在Selenium IDE中使用显式的等待命令,例如, 等待元素可编辑,等待元素不存在,等待元素不可见等。命令几乎类似于有助于在Selenium WebDriver中实现条件等待的命令。

集成到DevOps工具链中

流行的持续集成(CI)服务(或工具),例如Jenkins,Travis等,使您可以上载输入文件。 Selenium IDE可以集成到DevOps工具链中,因为可以从命令行调用SIDE运行器(即selenium-side-runner),而.side文件可以放入CI构建脚本中。

在代码存储库中管理Selenium IDE脚本

使用新的Selenium IDE记录的测试脚本存储为JSON Javascript Object Notation)文件。 这与其他许多以二进制格式存储测试脚本的记录和回放工具不同。

由于脚本以JSON格式存储,因此对测试脚本的基本操作(例如比较,编辑等)也适用于测试脚本。 下面显示的是到目前为止我们在博客中使用的测试脚本的摘要:

{"id": "6aac0257-09f5-49b5-b5bf-4cd1db292425","version": "2.0","name": "LambdaTest-IDE","url": "https://www.google.com","tests": [{"id": "43056bdf-0a55-432d-b4fb-1a7be839a490","name": "GoogleSearch","commands": [{"id": "6f6c3daa-9494-4d59-abd2-4aabdde5d8b7","comment": "","command": "open","target": "https://www.google.com","targets": [],"value": ""}, {"id": "bfda4546-878b-486b-b827-9670536de481","comment": "","command": "setWindowSize","target": "691x377","targets": [],"value": ""}, {"id": "2e519468-dfc9-4c5a-b0af-c994e44f379a","comment": "","command": "mouseOver","target": "css=#hplogo > a > img","targets": [["css=#hplogo > a > img", "css:finder"],["xpath=//img[@alt='Stay and Play at Home with Popular Past Google Doodles: Halloween (2016)']", "xpath:img"],["xpath=//div[@id='hplogo']/a/img", "xpath:idRelative"],["xpath=//img", "xpath:position"]],

因此,可以使用软件版本控制平台(例如GitHub,GitLab等)来维护Selenium IDE脚本。

另请阅读:使用Selenium WebDriver测试自动化的22条实用技巧

包起来!

在本Selenium IDE教程中,我们探讨了Selenium IDE如何通过众多功能来帮助跨浏览器测试,并行测试以及易于维护的测试脚本,在测试社区中日益流行。 它还支持嵌入式代码,并且可以通过插件进行扩展。

Selenium IDE不仅仅是一个简单的记录和回放工具,其功能与Selenium WebDriver的功能开发相符。 借助代码导出功能,它已成为使用Selenium框架进行自动浏览器测试入门的理想工具之一。

这就是本Selenium IDE教程的全部内容! 我希望您喜欢这篇文章,通过与他们共享此Selenium IDE教程或转推我们,帮助您的同行了解IDE对他们的重要性。 测试愉快!!! 😃


翻译自: https://www.javacodegeeks.com/2020/06/selenium-ide-what-is-it-why-is-it-must-for-every-qa.html




推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
爱吃橘子的金XiaRui
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有