【.com速译】不可否认,Selenium是功能测试和Web应用测试领域首选的自动化框架之一。测试人员可以使用在线SeleniumGrid在不同的浏览器和平台组合上运行测试。不过,不知道大家有没有注意到,Cypress这个领域的后起之秀,正在以惊人的速度迎头赶上。Cypress也是一个用于测试Web应用程序的自动化开源测试框架。下面我将和大家全面探讨一下Selenium和Cypress的区别,以便大家在实际项目中做出明智的选择。Selenium和Cypress概述作为一个广受欢迎的自动化开源测试框架,Selenium主要用于Web应用测试和跨浏览器测试等场景。SeleniumWebDriver是Selenium套件的关键组件之一。目前Selenium支持Python、Ruby、C#、JavaScript、Java、PHP等多种编程语言,其支持的自动化框架包括:Behave(流行的BDD框架)、JUnit、SpecFlow、MSTest、TestNG、PyTest、PyUnit、MochaJS、Jest、WebDriverIO、Protractor等。在使用Selenium进行自动化测试之前,开发者需要下载并安装相应的浏览器驱动(如ChromeDriverforChrome、GeckoDriverforFirefox等)和合适的Selenium语言测试主机上的驱动程序。目前开源的Cypress项目托管在GitHub上,最新版本为5.5.0。开发人员可以使用Cypress进行单元测试、编写端到端测试以及进行集成测试。与SeleniumWebDriver可以支持多种语言不同,Cypress只能支持JavaScript,但它是精通JavaScript前端开发和自动化测试的首选。在对测试自动化框架的支持方面,Cypress只支持MochaJS框架。因此,我们可以认为Cypress的web自动化测试用例只是在MochaJS框架上用JavaScript编写的。下图展示了过去六个月SeleniumWebDriver和Cypress的下载趋势。可见Cypress的下载量正在慢慢赶上Selenium。下载对比图来源-https://www.npmtrends.com/protractor-vs-selenium-webdriverSelenium简介Selenium项目始于2004年,SeleniumIDE于2006年推出,是一个原生的记录和回放工具,只能是在Firefox上使用。当然,最新的SeleniumIDE已经可以在Chrome上使用了。它不仅具有跨浏览器支持,可用于并行测试,还允许自动化测试人员通过设置断点来调试脚本。目前,Selenium的最新稳定版本是Selenium3.141.59。然而,Selenium4中的SeleniumWebDriver(仍处于Alpha阶段)是W3C推荐的版本。由于JSONWire协议将不再用于与Web浏览器通信,自动化测试将能够更无缝地跨不同浏览器(如Chrome、Firefox等)工作。SeleniumWebDriver架构由于SeleniumWebDriver和相应的浏览器使用通用协议(即W3C协议)进行通信,因此开发人员通常认为Selenium4具有更稳定和统一的特性。Selenium的主要优点SeleniumWebDriver可广泛用于单元测试、E2E(端到端)测试和安全测试。如前所述,Selenium支持多种流行的编程语言,被广泛应用于各种自动化测试框架中。它与最新的浏览器(如Chrome、Firefox、Edge等)以及过时的浏览器(如InternetExplorer)兼容。经过多年的积累,Selenium的生态系统不断壮大。本地Selenium测试用例可以轻松迁移到基于云的SeleniumGrid。Selenium可以使用基于云的测试工具(如LambdaTest)执行并行测试。这不仅减少了测试时间,提高了成本效率,而且还实现了更大的测试覆盖率。Selenium的缺点Selenium对初学者来说有一个陡峭的学习曲线。当然,开发人员和自动化测试人员也可以通过向Selenium社区的活跃用户学习来快速上手。Selenium安装过程非常耗时,因为它涉及安装浏览器驱动程序、SeleniumGrid服务器和SeleniumIDE。尽管Selenium被广泛用于UI测试,但它在测试图像方面存在局限性。由于Selenium脚本是在浏览器外执行的(即测试脚本与被测浏览器的接口是通过相应的“浏览器驱动程序”实现的),因此执行时间会比Cypress框架更长。长的。关于CypressCypress是面向开发人员和质量保证工程师的下一代前端测试工具,可用于测试浏览器中运行的所有内容。与在浏览器外部运行的Selenium不同,Cypress可以在与应用程序相同的循环中执行。也就是说,节点服务器(Nodeserver)的进程可以和Cypress通信,同步和执行任务。通过访问网络层,赛普拉斯能够即时读取和更改网络流量。凭借其独特的DOM操作技术,Cypress的所有测试都可以访问DOM中的Web元素、应用程序实例、定时器和ServiceWorker等内容。通过对自动化过程的完全控制,赛普拉斯可以修改进出浏览器的所有内容,以及可能干扰网络浏览器自动化功能的代码。同时,由于Cypress安装在本地,可以通过访问操作系统来控制各种自动化任务。Cypress的主要优势由于测试用例直接在浏览器内运行,因此没有依赖项,也无需额外下载即可安装Cypress。使用JavaScript构建的Cypress可供开发人员和QA工程师用于前端开发。Cypress没有额外的IDE负担。启动Cypress时,它会提示您选择一个IDE,以方便更改测试脚本。Cypress进程可以实时响应应用程序事件并处理各种命令。同时,通过Cypress中的实时重载功能,用户可以在应用发生变化时自动重载测试。因为Cypress对整个自动化过程(从上到下)有严格的控制,所以它能够更好地理解浏览器内外的变化,从而提供一致的结果。因为它在应用程序内部运行,所以赛普拉斯的测试代码可以访问应用程序接触的所有对象(不限于DOM元素)。因此,Cypress不再需要JSONWire(或其他协议)进行通信。由于Cypress会自动等待DOM中元素的生成,用户无需在Cypress中添加隐式和显式等待语句。在执行下一条语句之前,Cypress还会等待命令和语句(https://on.cypress.io/introduction-to-cypress#Cypress-is-Not-Like-jQuery)。此外,赛普拉斯不会生成不属于DOM的陈旧元素。由于测试是在浏览器内部执行的,而且Cypress可以直观地了解应用程序是如何同步的,它甚至知道元素何时开始和停止动画效果(https://docs.cypress.io/guides/core-concepts/interacting-with-elements.html#Animations)。因此,赛普拉斯的测试比使用其他自动化测试工具更能抵抗剥落。赛普拉斯捕获每个测试步骤的快照,以便开发人员可以检查其在测试脚本中任何特定步骤的活动。Cypress允许用户直接修改DOM元素,例如:显示一些隐藏的元素。因为它是基于ElectronApp构建的,所以Cypress可以通过使用StubbingDOMAPI为开发人员或质量保证工程师提供对应用程序的更多控制。赛普拉斯中的存根[如cy.stub()]可用于修改某些功能并将其控制权委托给开发人员。Cypress中的Spies[例如cy.spy()]允许用户监视函数。Cypress中的时钟API[例如cy.clock()]可用于控制应用程序的数据和时间。这些对于根据需要替换应用程序的原始行为或避免测试缓慢很有用。鉴于UI测试等活动可能不需要执行分析,开发人员可以阻止分析代码,如GoogleAnalytics,直到应用程序执行测试。Cypress允许开发人员在单元测试中人为地创建不同的状态。此过程不会减慢整个测试过程。Cypress通过丰富直观的用户界面和仪表板向用户展示测试执行的每一个细节,包括:语句、网络请求、页面加载、存根和监控。默认情况下,它支持并行测试(或并行化)。同时允许用户按照浏览器、测试标签等条件对测试进行分组。下图是Cypress并行测试的一个简短过程:来源-https://docs.cypress.io/img/guides/parallelization/parallelization-overview.88fddb02.pngCypress还可以与流行的CI/CD工具集成,这些包括:Jenkins、Bamboo、CircleCI、Bitbucket、GitLab等。Cypress的缺点Cypress仅适用于Chrome、Firefox、Edge、Brave和Electron浏览器。因此,Cypress的跨浏览器测试相对有限。它仅支持使用JavaScript框架创建的测试用例。它不支持远程执行。Cypressk在其网站上声称,Cypress永远不会支持处理多个浏览器选项卡。默认情况下,Cypress不支持多个浏览器实例,也不能同时控制多个打开的浏览器。对此,Cypress目前的解决方案(https://docs.cypress.io/guides/references/trade-offs.html#Multiple-browsers-open-at-the-same-time)是与其他后端进程(例如,Selenium、Puppeteer等)来驱动另一个已经打开的浏览器实例。目前Cypress的测试仅限于识别同源访问域,用户无法在同一个测试中同时访问两个不同源的域。当然,他们可以在不同的测试中从不同的来源访问两个或多个域。Selenium跨浏览器测试入门您可以选择使用本地SeleniumGrid或在基于云的SeleniumGrid(如LambdaTest)上运行可扩展的跨浏览器测试。要在本地SeleniumGrid上进行跨浏览器测试,必须提前安装浏览器驱动,并选择其中一种Selenium支持的语言,如C#、Java、Python、Ruby。要在云端的SeleniumGrid上执行Selenium自动化,您必须在平台上创建一个帐户并在您的代码中调用适当的浏览器功能。下面,我们来讨论一个使用Selenium进行自动化测试的例子:1.在Windows10的Chrome86.0中输入URLhttps://lambdatest.github.io/sample-todo-app/2.选中前两个复选框。3.发送“HappyTestingatLambdaTest”到id为sampletodotext的文本框。4.单击添加按钮并确认文本已添加。5.如果标题与预期的窗口标题不匹配,则需要声明。下面是LambdaTest上云端SeleniumGrid测试的Java代码:Cypress自动化测试入门由于Mocha框架运行在Node.js上,在安装Cypress之前,需要安装依赖包:NodeJS和类似的Visual工作室代码集成开发环境。安装NodeJS后,我们可以使用Node包管理器npm从终端安装Mocha和Cypress。请在终端运行以下命令安装Mocha:npminstallmocha请在终端运行以下命令安装Cypress:npminstallcypress如上图绿框所示,Cypress5.5.0已经安装成功。接下来,我们使用以下命令启动Cypress:npxcypressopen,它会打开Cypress仪表板以运行各种测试:Cypress在\integration\examples中提供了各种示例脚本:要快速检查测试,请将脚本放在同一文件夹中。参考上面的Selenium测试用例,我们额外添加了waitusingcy.wait()方法和cy.get()方法,用于从DOM中获取需要的Web元素。Cypress带有一组丰富的API,以及特定于浏览器的命令,例如:执行按钮点击、设置视图等。在上面的代码中,cy.visit()用于打开特定的URL。它类似于driver.getSelenium。cy.get()方法用于在DOM中定位特定的Web元素。一旦访问了一个元素,就可以对该元素执行适当的操作。例如,如果我们找到元素--#sampletodotext,我们可以在文本框中输入“HappyTestingatLambdaTest”。cy.log()方法用于将消息打印到赛普拉斯控制台日志。在Cypress中,我们可以通过cy.contains()方法轻松获取包含特定文本的DOM元素。在安装Cypress的宿主机上,有Chrome86、Firefox82、Edge86和Electron85四种浏览器可供选择。因此,为了执行上述测试,我们只需导航到Cypress仪表板中的“测试”选项卡,在我们首选的浏览器(例如Chrome86)中单击测试文件(即Cypress_ToDoApp.js)。下图是测试进行中的快照:测试成功的快照如下图所示。可见Cypress可以实时显示执行状态,提示代码是否有问题。Cypress简化了WebApp测试Cypress通过以下方式极大地简化了开发人员和QA工程师的工作。查找网络元素从Cypress的实现可以看出,网络元素不是由标准网络定位器(即XPath、名称等)识别的。那么,脚本将如何定位DOM中的元素呢?Cypress在名为“SelectorPlayground”的测试运行器中有一个很棒的功能,可以帮助查找Web元素。您可以通过单击要测试的URL旁边的“打开选择器游乐场”按钮,然后将鼠标悬停在需要提供详细信息的元素上来执行此操作。通过单击web元素,其详细信息将填充并显示在“cy.get”或“cy.contains”(显示测试文件名的区域旁边)中。由于“SelectorPlayground”类似于Chrome(或Firefox)中的检查工具,用户无需额外学习该功能即可修改并执行目标代码。时间点跳转(TimeTravel)由于Cypress在运行测试时会抓拍快照,因此可以灵活回溯到执行时的某个时间点。具体来说,您可以将鼠标悬停在命令日志中的命令上,然后查看该步骤的历史记录。默认情况下,赛普拉斯最多可以保留50个测试值的快照和命令数据。下图是点击LambdaTest的ToDo页面第一个元素(li1)后执行的“JumpinTime”截图。可见,当你想在测试脚本中查看某个特定操作的效果时,“时间点跳转”功能就可以派上用场了。测试执行如前所述,Cypress测试在浏览器内执行。因为它安装在本地,所以它可以访问网络浏览器内外发生的所有事情。这是您在赛普拉斯测试中可能没有注意到任何网络延迟的主要原因。此外,由于Cypress使用与浏览器相同的DOM事件,因此它的命令执行速度比Selenium快得多。另外,Cypress使用了Mocha的BDD语法来实现单元测试和集成测试。MochaJS本身提供了优秀的异步支持。Chai-jQuery、Sinn.JS和Sinon-Chai为Mocha提供了诸如编写带有错误消息的可读声明等功能。下表是上面讨论的Cypress和Selenium在不同方面的总结和比较。如何选择?可见Cypress是一个新兴的迭代工具,而Selenium是自动化测试领域的成熟工具。如果您精通JavaScript并且正在寻找可以在本地主机上执行自动化测试的工具,那么请选择Cypress。同时,如果你的web应用是使用React、Angular等流行的JavaScript框架构建的,对跨浏览器测试的要求不高,那么请选择Cypress。如果您希望您的测试代码在各种浏览器和操作系统上顺利运行,请使用Selenium。此外,由于Selenium测试也可以在基于云的SeleniumGrid上执行,您可以利用LambdaTest平台提供的大规模并行测试。总之,Selenium和Cypress之间没有绝对的赢家,但它们之间确实有很多不同之处。您可以从实际项目的测试覆盖率要求、团队的技能储备以及长远发展的角度,通过试用选择最合适的工具。原标题:SeleniumVs.赛普拉斯:2021年哪个更好?,作者:HimanshuSheth
