【问题标题】:How do I return the text of an alert in Protractor?如何在 Protractor 中返回警报文本?
【发布时间】:2015-05-19 15:51:57
【问题描述】:

我有一个填写创建客户页面的测试。单击保存后,会弹出一条警报,其中包含新生成的客户 guid。我正在尝试制作一个单击保存,捕获警报文本,然后将其返回到我的量角器测试以供以后使用的功能。

我不了解这些承诺的工作方式,希望能得到一些帮助!

目前,我使用此功能单击保存按钮,然后检查警报以包含消息:

function saveContactAndCheckMessage(saveMessage){
    var addContact = new addContactPage;
    addContact.saveButton.click().then(function(){
        browser.wait(function(){
            return browser.switchTo().alert().then(
                function(){return true;},
                function(){return false;}
            );
        },3000);
        var popupAlert = browser.switchTo().alert();
        expect(popupAlert.getText()).toContain(saveMessage);
        popupAlert.dismiss();
    });
};

使用此功能,它会等到警报打开,然后检查消息。我想对其进行一些更改,使其不检查消息,而是返回消息以供我的 Protractor 测试存储和以后使用。

function saveContactAndReturnGuid(){
    var addContact = new addContactPage;
    addContact.saveButton.click().then(function(){
        browser.wait(function(){
            return browser.switchTo().alert().then(
                function(){return true;},
                function(){return false;}
            );
        },3000);
        var popupAlert = browser.switchTo().alert();
        var result = popupAlert.getText();
        popupAlert.dismiss();
        return result;
    });
};

然后是调用它的代码:

 var customerGuid = addContactFunctions.saveContactAndReturnGuid();
 expect(customerGuid).toMatch('Example to check what the real guid value is');

不幸的是,这个函数返回一个未定义的变量。如果我稍微改变一下:

        ...
        var popupAlert = browser.switchTo().alert();
        var result = popupAlert.getText();
        expect(result).toMatch('Test');
        return result;
        ...

expect 能够很好地看到函数内部生成的 guid。即使在 expect 之后直接返回,它仍然返回 'undefined'。

我知道这是因为它是异步的,但我不确定要查找什么来解决这个问题。有什么想法可以用这个去哪里吗?

编辑:在函数外部仍将数据显示为未定义的替代方法。

    var customerGuid;

    addContact.saveButton.click().then(function(){
        browser.wait(function(){
            return browser.switchTo().alert().then(
                function(alert){
                    expect(alert.getText()).toContain('test'); <---- This shows the alert message correctly
                    customerGuid = alert.getText(); <---- This shows up as undefined later
                    alert.dismiss();
                    return true;
                },
                function(){
                    return false;
            });
        },3000);
    });

expect(customerGuid).toMatch('test'); <---- Fails, undefined

【问题讨论】:

  • 澄清一下,我可以在函数中访问警报中的文本。我只是无法返回并将该文本保存在我的主程序中。

标签: angularjs webdriver protractor


【解决方案1】:

这是我最终得到的解决方案:

addContact_spec.js

var addContactFunctions = require('./../../pages/addContact/addContact_functions.js');

describe('From an alert, ', function(){
     it('the alert text can be saved', function(){
         var addContactFuncts = new addContactFunctions();

        // Save and get the customer guid
        var custGuid;
        custGuid = addContactFuncts.saveAndReturnGuid();
        expect(custGuid).toContain('randomguid');  <---- This will fail, but have the real guid inside
    });    
});

addContact_functions.js

var addContactPage = require('./../../pages/addContact/addContact_page.js');

module.exports = function(){
this.saveAndReturnGuid = saveAndReturnGuid;

function saveAndReturnGuid() {
    var addContact = new addContactPage();
    return addContact.saveButton.click().then(function (alertText) {
        browser.wait(function () {
            return browser.switchTo().alert().then(
                function () {return true;},
                function () {return false;}
            ); 
        }, 3000);
        var popupAlert = browser.switchTo().alert();
        alertText = popupAlert.getText();
        popupAlert.dismiss();
        return alertText;
    });
};
}

我需要 browser.wait 并返回 browser.switchTo.alert 以等待警报弹出。由于我的知识有限,要找到合适的空间来放置 alertText 只是反复试验。

【讨论】:

    【解决方案2】:

    您正在寻找的是在then 函数中获取警报。

    var myAlertText;
    browser.switchTo().alert()
        .then(function (alert) {
            if (alert) {
                alert.getText(function(alertText){
                    expect(alertText).toContain('Test');
                    myAlertText = alertText;
                });
                return alert.dismiss();
            }
        });
    

    【讨论】:

    • 所以,我可以在那里很好地完成预期并且​​它可以工作。它向我显示文本,成功完成。然后如何将文本返回到我的主程序?
    • 您可以将 alertText 设置为 switchTo 范围之外的 var,然后在进一步的测试中使用它。
    • 我在 browser.switchTo() 之前设置了一个 var customerGuid,但是当我设置 customerGuid = alert.getText() 时,它显示为未定义。
    • 更新了代码示例,使警报文本在函数之外可用。
    • 好吧,我想这是我遇到的问题:我需要在 browser.switchTo 周围使用 browser.wait,否则它会在警报出现之前尝试抓取警报。因此,在 browser.wait 内部,我需要返回 browser.switchTo。由于我要返回 browser.switchTo,因此无法返回 alertText。我可以在 switchTo 内部很好地查看和使用 alertText,但它不会影响它之外的任何内容。有一个 myAlertText = alertText,然后立即 expect(myAlertText).toContain('guid') 将通过,但在外面的任何地方都将返回 undefined。
    猜你喜欢
    • 2022-09-30
    • 2011-09-07
    • 2013-09-17
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多