【问题标题】:Intermittent "element is not found" in protractor量角器中间歇性“找不到元素”
【发布时间】:2015-09-08 14:47:03
【问题描述】:

在 Protractor 中,我正在尝试编写一个函数来模拟单击响应式导航菜单项(即菜单是顶部的下拉栏或移动设备的汉堡链接)。条形图的结构由 MEANJS 定义,并混入了一些 id="" 属性。

当我一次运行一个规范时,它似乎完全按照我的意愿工作,就像这样:

protractor app/tests/e2e/conf.js --suite mySuite

但是当我运行完整的测试(其中只有 4 个测试)时,就像这样:

protractor app/tests/e2e/conf.js

我开始间歇性地收到此错误(错误来源在以下 2 个地方):

Failed: element not visible

这是我的功能

commonPOs.clickNavBar = function(mainTab, linkUrl) {
  var deferred = protractor.promise.defer();

  var hamburger = element(by.id('nav-hamburger'));
  var linkCssExpression = 'a[href*="' + linkUrl + '"]';

  hamburger.isDisplayed().then(function(result) {
    if ( result ) {
      hamburger.click().then(function() {
        var navBar = hamburger
          .element(by.xpath('../..'))
          .element(by.id('myapp-navbar'));
          return clickItNow(mainTab, linkUrl, navBar);
      });
    } else {
      return clickItNow(mainTab, linkUrl, element(by.id('myapp-navbar')));
    }
  });

  return deferred.promise;

  function clickItNow(mainTab, linkUrl, navBar) {
    var link;
    if(mainTab) {
      // if mainTab was  passed, need to
      // click the parent first to expose the link
      var parentLink;

      if (mainTab == 'ACCTADMIN') {
        parentLink = navBar.element(by.id('account-admin-menu'));
      }
      else {
        parentLink = navBar.element(by.linkText(mainTab));
      }
      expect(parentLink.isPresent()).toBeTruthy();
      parentLink.click();   // FIRST PLACE ERROR HAPPENS
      link = parentLink.element(by.xpath('..')).element(by.css(linkCssExpression));
    } 
    else {
      link = navBar.element(by.css(linkCssExpression));
    }

    expect(link.isPresent()).toBeTruthy();
    link.click();     // SECOND PLACE ERROR HAPPENS
    return deferred.fulfill();
  }
};

我尝试过使用这两种方法,但都不起作用:

browser.sleep(500);
browser.driver.wait(protractor.until.elementIsVisible(parentLink));

我犯了什么 NOOB 异步错误?

【问题讨论】:

    标签: angularjs protractor meanjs


    【解决方案1】:

    自行回答...但任何更好的答案都将赢得绿色复选标记!!!

    已编辑 - 在遇到更多问题后,找到了一个不错的 'waitReady()' contribution from elgalu

    我的原始代码存在一些明显的问题,但修复它们并没有解决问题。在尽我所能完成之后,解决方案似乎是我添加的 expect(navBar.waitReady()).toBeTruthy(); 行。我还必须将嵌套函数拆分出来。无论如何,这是现在似乎可以工作的新代码。更好(全面)的答案将获得绿色复选标记!我很确定这里有一两个缺陷。

    commonPOs.clickNavBar = function(mainTab, linkUrl) {
      var deferred = protractor.promise.defer();
    
      var hamburger = element(by.id('nav-hamburger'));
    
      hamburger.isDisplayed().then(function(result) {
        if ( result ) {
          hamburger.click().then(function() {
            var navBar = hamburger
              .element(by.xpath('../..'))
              .element(by.id('myapp-navbar'));
              return clickItNow(mainTab, linkUrl, navBar, deferred);
          });
        } else {
          return clickItNow(mainTab, linkUrl, element(by.id('myapp-navbar')), deferred);
        }
      });
    
      return deferred.promise;
    };
    
    function clickItNow(mainTab, linkUrl, navBar, deferred) {
      var targetLink;
      var linkCssExpression = 'a[href*="' + linkUrl + '"]';
    
      expect(navBar.waitReady()).toBeTruthy();
    
      if(mainTab) {
        // if mainTab was  passed, neet to
        // click the parent first to expose the link
        var parentTabLink;
    
        if (mainTab == 'ACCTADMIN') {
          parentTabLink = navBar.element(by.id('account-admin-menu'));
        }
        else {
          parentTabLink = navBar.element(by.id('main-menu-' + mainTab));
        }
        // expect(parentTabLink.isDisplayed()).toBeTruthy();
        expect(parentTabLink.waitReady()).toBeTruthy();
        parentTabLink.click();
        targetLink = parentTabLink.element(by.xpath('..')).element(by.css(linkCssExpression));
      }
      else {
        targetLink = navBar.element(by.css(linkCssExpression));
      }
    
      expect(targetLink.isDisplayed()).toBeTruthy();
      targetLink.click().then(function() {
        return deferred.fulfill();
      });
    }
    

    【讨论】:

    • 谢谢你。你能提供一个等待什么的代码示例吗?我似乎正在全力以赴。
    • 酷,很高兴你使用我的 waitReady.js :)
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多