访问Protractor JS中Angular JS指令内的元素

时间:2015-12-02 11:30:02

标签: javascript angularjs protractor

所以我有一个程序可以将用户添加到数据库中。单击添加用户时,它会调用角度自定义指令,将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:元素不可见

任何人都知道如何解决这个问题已经尝试了一段时间,它只是让我的头发失败了!

3 个答案:

答案 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);

此外部内部定位确保我只能处理指令内的字段。