Angularjs 返回模态元素,必要时将其打开

Angularjs 返回模态元素,必要时将其打开,angularjs,selenium,protractor,angularjs-e2e,e2e-testing,Angularjs,Selenium,Protractor,Angularjs E2e,E2e Testing,我正在为我的测试重构我的系统。目前,我正在检查模式中两个不同按钮中的标签 /* home-spec.js */ it('Some test', function(){ expect(homePage.getButton1Label()).toEqual(expectations.btn1); expect(homePage.getButton2Label(true)).toEqual(expectations.btn2); }); 虽然这目前起作用,但我需要传递

我正在为我的测试重构我的系统。目前,我正在检查模式中两个不同按钮中的标签

/* 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
依赖项,但我似乎没有找到正确的方法。这些评论表明了我已经尝试过的,并且似乎是我要走的路。还尝试将其包装到
然后
块中

编辑
基于此,我编辑了我的
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(); 
  });
} 

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

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

删除isModalOpen,而不是在if条件下检查模态是否可见,而是使用if(element(by.css('.modal content')).isDisplayed(),这很有帮助。根据您的输入,我更新了我的
getButtonLabel
函数。在编辑页面上查看一下