我得到了:
失败:找不到使用定位器的元素
无论我如何对定位器进行编程(我已经尝试过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. ');
});
});
答案 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}}的有效性。