【问题标题】:Return modal element, open it if necessary返回模态元素,必要时打开
【发布时间】:2017-01-24 13:02:56
【问题描述】:

我正在重构我的 PageObject 以进行测试。目前,我正在检查模式中 2 个不同按钮中存在的标签。

/* home-spec.js */
it('Some test', function(){
        expect(homePage.getButton1Label()).toEqual(expectations.btn1);
        expect(homePage.getButton2Label(true)).toEqual(expectations.btn2);
});

虽然这目前可行,但我需要传递一个变量来指示模态是否打开。这就是我要解决的问题。

/* home-page.js */  
var HomePage = function () {

function getModalContent(modalName, isModalOpen){
    /* isModalOpen =  element(by.css('.modal-content')).isPresent(); */
    if(!isModalOpen){
        var manageProductsView = getUiView('SOME_VIEW');
        var btn = getButton(manageProductsView);
        btn.click();
        browser.waitForAngular();
    }
    return element(by.css('.modal-content'));
}

function getButtonLabel(buttonBinding, isModalOpen){
    /* isModalOpen =  element(by.css('.modal-content')).isPresent(); */
    var modalcontent = getModalContent('MODAL_NAME', isModalOpen);
    var modalFooter = modalcontent.element(by.css('.modal-footer'));
    var btn = modalFooter.element(by.binding(buttonBinding));
    return btn.getText(); 
} 


    return {
        getButton1Label: function(isModalOpen){
            return getButtonLabel('btn1', isModalOpen);
        },
        getButton2Label: function(isModalOpen){
            return getButtonLabel('btn2', isModalOpen);
        }
    }
}

我想做的是删除 isModalOpen 依赖项,但我似乎没有找到正确的方法。 cmets 表明我已经尝试过并且似乎是要走的路。还尝试将其包装在 then 块中。

编辑
基于Vlad answer 我编辑了我的getButtonLabel 函数,以便检查模态是否打开

function getButtonLabel(buttonBinding){
  return element(by.css('.modal-content')).isPresent().then(function(isModalOpen){
      var modalcontent = getModalContent('MODAL_NAME', isModalOpen);
      var modalFooter = modalcontent.element(by.css('.modal-footer'));
      var btn = modalFooter.element(by.binding(buttonBinding));
      return btn.getText(); 
  });
} 

试图避免手动处理承诺,但我想在某些情况下这是不可避免的

【问题讨论】:

  • 删除 isModalOpen 而不是这个检查模式是否在 if 条件下可见,使用 if(element(by.css('.modal-content')).isDisplayed())

标签: angularjs selenium protractor angularjs-e2e e2e-testing


【解决方案1】:

您评论的部分是要走的路:

function getModalContent(modalName){
    var modalContent =  element(by.css('.modal-content'));
    var isModalOpen = modalContent.isPresent();
    return isModalOpen.then(function(open) {
        if(!open){
        var manageProductsView = getUiView('SOME_VIEW');
        var btn = getButton(manageProductsView);
        return btn.click()
            .then(function(){
                return modalContent;
            });
        }
        return modalContent;
    });
}

function getButtonLabel(buttonBinding){
    var modalcontent = getModalContent('MODAL_NAME');
    var btnText = modalcontent
        .then(function(content) {
             return content
                 .element(by.css('.modal-footer'))
                 .element(by.binding(buttonBinding))
                 .getText();
        });
    return btnText; 
} 

请注意,模式在测试后仍保持打开状态,如果它处于打开状态,您可能需要添加一些内容来关闭它,以在整个测试过程中保持一致的状态。

在对其进行操作之前确定它是否已打开要好得多,这样您就可以自己打开它,如果它不是并且您需要它,而不是执行这样的条件 - 它们很昂贵,因为承诺链。

我的总体感觉是逻辑看起来有点太复杂了,你可能想在未来重构一些东西:p

【讨论】:

  • 它有帮助。根据您的输入,我更新了我的 getButtonLabel 函数。给它看看编辑
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2021-09-17
  • 2015-07-17
  • 2019-07-03
  • 1970-01-01
  • 2017-05-06
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多