无法使用量角器/茉莉花找到元素,可能是因为sendKey错误

时间:2017-08-04 01:39:35

标签: testing jasmine protractor

我得到了:

  

失败:找不到使用定位器的元素

无论我如何对定位器进行编程(我已经尝试过css,xpath,ID,没有。)

我正在使用的网页:https://phptravels.org/clientarea.php?incorrect=true

输入错误的用户名和密码后,我应该能够收到错误消息。错误消息存储在CSS选择器.alert.alert-danger.text-center中。显示的错误是“登录详细信息不正确”。请再试一次。'

无论我如何格式化这个,我得到了相同的元素未找到问题,但是在调用sendKeys时,它似乎也有效。也就是说,如果我为错误消息取出有问题的代码行,程序的其余部分都没有错误,因此sendKeys应该正常工作,但是在运行程序时我没有观察到实际输入的内容在输入框中(除非它输入sendKey信息并单击按钮这么快我无法看到它?但是为什么程序的其余部分没有快速闪烁?)。所以我不确定这实际上是否是找不到的元素或者是sendKey错误。此外,我已经在这里查看了几个答案,并且有几个Wait类型库,但是当我尝试在我的程序中使用该信息时,我只会得到更多错误。

这是我的代码:

// newSpec.js

browser.waitForAngularEnabled(false);

describe('Protractor Demo App', function() {
it('should have a title', function() {
browser.get('http://phptravels.com/demo');

expect(browser.getTitle()).toEqual('PHPTRAVELS | Demo');
});
});

describe('Login function', function() {
it('should be able to login', function() {
browser.findElement(by.linkText('Login')).click();
expect(element(by.xpath('//div[@class="login"]')).isPresent());

}); 
});



describe('Enter name', function() {
var inputEmail = element(by.css('#inputEmail'));
var inputPassword = element(by.css('#inputPassword'));  
var goButton = element(by.css('#login'));

it('should be able to enter user name', function() {
browser.get('https://phptravels.org/clientarea.php');

     inputEmail.sendKeys('Test Test');
     inputPassword.sendKeys('Password123');


     browser.sleep(500); 
 goButton.click();
     browser.sleep(500); 

 var errorMessage = element(by.id('#.alert.alert-danger.text-center'));
 expect(errorMessage.getText()).toEqual('   Login Details Incorrect. Please        try again. ');

 });
});

1 个答案:

答案 0 :(得分:2)

您正尝试在by.id定位器中使用CSS选择器。

使用by.css$快捷方式:

var errorMessage = $('.alert.alert-danger');

然后,您可以使用Explicit Wait强制执行该操作以解决可能的时间问题:

var errorMessage = $('.alert.alert-danger');

var EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(errorMessage), 5000);

expect(errorMessage.getText()).toEqual('Login Details Incorrect. Please        try again.');

我还认为你应该在测试中调用waitForAngularEnabled()。这对我有用:

describe('Enter name', function() {
    var inputEmail = element(by.css('#inputEmail'));
    var inputPassword = element(by.css('#inputPassword'));
    var goButton = element(by.css('#login'));

    it('should be able to enter user name', function() {
        browser.waitForAngularEnabled(false);
        browser.get('https://phptravels.org/clientarea.php');

        inputEmail.sendKeys('Test@test.com');
        inputPassword.sendKeys('Password123');

        browser.sleep(500);
        goButton.click();
        browser.sleep(500);

        var errorMessage = $('.alert.alert-danger');
        expect(errorMessage.getText()).toEqual('Login Details Incorrect. Please try again.');

    });
});

关于" by id"的说明定位器问题:

请注意(无耻的自我推销),如果您将ESLint静态代码分析工具与eslint-plugin-protractor plugin结合使用,您可以更早地发现此问题 - 有一个valid-by-id rule检查传递给id的{​​{1}}的有效性。