如果我们看一下Protractor的体系结构,则Protractor使用WebDriver JS来调用Selenium Webdriver,后者最终会调用浏览器驱动程序,然后调用浏览器。现在,由于Selenium正在将命令传递给浏览器驱动程序,为什么我们不能仅使用Selenium来自动执行Angular页面?

评论

您认为我们无法将WebDriver用于Angular页面的依据是什么?您有编写WebDriver测试的动手经验吗?您是否查看过Angular页面并尝试为其编写普通的webdriver测试?还是您的学术兴趣?你的技能水平是多少?我确实为Angular页面编写了webdriver测试。 “简单编程的问题”(TM):-)

那么,如果我们可以在AngularJS页面中使用硒,为什么还要制造Protractor和WebdriverJS?

量角器是一个框架,因此您可以更轻松地自动执行AngularJS页面。但是也应该与Selenium一起使用。

??为什么我们不能使用硒来测试angularJS应用程序?

使用WebDriver进行测试时,角度页面是众所周知的难题,因为它会产生混乱的标记,避免了干净页面对象所需的ID和名称属性,并创建了可靠而强大的定位器。

#1 楼

我确实使用Webdriver来使用Angular页面。这样就可以了,OP的假设是错误的。 ,将id或名称添加到所需的任何元素都很容易。
Angular在交互和DOM操作中大量使用ID。结果,WebDriver测试不能依靠ID来定位元素,而按名称进行定位会比较麻烦(非唯一性等)。但是您仍然可以使用WebDriver编写测试(毕竟Protractor是在皮肤下进行的)。
WebDriver测试与Angular无关,他们对Angular以及用于操作DOM的页面上的复杂机制一无所知。
量角器了解Angular,这使开发人员可以更轻松地编写基于量角器的测试,而且价格一如既往。
在这种情况下,价格是用JavaScript编写测试,这是一种充满古怪的语言,隐藏的陷阱,许多人都希望避免:-)有关陷阱的完整摘要,请参见JavaScript Garden
。我认为(基于我们的经验)开发人员选择在Protractor / JavaScript中开发低级测试(以使用Angular的内部组件),但是e2e使用其他一些不太古怪的语言(在我们的示例中为Python)进行测试,以提高生产率并减少脆弱性。通常,他们已经(或应该拥有)框架/方法来为非Angular页面编写e2e测试,因此针对Angular页面的纯WebDriver测试与其他e2e测试是一致的。
编辑(2018年4月):Angular2 +是对AngularJS的重大改动。 Angular2 +不再支持某些特定于AngularJS的定位器策略(并且没有实现它们的计划),因此使用JS的动机甚至更少(除了Angular东西的JS单元测试)。因此,在谈论/阅读“ Angular”时,您需要知道我们在谈论哪个版本,它们有很大的不同。
我们目前的策略是在JS中实现Angular2 +单元测试(模型,基本操作),以及单条快乐路径UI测试。更全面的UI测试将在Python / WebDriver中进行。是的,这只是工作上的一点重复(定位符在JS和Python中都可以,但是定位符很简单)。我们更喜欢Python,因为其中包含很多代码,包括测试工具/夹具,从Python调用它们比从JS调用更容易,因此我们认为这是最好的折衷方案。

这就是为什么我问OP关于任何动手经验的原因。对于任何具有同时编写WebDriver和Protractor测试经验的人来说,这都取决于品味和偏好。避免量角器。如果您不喜欢使用JavaScript,那么您就会知道为什么要避免使用JavaScript。 :-)
...我又卷入了另一场圣战,喜欢JavaScript的人正在拒绝这个答案,因为我不喜欢他们喜欢的语言。即使我解释了我决定跳过Protractor的确切原因是什么(而正是由于OP的要求,却在使用WebDriver测试Angular页面时却错过了它的某些良好功能所带来的好处)。我以为第一段会涉及到它,但是显然这还不够。 :-/

评论


如果您像大多数其他语言一样问我,Python也有一些奇怪的怪癖。参见wiki.theory.org/YourLanguageSucks,我真的不明白为什么您需要在此处猛击JavaScript,而问题甚至与编程语言无关。如果您了解如何在用例中使用JavaScript,那么JavaScript也非常优雅。我认为Protractor和Nightwatch.js存在是因为某些开发人员确实想用JavaScript而不是用Java或Python编写e2e测试。在这种情况下,Google的开发人员。

– Niels van Reijmersdal
16年7月4日在22:41



我想我确实提到了使用JS和Protractor的好处,不确定您如何错过它们。 :-)我被Perl迷住了,所以我认为任何具有古怪的自动生存能力的语言(包括JS)都可疑。显然,您尚未被JS烧死。同样,一般的开发人员只精通几种语言,并将其用作首选工具。掌握JS并不容易。我提到了一个原因-可变自动生存。另一个是:JS不是面向对象的,而是基于原型的,它创建了一组不同的细微怪癖。但是所有拥有权力的人都喜欢它。

–Peter M.-代表莫妮卡(Monica)
16年7月5日在14:42

记录显示,与动态兄弟姐妹相比,JavaScript不仅是更好的面向对象的语言,而且功能性语言也要好得多。唯一的缺点是首先要看到真正的隐藏之美,您必须将JavaScript的初学者传递到中级,但恕我直言如果您要做的不仅仅是单击按钮,最终会获得更好的回报。

– Vishal Aggarwal
18年4月28日在0:55

#2 楼

锤子与螺丝刀
是的,可以,但是效率很低,而且要经过大量的硬编码等待!
锤子或螺丝刀上的螺丝钉会更好些?在指甲上,但是如果您正在用螺丝加工,那么如果您有一个(量角器!),最好使用螺丝起子。
我已经使用硒和量角器来测试角位,并且最近几年使用量角器广泛地为Angular / AngualrJS前端应用程序设计大规模测试自动化。
根据我的经验,使用硒代替量角器就像重新发明轮子一样,或者以高效的方式实现量角器的工作(这将需要很多工作,请参见下文)或通过硬编码在整个地方等待,这不是一个专业成熟的可缩放的高效解决方案。量角器在使用时使用的特殊的未记录可测试性API想同步。该API允许提供一种回调函数,一旦所有异步操作完成,就会被调用。
量角器在页面上注入了一些函数。其中之一是waitForAngular(rootSelector,callback)函数。量角器每次想要进行同步时都会调用此函数。
此函数用作同步外观–它希望调用方提供一个回调函数,一旦Angular表示没有异步操作运行,该回调函数将被调用。不同版本的Angular提供不同的可测试性API,因此waitForAngular()必须知道如何使用所有这些API。 。

#3 楼

我的猜测是,Protractor的创建者(与AngularJS是同一团队)只是不想切换语言进行E2E测试,因此他们努力将Selenium WebDriver引入NodeJS。

评论


实际上,Protactor正在使用webdriverjs将Selenium带入NodeJS世界。 WebDriverJS来自SeleniumHQ团队。量角器只是为了简化Angular应用程序的测试而构建。

– Niels van Reijmersdal
16年7月4日在22:22



#4 楼

最好的做法是,以与编写被测程序相同的语言在GUI级别进行自动化测试。或者实际上,在任何级别上,它也适用于API,业务逻辑,数据存储等在堆栈上已经制作了许多层。
这有助于共同承担责任。没有开发人员会希望他们的构建失败并且无法理解出了什么问题。这样的理由少了,因为“没有人知道他们所用的语言”,所以不维护测试。

#5 楼

Selenium WebDriver是启用自动化的工具/库,而Protractor是定义自动化设计/结构的Test Runner / Test Framework。脆弱我已经使用SerenityBDD和Selenium WebDriver自动化AngularJS应用近3年了。我使用与CI工具集成的Selenium Grid在5个VM上运行了大约2000个测试用例。当我们在开发功能下进行测试时,开发分支的脆弱性很高,而由于构建稳定,生产分支的脆弱性很低。
Selenium WebDriver可能与AngularJS应用程序存在同步问题,但这不应限制/限制我们从功能测试。不稳定的测试可以通过引入自定义的等待,捕获已知的异常,软断言以及重试失败的测试步骤来解决,以确保同步。

评论


量角器不是测试运行程序,也不是测试框架。

– Vishal Aggarwal
18年4月28日在0:31

我也有类似的经历。在正确的位置增加50毫秒的等待时间可以将片状测试变成稳定的测试。丑陋但可以正常工作。我认为这是浏览器自动化问题,而不是Selenium问题。

–Peter M.-代表莫妮卡(Monica)
18年6月15日在14:09

#6 楼

您可以只使用普通的Selenium来测试Angular应用程序。量角器只是使测试Angular应用程序更加容易。它是一个用于测试Angular应用程序的框架。
它具有“自动等待”元素,您可以按Model和By.binding访问特定的Angular元素。此外,它在框架中实现了页面对象,如果正确使用测试,则测试将更易于维护。可能还有更多的增强功能未在量角器的首页上列出。

#7 楼

几年来,我一直成功地使用selenium \ watir \ ruby​​作为我的技术堆栈来自动执行angularjs e2e测试。我在2014年首次尝试使用量角器\柴\茉莉花是火车残骸。堆栈和angularjs还处于起步阶段,我的团队忙于输入错误并等待请求请求。出于必要,我将每个人都切换到selenium \ watir \ ruby​​并按时完成了项目。从我在这样的板上所读到的内容来看,自从我上次接触Protractor以来,它已经有5年多的成熟了,这表明没有提出需要,我需要重新评估Protractor。下一个项目是Angular 6,我打算同时使用selenium \ watir \ ruby​​。如果必须切换,请在此处发布:-)

评论


而且您没有遇到任何重大的同步问题???

– Vishal Aggarwal
19年3月19日在10:11

#8 楼

我有一个用Angular 2制作的网站,我开始认为Selenium不能在测试时依赖。
我的测试可以通过一分钟,而又通过另一分钟,而无需更改代码。
关于Angular 2的量角器,它不涉及承诺的问题。因此它也不可靠。

评论


我不同意。参见@ZeeshanSiddiqui答案。在正确的位置增加50毫秒的等待时间可以将片状测试变成稳定的测试。我认为脆弱是浏览器自动化的问题,而不是硒的问题。

–Peter M.-代表莫妮卡(Monica)
18年6月15日在14:11