我正在使用页面对象模型而且我坚持如何将browser.driver
元素作为变量。
以下是与Protractor
的{{1}}一起使用的示例:
element
然后我可以在整个测试过程中使用var Messages = function() {};
var messagesLink = element(by.css('a[href*="/Messages"]'));
Messages.prototype.visitPage = function() {
messagesLink.click();
};
exports.Messages = new Messages();
。问题是当我尝试用Messages.visitPage();
:
browser.driver
测试在启动之前立即失败,抛出此错误var Login = function() {};
var usernameField = browser.driver.findElement(by.id('UserName'));
var passwordField = browser.driver.findElement(by.id('Password'));
var signOnButton = browser.driver.findElement(by.css('input[value="Sign On"]'));
var registeredUserName = 'user';
var registeredUserPass = 'pass';
Login.prototype.loginAsRegisteredUser = function() {
loginAs(registeredUserName, registeredUserPass);
};
var loginAs = function(userName, pass) {
usernameField.sendKeys(userName);
passwordField.sendKeys(pass);
signOnButton.click();
};
exports.Login = new Login();
。我使用NoSuchElementError: Unable to locate element: *[id="UserName"]
的原因是因为我正在访问非角度页面上的元素。我想尝试保持角度和非角度参考彼此分开。
我不确定browser.driver
如何处理此问题,但在Protractor
我可以使用这样的变量,Selenium
。
那么,无论如何,这可以使用static By cancelButton = By.id("cphMain_btnCancel");
完成吗?
规范文件:
Protractor
答案 0 :(得分:2)
browser.driver的类型为Webdriver
,当调用findElement
时,selenium-webdriver将尝试评估代码中的任何位置。因此,在您的登录方法和可能导航到登录页面之前,您将自动查找UserName
,Password
和input[value="SignOn"]
的Web元素。
在您的代码段中,您似乎应该使用element
。使用element
时,在运行时,将评估findElement
。这允许更多可重用的代码。
对于非角度页面,您可能必须提供自己的同步或任意睡眠。这通常发生在动画,长负载屏幕等情况下。
另外请确保退回您的承诺,以便茉莉花包装器正确评估您的功能。
var usernameField = element(by.id('UserName'));
var passwordField = element(by.id('Password'));
var signOnButton = element(by.css('input[value="Sign On"]'));
// make sure you return your promises so the jasmine wrapper
// evaluates your function properly.
var loginAs = function(userName, pass) {
return usernameField.sendKeys(userName).then(() => {
return passwordField.sendKeys(pass).then(() => {
return signOnButton.click();
});
});
};
答案 1 :(得分:2)
最简单的方法是将findElement包装在函数中并根据需要调用它们
var Login = function() {};
var usernameField = function() {
return browser.driver.findElement(by.id('UserName')); //returns promise
}
var passwordField = function() {
return browser.driver.findElement(by.id('Password'));
}
var signOnButton = function() {
return browser.driver.findElement(by.css('input[value="Sign On"]'));
}
var registeredUserName = 'user';
var registeredUserPass = 'pass';
Login.prototype.loginAsRegisteredUser = function() {
loginAs(registeredUserName, registeredUserPass);
};
var loginAs = function(userName, pass) {
usernameField().sendKeys(userName);
passwordField().sendKeys(pass);
signOnButton().click();
};
exports.Login = new Login();