我正在测试用.NET Backend和AngularJS前端编写的应用程序。 使用Selenium编写一些自动化测试和specflow集成(C#)。
我已经完成了初始设置,但我遇到的最大困难之一就是检测动态网页元素。由于应用程序使用的是Angular,因此除非我尝试使用XPath,否则无法轻松识别大多数元素。 Selenium不支持化合物类名称,即“class =”ng-pristine ng-valid ng-touching“”并且ID不断变化。
有更好的方法吗?还是我可以用来让我的生活更轻松的图书馆?
任何输入赞赏:)
答案 0 :(得分:5)
为了测试AngularJS应用程序,我建议您使用Protractor。这是AngularJS应用程序的端到端测试框架。当您使用任何自动化工具自动化Angular应用程序时,您遇到的问题非常普遍,这就是Google推出Protractor的原因。
对于复合类使用:
driver.findElement(By.cssSelector(".ng-pristine.ng-valid.ng-touched");
答案 1 :(得分:2)
我同意Shubhasmit Gupta。唯一的问题是原始的Protractor是基于JavaScript的,并且可能是挑战开始使用它。我建议使用Protractor.NET,它也允许你使用SpecFlow。
Protractor的主要优点是它允许使用特定的角度定位器: NgBy.Model,NgBy.Repeater,NgBy.Binding等。并提供良好的同步机制。
因为Protractor是selenium的包装器,所以你可以使用所有的Selenium函数。
答案 2 :(得分:1)
Shubhasmit Gupta对于使用Protractor AngularJS应用程序是正确的。 但如果你还没准备好走这条路,那么使用 xpath 有什么问题?
使用您的示例,您可以使用类参数轻松识别您的对象,如果您确定,那么不会再有动态加载的类:
//*[@class='ng-pristine ng-valid ng-touched']
或者像这样,如果有可能动态地在该元素上加载更多的类:
//*[contains(@class='ng-pristine ng-valid ng-touched')]
或者,即使您班级的顺序可能会发生变化:
//*[contains(@class='ng-pristine') and contains(@class='ng-valid') and contains(@class='ng-touched')]
当然,这种方法假设您的元素可以通过这种类属性的组合唯一地标识,或者您正在搜索一组对象,或者您将使用其他属性来使标识唯一。
使用cssSelector
的&Shubhasmit Guptas方法通常被认为是更快更精确的方法,如果您能够通过这种类组合识别对象。如果您需要的可能属性多于类,那么xpath
会受到青睐。