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

Testing 无法使用量角器/jasmine找到元素,可能是因为sendKey错误,testing,jasmine,protractor,Testing,Jasmine,Protractor,我得到: 失败:使用定位器未找到任何元素 无论我如何编程定位器(我已经尝试过css、xpath、ID……什么都没有) 我正在使用的网页: 输入错误的用户名和密码后,我应该能够收到错误消息。错误消息存储在CSS选择器中。alert.alert-danger.text-center。显示的错误是“登录详细信息不正确”。请再试一次 无论我如何格式化它,我都会得到相同的元素NotFound问题,但在调用sendKeys时,它似乎也能工作。也就是说,如果我去掉错误消息中有问题的代码行,程序的其余部分将无错

我得到:

失败:使用定位器未找到任何元素

无论我如何编程定位器(我已经尝试过css、xpath、ID……什么都没有)

我正在使用的网页:

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

无论我如何格式化它,我都会得到相同的元素NotFound问题,但在调用sendKeys时,它似乎也能工作。也就是说,如果我去掉错误消息中有问题的代码行,程序的其余部分将无错误通过,因此sendKeys应该可以工作,但在运行程序时,我没有观察到任何实际输入到输入框中的内容(除非它输入sendKey信息并快速单击按钮,否则我看不到它?但是为什么程序的其余部分没有闪电般的快?)。因此,我不确定这究竟是一个未找到的元素还是一个sendKey错误。此外,我在这里查看了几个答案,有几个等待类型库,但当我尝试在程序中使用这些信息时,我只会得到更多错误

这是我的密码:

// 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. ');

 });
});

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

使用
by.css
$
快捷方式:

var errorMessage = $('.alert.alert-danger');
然后,您可以使用强制执行来解决可能的时间问题:

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.');

    });
});

关于“按id”定位器问题的说明:


注意(无耻的自我推销),如果您将
ESLint
静态代码分析工具与一起使用,您可能会更早地发现此问题-有一个检查
id
通过.id传递给
by.id

的有效性的工具。很抱歉,我对文件本身进行了多次编辑,将其放在这里时编辑错误。我将其改回.css,还是一样的问题。我会查一下ESLintthough@JuliePixie好的,没问题,我添加了更多要尝试的内容。谢谢。现在我得到了超时错误(我上下调整了超时值,没有结果)。结合没有找到元素错误和超时错误,我认为是sendKeys造成的,特别是当我将超时调整得更长时,我仍然看不到输入的键。但是,为什么sendKeys在看起来如此简单的情况下不起作用?@JuliePixie好的,只是确认一下,你看不到输入的键电子邮件和密码输入?不,谢谢你坚持我的观点。如果我点击按钮结束测试,测试用例将正常执行,没有错误,但在任何时候我都看不到在这两个字段中输入的任何内容。