所以我有一个程序可以将用户添加到数据库中。单击添加用户时,它会调用角度自定义指令,将HTML呈现给页面。在量角器中,我试图通过查找和填写必填字段来编写测试来添加用户。
到目前为止,这有效:
it('should click the add user button', function(){
browser.waitForAngular();
var addUser = element(by.id('addUserDesktop'));
browser.wait(EC.elementToBeClickable(addUser), 10000);
addUser.click().then(function(){
setTimeout(function(){
expect(element(by.id('useradd')).isPresent()).toBe(true);
},2000);
});
});
我已经在其中设置了一个setTimeout,认为该元素的加载速度可能不足以进行量角器。
在此过后,我有了这个测试:
it('should find and enter data into the required fields to add a user', function(){
browser.driver.findElement(by.id('username')).sendKeys(username);
});
但是我收到了这个错误:
ElementNotVisibleError:元素不可见
任何人都知道如何解决这个问题已经尝试了一段时间,它只是让我的头发失败了!
答案 0 :(得分:0)
在protractor
中,有一种内置机制可以等待页面上满足特定条件。在这种情况下,与visibilityOf
Expected Condition一起使用的browser.wait()
可以解决问题:
var EC = protractor.ExpectedConditions;
addUser.click().then(function() {
browser.wait(EC.visbilityOf(element(by.id('useradd'))), 5000);
});
答案 1 :(得分:0)
是否可能存在多个元素' .username'在这个页面的HTML?请在页面上手动对html进行查找,因为您的测试会看到它,并找出答案。您也可以尝试这样的事情:
var usernames = $$('.username');
expect(usernames.get(0).isDisplayed()).toBeTruthy('First username element not displayed');
只需浏览每个元素,直到找到实际可见的元素。
否则,我认为等待可能会有所帮助,因为@alecxe指出。
答案 2 :(得分:0)
发现是因为该指令正在加载另一个html文件,我不得不等待添加指令。然后在其中定位元素。所以"定位"必须是外/内。
var directive = element(by.id('useradd'));
directive.element(by.model('user.username')).sendKeys(username);
此外部内部定位确保我只能处理指令内的字段。