我们想用qooxdoo模拟器测试来测试我们的应用程序。 我们的应用程序使用位于窗口 qx.ui.window.Window qx.ui.embed.Iframe >用于允许浏览器在本地存储用户名和密码的登录过程。 iframe的内容是一个带有用户名和密码字段的简单表单。
...
<form id="loginform" name="loginform" method="post" action="">
<label><span>E-Mail / Benutzername</span>
<input type="text" value="" name="username"></label>
<label><span>Passwort</span><input type="password" value="" name="password"></label>
<input type="submit" value="Anmelden" id="submitbutton" name="submit"></form>
...
使用模拟器,可以使用 qxhv 定位器在窗口内找到iframe。
this.getSimulation().waitForWidget("qxhv=[@classname=app.window.system.Login]");
现在的问题是我必须&#34; qxTypeKeys&#34;进入用户名和密码字段以验证测试用户。但是iframe的内容超出了模拟器范围。
有什么建议我如何访问这些字段? 或者是否有其他方法,例如在继续之前发送帖子请求?
qx.Class.define("app.simulation.LoginTest", {
extend: simulator.unit.TestCase,
construct : function () {
this.base(arguments);
},
members: {
testLogin: function () {
this.getSimulation().waitForWidget("qxhv=[@classname=app.window.system.Login]");
this.getQxSelenium().qxType(???, "user@example.com");
}
}
});
答案 0 :(得分:1)
对于纯HTML表单,我使用一个简单的XPath定位器:
//form[@id='loginform']/*/input[@name='username']
这样你就不必担心周围的qooxdoo小部件了。
此外,您只需要使用qx *方法与小部件进行交互,对于纯HTML元素,您可以使用标准的Selenium方法(尽管qx *方法仍然有效):
this.getQxSelenium().type("//form[@id='loginform']/*/input[@name='username']", "user@example.com");
答案 1 :(得分:0)
根据Daniel Wagner的回答,我为模拟器测试创建了以下抽象基类。该方法访问iframe,填写表单,并将from提交给服务器并等待成功响应。
qx.Class.define("app.simulation.AbstractSimulation", {
extend: simulator.unit.TestCase,
type: "abstract",
construct : function () {
this.base(arguments);
this.baseLocators = {
loginWindow : "qxhv=*/[@classname=app.window.system.Login]",
startPage : "qxhv=*/[@classname=app.lib.ui.widget.StartPage]"
};
},
members: {
__loginDone : false,
/*
---------------------------------------------------------------------------
TESTS
---------------------------------------------------------------------------
*/
_loginToApp : function(user, password)
{
if (this.__loginDone) {
return;
}
var loginToApp = 'function(user, password) {'
+ 'var iframe = selenium.qxStoredVars["autWindow"].document.getElementsByTagName("iframe")[0];'
+ 'iframe.onload = function () { '
+ ' var innerDoc = iframe.contentDocument || iframe.contentWindow.document;'
+ ' innerDoc.getElementsByName("username")[0].value = user;'
+ ' innerDoc.getElementsByName("password")[0].value = password;'
+ ' innerDoc.getElementById("submitbutton").click();'
+ ' };'
+ '};';
this.getSimulation().waitForWidget(this.baseLocators.loginWindow);
this.getSimulation()._addOwnFunction("loginToApp", loginToApp);
var functionCall = 'selenium.qxStoredVars["autWindow"].qx.Simulation.loginToApp(\"' + user + '\", \"' + password + '\")';
this.getQxSelenium().getEval(functionCall);
this.getSimulation().waitForWidget(this.baseLocators.startPage, 30000);
this.__loginDone = true;
},
/**
* Login with Root User
*/
loginToAppWithRoot : function ()
{
this._loginToApp("root", "root");
}
}
});