在量角器中处理安全登录页面



我的团队正在为一个新的web应用程序使用AngularJs和Polymer组件。我正在研究如何为此创建一个UI自动化套件。经过大量的研究,看起来Protractor可能会在这里帮助我对聚合物进行一些调整。但是,目前的挑战如下-

  1. 我导航到应用程序
  2. 作为我们公司政策的一部分,每次网络访问都是经过验证的(除非在同一会话中)。以下是验证的工作方式-
    • 键入所需的url后会出现登录页面(非Anugular)。使用凭据登录
    • 另一个中间页面出现在它要求等待页面加载或单击链接转到下一页的位置。单击链接
    • Url更改回#1中使用的原始Url注意:这些验证页面需要花费大量时间来加载(更改不同的内部url)。此外,验证有时会被跳过(在同一会话中或通过某些其他逻辑)

我一直在努力设计一个原型来处理所有这些。在设计原型时,我也在尝试使用页面对象。这是我迄今为止所拥有的。

login.js
________________________________________________________
var currentUrl;
var lastChangedUrl;
var secureUrl = 'corplogin.ssogen2.corporate.company.com';
var getwayUrl = 'gateway.zscalertwo.net';

var loginSuite = function(driver) {
var defer = protractor.promise.defer();
describe('Handle login', function() {
/*afterEach(function() {
//driver.manage().deleteAllCookies();
})*/
//it('Login to security test', function(){
//********** Wait for page to load/URL to change to secure login page ************
driver.getCurrentUrl().then(function(url) {
currentUrl = url;
}).then(function() {
driver.wait(function() {
return driver.getCurrentUrl().then(function (url) {
lastChangedUrl = url;
return url !== currentUrl;
});
});
}).then(function() {
//********** login to secure page ************
if (lastChangedUrl.indexOf(secureUrl) > -1  || lastChangedUrl.indexOf(getwayUrl) > -1) {
var element = driver.findElement(By.name("username"));
element.sendKeys("Username");
element = driver.findElement(By.name("password"));
element.sendKeys("password"); //Give password
element = driver.findElement(By.name("submitFrm"));
element.click();
}
}).then (function() {
//********** page is slow. wait for page to load/URL to change ************
driver.getCurrentUrl().then(function(url) {
currentUrl = url;
}).then(function() {
driver.wait(function() {
return driver.getCurrentUrl().then(function (url) {
lastChangedUrl = url;
return url !== currentUrl;
});
});
}).then (function() {
//********** Click on the link to to go to test page ***********
if (lastChangedUrl.indexOf(getwayUrl) > -1) {
var element = driver.findElement(By.tagName("a"));
console.log("before click............");
element.click();
} 
//********** page is slow. wait for page to load/URL to change ************
driver.getCurrentUrl().then(function(url) {
currentUrl = url;
}).then(function() {
driver.wait(function() {
return driver.getCurrentUrl().then(function (url) {
lastChangedUrl = url;
return url !== currentUrl;
});
});
})
.then (function() {
//return defer.promise;
//browser.pause();
}); 
}, 60000);                  
});
//});
}, 60000);
return defer.promise;
};
module.exports = loginSuite; 

spec.js
___________________________________________________________________________
describe('Protractor Demo App', function() {
var myUrl = 'http://<my test app url>/';
var driver = browser.driver;
beforeEach(function() {
driver.get(myUrl);
});

it('should login', function() {
loginSuite(driver)
.then(
function(){
console.log("End of tests:");
expect(driver.getCurrentUrl()).toBe(myUrl);
});
});

这里的问题-

我的期望是在处理完安全登录页面后,将promise返回到spec.js,这样我就可以使用驱动程序对象继续进行其他测试。为了进行测试,我正在记录"测试结束"消息,并进行虚拟验证。但是,看起来这两行并没有被执行。

登录到安全网站工作,我看到页面更改为原来的测试页面。我用Browser.pause()进行了测试。但是,日志记录"测试结束"从未发生,验证也从未发生。

  1. 我需要处理安全登录页面没有出现的情况。不确定我需要在login.js页面中做什么调整

我对页面对象和处理promise的方法在这里是错误的吗?当所有代码都放在一个js文件下时,我可以在测试应用程序页面上更进一步,而不是为页面对象拆分它们。请在这里帮忙。

我想与您分享解决问题的"聚合物方法"。下面的代码使用两个元素来监控URL、身份验证流、访问的上一个页面,并将用户登录/注销应用程序

第一个将绑定到原始路由,因此您可以将用户发送回那里

<app-route
route="{{route}}"
pattern="/origin/:page"
data="{{data}}"
tail="{{subroute}}">
</app-route>

第二个将绑定到authPage,允许您显示/隐藏auth页面。

<app-route
route="{{subroute}}"
pattern=":authPage"
data="{{data}}
active="{{authPageActive}}">
</app-route>

用户身份验证、监视和页面重定向
使用元素:<firebase-auth>
用户是否被选中?:signedIn="{{isSignedIn}}"

<firebase-auth id="auth" user="{{user}}" provider="google" on-
error="handleError" signedIn="{{isSignedIn}}"></firebase-auth>

添加一个观察员

observers: [
'_userSignedInStatus(isSignedIn)' // observe the user in/out
],

添加功能

_userSignedInStatus: function (isSignedIn) {
if (isSignedIn === false) {
this.page = 'view404'; // redirect the user to another page
// import an element that cover the view
} else {
//send a  log message to your database
}
}

最新更新