使用Protractor browser.driver作为变量

时间:2017-03-24 14:06:44

标签: protractor

我正在使用页面对象模型而且我坚持如何将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

2 个答案:

答案 0 :(得分:2)

browser.driver的类型为Webdriver,当调用findElement时,selenium-webdriver将尝试评估代码中的任何位置。因此,在您的登录方法和可能导航到登录页面之前,您将自动查找UserNamePasswordinput[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();