从模拟器访问iframe

时间:2013-12-03 16:53:15

标签: selenium-webdriver qooxdoo

我们想用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");

        }
    }
});

2 个答案:

答案 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");
        }

    }

});