【问题标题】:Error while waiting for the protractor to sync with the page: "Cannot read property 'get' of undefined"等待量角器与页面同步时出错:“无法读取未定义的属性'get'”
【发布时间】:2015-04-28 04:06:08
【问题描述】:

我的测试目标页面有 SSO 集成登录。一旦我点击页面,将发生 SSO 集成 Windows 身份验证,然后定向到主页。

我尝试关闭同步,它适用于第一次测试以检查标题,但对于第二次测试,它将返回错误无法定位元素,当我打开同步时,它将返回不同步错误和未定义错误。

describe('Test area to ', function () {

var menuObjects = require('../page/MenuObjects.js');

it('Verify Page Title', function () {
    menuObjects.setSyncOff(); 
    browser.get('/home/');
    expect(browser.getTitle()).toEqual('Home');
    browser.driver.sleep(3000);
});

it('Navigate ', function () {
    menuObjects.setSyncOn();
    menuObjects.menuButton.click();        
});
});

导航错误消息 - 使用 menuObjects.setSyncOn();

等待量角器与页面同步时出错:“无法读取未定义的属性'get'”

导航错误消息 - 使用 menuObjects.setSyncOff();

NoSuchElementError: No element found using locator: By.id("menu-link")

ng-app 包含在正文中的 div 中:

<body style="width: 100%">
<div class="frame" style="width: 100%">
    <div class="container-fluid" style="width: 100%">
        <div class="" style="width: 100%">
            <div style="width: 100%">
                <!--_AngularBaseLayout: BEGIN-->                    

<div ng-app="myHomeApp" ng-cloak class="ng-cloak">
     <div ng-view id="ng-view"> </div>
</div>

有什么建议吗?

【问题讨论】:

  • 应该有 id menu-link 的元素在哪里?假设您的 menuObjects.setSyncOn 正在切换 browser.ignoreSynchronization,请尝试在关闭时通过 browser.driver.get 直接访问 webdriver。
  • 是的,我设置了 ignoreSynchronization true false。 id menu-link 位于正文的第 11 个 div 标签处。

标签: angularjs testing selenium-webdriver protractor end-to-end


【解决方案1】:

如果ng-app未在htmlbody上定义,则需要通过设置rootElement configuration settingprotractor知道:

exports.config = {
  seleniumAddress: env.seleniumAddress,

  baseUrl: env.baseUrl,

  ...

  // Selector for the element housing the angular app.
  rootElement: 'div#nested-ng-app'
};

这将使打开和关闭同步变得不必要 - 量角器将等待角度“稳定下来”,然后再继续执行进一步的测试。


如果这对NoSuchElementError 错误没有帮助,您可以在presenceOf "Expected Condition" 的帮助下明确等待元素出现:

var EC = protractor.ExpectedConditions;

var elm = browser.wait(EC.presenceOf($('#menu-link')), 5000);

【讨论】:

  • 谢谢@alecxe。越来越接近。我确实找到了带有 rootElement 的帖子并尝试了它,但由于某种原因,它没有用,现在,当我把它放在 baseUrl 之下时,它似乎正在工作。在我当前的导航测试中,我更新了下面的代码并且似乎正在单击但量角器仍然报告元素不可见browser.waitForAngular();var EC = protractor.ExpectedConditions;browser.wait(EC.presenceOf($('#menu-link')), 5000);menuObjects.menuButton.click().then(function() {menuObjects.firstButton.click(); });
  • 顺便说一句,我添加了 rootElement: 'div#nested-ng-app' 并且仍在使用同步关闭。否则,仍然会出现同步页面错误。
  • 看起来问题肯定是rootElement,我也试过这个solution,但似乎没有工作:(
  • @user2388556 谢谢,div#nested-ng-app 是一个示例定位器,您需要使用自己的定位器才能找到定义 ng-app 的元素。
  • 是的,我确实尝试关注div#nested-myHomeAppdiv#nested-ng-cloak.ng-cloak#ng-cloakdiv#ng-cloak,但由于某种原因,我仍然需要关闭同步 :(
猜你喜欢
  • 2016-04-26
  • 2018-12-07
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多