我正在使用Selenium WebDriver和Protractor在我的角度项目上运行e2e测试。我在查找详细API以帮助我了解如何使用驱动程序时遇到了很多麻烦。我的具体问题如下:
我在一个页面上有两个控制器,一个登录控制器和一个寄存器控制器。它们都有一个绑定到user.username的输入。要测试登录,我使用代码:
element(select.model('user.username')).sendKeys('nathanadmin');
我收到警告:警告:
找到定位器by.model(“user.username”)的多个元素 - 您可能需要更具体
在我尝试测试注册之前,这不是问题,在这种情况下我不知道如何告诉它选择第二个'user.username'输入。
我尝试浏览此页面: https://github.com/angular/protractor/blob/master/docs/api.md
这个页面: http://docs.seleniumhq.org/docs/03_webdriver.jsp
但我似乎找不到更全面的API,只是简单解释如何进行更复杂的“选择”。
编辑:
我认为这样的事情会有所帮助:
element(select.model('user.username').first()).sendKeys('nathanadmin');
我想出的是:
element.all(select.model('user.username')).then(function(elements) { elements[0].sendKeys('nathanadmin'); });
但这对我来说仍然没有帮助,因为我正在为webdriver寻找更深入的文档。
答案 0 :(得分:2)
您可以尝试使用类似
的内容 ptor.findElements(protractor.By.model('user.username')).then(function(models){
models[0].sendKeys('nathanadmin');
models[1].sendKeys('secondstring');
});
不确定那是否严格正确但它不会太远,基本上使用findElements获取具有相同标识符的所有元素并将它们保存为数组。我在我的测试中有类似的东西
visibleFilters.findElements(protractor.By.className('dropdown')).then(function(dropdowns){
dropdowns[2].findElement(protractor.By.id(filterID)).click();
希望这会有所帮助
编辑:我的测试代码的原因我有findElement是因为我需要更深入地获取我正在寻找的确切元素但我可以刚刚完成.click()另一个编辑:至于更详细的文档,这是量角器的一个问题,但纯粹是因为团队专注于启动和运行添加新功能/修复错误等,我必须说尽管我想要的大多数信息我在这里或者在github上找到了Julie(不确定第二个名字,是一个量角器信息godess)并定期发布在这里和github帮助人们出去,这对我来说已经足够了
答案 1 :(得分:0)
select.model('user.username')
只是"定位"的一种方法。 DOM中的一个元素,一种特定于Protractor的方法。 WebDriver有许多定位策略,您可能会发现它们更灵活,在您的情况下,更具体。
Protractor规范的这一部分说明了可供您使用的定位器机制: https://github.com/angular/protractor/blob/master/docs/api.md#locator-strategies
考虑隔离单个输入元素的其中一种替代策略:
element(by.id('username')).sendKeys('nathanadmin');
element(by.css('#username')).sendKeys('nathanadmin');