天道酬勤,学无止境

Protractor, AngularJS, Parse — Protractor 不等待 Angular 解析(Protractor, AngularJS, Parse — Protractor does not wait for Angular to resolve)

问题

我是 Protractor 和 AngularJS 的新手。 我在后端使用 Parse。 尝试做一个非常简单的测试:

describe('Test', function () {

beforeEach(function () {
  browser.get('index.html#/example')
});

it('should have a button', function () {

   expect(element(by.css('#test321')).isElementPresent()).toBe(true); //fails 

}); ...

测试失败。 该元素在 template.html 中:

 ...
<body>
    <button id="test321">stuff</button>
...

它由 angular-route 加载。 此路由还从后端加载数据:

...
config(['$routeProvider', function ($routeProvider) {
        $routeProvider.
            when('/example', {
                templateUrl: 'template.html',
                controller: 'templateCtrl',
                resolve: {
                    data: 'dataService' //Data is loaded from Parse. This line causes the problem
                }...

问题是由上面的“数据:”行引起的。 如果我去掉那条线,或者让它返回静态结果,它就可以正常工作。 此外,如果我移动这个元素 index.html 它也可以工作。

这似乎是一个时间问题。 然而,根据文档量角器(或特别是 isElementPresent)在定位元素之前等待所有分辨率。

我被踩到了。 非常感谢您的帮助。

更新:根据this这在量角器1.2中解决了,但我在1.4上。 很奇怪。

回答1

由于这是一个时间问题,解决方法可以是在断言它存在之前等待元素存在:

describe('Test', function () {

beforeEach(function () {
  browser.get('index.html#/example')
});

it('should have a button', function () {
   browser.wait(function() {
       return $('#test321').isPresent(); // keeps waiting until this statement resolves to true
   }, timeToWaitInMilliseconds, 'message to log to console if element is not present after that time');
   expect($('#test321').isPresent()).toBe(true);  

}); ...
回答2

在 Angular 2 中,我在protractor.conf.js文件中使用以下内容:

onPrepare: function() {
    browser.ignoreSynchronization = false;
},
useAllAngular2AppRoots: true
回答3
isPresent() will return promises,so put your expect code inside the callback function and try to execute. 

Try below code.hope it will work,

it('should have a button', function () {

   $('#test321').isPresent().then(function(result){
                                expect(result).toBe(true);
                                 });
 });

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在 Protractor 中发出 HTTP GET+POST 请求(How to make HTTP GET+POST request in Protractor)
    问题 我在 Protractor 中发送 HTTP get 请求时遇到问题。 实际上,我需要在 UI 中执行一些操作后检查数据库中的数据。 如果我能够使用 JQuery 来完成它将会非常有帮助,但是我无法找到如何在 Protractor 中使用 JQuery 的方法。 需要帮忙 !! 实际上,我们确实尝试使用 Node.js 库,如下所示,但在其中遇到了问题。 var http = require('http'); var json_data; http.get('SiteUrl', function(response) { var bodyString = ''; response.setEncoding('utf8'); response.on("data", function(chunk) { bodyString += chunk; }); response.on('end', function() { json_data = bodyString; console.log("1---->" + json_data); }); }).on('error', function(e) { console.log("There is an error in GET request"); }); console.log("2---->" + json_data)
  • 如何在非angularjs网站上使用Protractor?(how to use Protractor on non angularjs website?)
    问题 我发现了针对AngularJS Web应用程序制作的Protractor框架。 如何在未使用AngularJS的网站上使用Protractor? 我写了我的第一个测试,量角器触发了此消息: Error: Angular could not be found on the page https://www.stratexapp.com/ : retries looking for angular exceeded 回答1 如果您的测试需要与非角度页面进行交互,请直接使用browser.driver访问webdriver实例。 量角器docs中的示例 browser.driver.get('http://localhost:8000/login.html'); browser.driver.findElement(by.id('username')).sendKeys('Jane'); browser.driver.findElement(by.id('password')).sendKeys('1234'); browser.driver.findElement(by.id('clickme')).click(); 回答2 另一种方法是在browser.get(...)之前设置browser.ignoreSynchronization = true 。
  • 量角器在 AngularJS 之外的可用性(Usability of Protractor outside of AngularJS)
    问题 所以我最近从使用 AngularJS 切换到 ReactJS,但我确实很喜欢使用 Protractor E2E 测试运行器,所以我想知道关于 Protractor 的两件事。 在完全不使用 AngularJS 的网站上使用量角器有什么重大问题吗? 我知道 Protractor 默认情况下会尝试与 Angular 同步,您会得到: Error: Angular could not be found on the page X : retries looking for angular exceeded 但是我相信可以通过在browser.get()之前执行browser.ignoreSynchronization = true来防止输入消息。 除此之外还有其他问题吗? 另一个问题是 Protractor 是否会成为特定于 AngularJS 的,因为它只能测试 AngularJS 代码? 我认为可以绕过任何 AngularJS 特定功能(就像使用browser.ignoreSynchronization = true ),我只是想确保这是 Protractor 前进的核心目标。 回答1 尽管 Protractor 旨在为 Angular 应用程序编写端到端的测试代码,但它仍然可以用于测试非 Angular 应用程序。 有两种常见的解决方案可以实现这一点: 直接访问包装好的
  • 量角器测试不一致地通过/失败 AngularJS 应用程序(Protractor tests inconsistently passing / failing for AngularJS app)
    问题 我的量角器 e2e 测试不一致地通过和失败。 似乎这可能是由于异步 javascript 所致,如下所述:量角器:单击按钮后如何等待页面完成? . 然而,这里提到了量角器测试自动按顺序/同步执行: https : //github.com/angular/protractor/issues/909 我的测试脚本: describe('Login', function() { var ptor; beforeEach(function() { browser.get('https://127.0.0.1:8443'); ptor = protractor.getInstance(); element(by.id('splash')).click(); browser.ignoreSynchronization = true; // <-- to proceed beyond splash screen }); describe('with correct email and password', function() { beforeEach(function() { element(by.id('email')).sendKeys('admin@email.com'); element(by.id('password')).sendKeys('adminpassword')
  • 使用量角器测试非AngularJS页面上的登录(Use protractor to test login on non-AngularJS page)
    问题 我有一个AngularJS应用,可在GitHub上使用oAuth SSO进行身份验证。 我试图找出一种使用量角器和自动化登录测试的方法。 我无法弄清楚如何检索非角度字段,以及如何管理使用browser.driver加载页面的等待过程,我的规范如下所示: // Create a repository describe('login', function() { it('should login', function() { // this issues a redirect to GitHub browser.driver.get( process.env.HOST + '/auth/github' ) browser.sleep( 4000 ); // Sleep to make sure page loads fully.. // browser.debugger(); // tried to use debugger... var login = element( by.id( "login_field" ) ); login.sendKeys( process.env.USERNAME ); var password = element( by.id( "password" ) ); password.sendKeys( process.env.PASSWORD ) }
  • 等待量角器通过基本量角器测试与页面同步时遇到错误(Running into Error while waiting for Protractor to sync with the page with basic protractor test)
    问题 describe('my homepage', function() { var ptor = protractor.getInstance(); beforeEach(function(){ // ptor.ignoreSynchronization = true; ptor.get('http://localhost/myApp/home.html'); // ptor.sleep(5000); }) describe('login', function(){ var email = element.all(protractor.By.id('email')) , pass = ptor.findElement(protractor.By.id('password')) , loginBtn = ptor.findElement(protractor.By.css('#login button')) ; it('should input and login', function(){ // email.then(function(obj){ // console.log('email', obj) // }) email.sendKeys('josephine@hotmail.com'); pass.sendKeys('shakalakabam'); loginBtn
  • 在Python中将Angular JS(量角器)与Selenium一起使用(Using Angular JS(Protractor) with Selenium in Python)
    问题 我正在尝试使用selenium选择包裹在angular 1中的textarea,但是在DOM中看不到。 有一个名为Pytractor的模块。 我一直在尝试解决此问题,但是我无法正确使用它。 谁能帮我这个? 回答1 您还可以使用常规的硒绑定来测试AngularJS应用程序。 您将需要使用“显式等待”来等待元素的出现,消失,标题/ URL的更改等-用于使您能够继续测试页面的任何操作。 示例(等待textarea元素出现): from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) wait.until(EC.visibility_of_element_located((By.TAG_NAME, "myaccount"))) pytractor (作为protractor本身)提供了一件重要的事情-它知道AngularJS何时结算并准备就绪-模型已更新,没有未完成的异步请求等。这并不意味着您必须使用它来测试AngularJS应用程序
  • 在运行测试之前,AngularJS + Protractor 等待所有 ajax 调用结束/整页加载(AngularJS + Protractor wait for all ajax calls to end / full page load, before running the tests)
    问题 有没有更好的方法来等待所有页面加载完毕, 我的 angular 页面加载了 promise,这意味着如果所有 ajax 调用还没有结束,屏幕上就会有一个加载器。 我目前正在使用 ptor.sleep(10000),如下例所示: beforeEach(function(){ ptor = protractor.getInstance(); driver = ptor.driver; ptor.get(base_url); ptor.sleep(10000); }); 有没有更好的方法来做到这一点? 回答1 如果您在加载开始/完成时使用ng-if隐藏/显示您的内容,您可以使用以下语法等待某个元素出现在页面上(即ng-if将阻止该元素出现在 DOM 中)直到页面加载完成): ptor.findElement(by.id('element-only-shown-after-loading')).then(function (myElement) { // Your page should be loaded at this point });
  • 可以使用硒自动使angularjs应用程序自动化吗? 如果是,为什么要使用量角器?(Can angularjs apps be automated with selenium? if yes, why should we use protractor?)
    问题 我知道我们可以使用Selenium自动化AngularJs应用程序。 但是我们有一个单独的E2E测试框架,它是AngularJs应用程序自动化的量角器。 谁能帮助我了解为什么我们应该使用量角器? 为什么不硒? 回答1 不确定我是否理解您的问题。 我是否可以假设您宁愿使用Selenium,但想了解您所缺少的是什么吗? 好吧-Selenium提供了使Web浏览器自动化的方法-因此可用于自动化e2e测试。 Selenium API具有几种主要编程语言的实现-允许您用Java,C#,python,ruby,JavaScript等编写测试。 如果您已经有一个基于硒的e2e测试框架-您也可以将其用于AngularJS Web应用程序。 您还可以编写必要的JavaScript脚本,这些脚本一旦使用webdriver运行即可让您完成Protractor的所有工作-但您必须自己做(只是从Protractor源代码中借用)。 为什么可行? 因为Protractor基本上采用了Selenium Webdriver的JavaScript实现,并且以某种方式包装了它,从而使您在测试Angular JS Web应用程序时的生活变得更加轻松。 您可以在我的这个旧帖子中看到具体的解释:http://testautomation.applitools.com/post/94994807787
  • 等待量角器与页面同步 50001 毫秒后超时(Timed out waiting for Protractor to synchronize with the page after 50001ms)
    问题 我正在测试 AngularJS 应用程序,并且对量角器非常陌生。 每次打开浏览器时,它都会打开,然后等待超时,然后在 cmd 上抛出以下错误。 Timed out waiting for Protractor to synchronize with the page after 50001ms 我尝试增加超时限制,但总是收到此错误。 我也尝试过使用所有这些: browser.ignoreSynchronization = true; browser.driver.sleep(5000); browser.debugger(); browser.waitForAngular(); 页面加载正确,如果我使用 Eclipse 和 Selenium 与按钮对象交互,它就可以正常工作。 只有量角器有同步问题。 请帮忙。 回答1 量角器超时的可能原因: 您的网页没有以预期的方式实现 Angular(即在body标签上使用ng-app )。 更常见的是,在这种情况下,您将遇到的错误是Angular not found on page,但超时并非不可能。 如果是问题,则使用ignoreSynchronization可以解决此问题,因此这不是您。 HTTP 请求正在挂起或失败。 打开您的开发控制台并在页面加载 Protractor 时检查“网络”选项卡(这可能发生在 Protractor
  • 如何调试等待异步Angular任务的超时? 无法在角度页面上找到元素(How to debug timed out waiting for asynchronous Angular tasks? Failure to find elements on angular page occurring)
    问题 编辑:请注意,在@ ernst-zwingli的帮助下,我找到了问题的根源,因此,如果您遇到相同的错误,他指出的修复方法之一可能会为您提供帮助。 我的问题是量角器本身的一个已知问题,如果您认为可能是您自己,那么我会扩展我的步骤以在最初提出问题之后指出问题的根源。 我试图在使用angular-cli构建的Angular2(仅Angular)应用程序中使用Protractor。 我的问题:当browser.waitForAngularEnabled的默认设置为true时,找不到Angular应用程序页面上的元素(如“我相信我在一个角度页面上,并且希望量角器做到这一点很神奇”) 。 如果我将browser.waitForAngularEnabled设置为false则会发现它们很好(如“我不在一张有角度的页面上,并且想自己解决这个问题,坐在量角器”) 。 如何在我肯定的Angular页面上找到导致此问题的原因? 我有一个带有非Angular Auth0登录页面的产品,该页面可控制对使用Angular(准确地说是Angular 4.3.2)编写的产品的其余部分的访问。 我已成功遍历非Angular登录页面上的登录。 我将waitForAngularEnabled切换为false以方便非Angular登录。 在单击“提交”按钮后,我希望将其初始登录页面(Angular
  • 使用$ resource时,量角器超时,等待与页面同步(Protractor times out waiting for sync with page when using $resource)
    问题 我正在使用小型AngularJS应用测试量角器。 这是测试: describe('Testing Protractor', function() { var draftList; it('should count the number of drafts', function() { browser.get('#/'); draftList = element.all(by.repeater('newsletter in drafts')); expect(draftList.count()).toEqual(2); }); }); 控制器: angular.module('myApp.controllers', []). controller('DraftsCtrl', ['$scope', 'Draft', function($scope, Draft) { $scope.drafts = Draft.query(); }]) 草稿服务: angular.module('myApp.services', ['ngResource']). factory('Draft', ['$resource', function($resource) { return $resource('api/drafts/:id') }]) 使用量角器运行此测试会导致以下错误: Error
  • e2e 使用量角器测试 angularjs(量角器交互模式刹车)(e2e testing angularjs with protractor (protractor interactive mode brakes))
    问题 我正在学习用于 e2e 测试 angularjs 的量角器,但在进行过程中遇到了一些困难。 因为我是这个框架的新手,所以我在学习一些教程,比如 https://egghead.io/lessons/angularjs-protractor-interactive。 观看教程我看到他检查是否已通过*tabbing成功找到元素。 0:56 在本教程中,在他放置 element(by.tagName("button")) 之后,他可能会使用选项卡查看找到的按钮可用的更多选项。 他没有告诉你他实际上是如何做到的,或者他是否使用 Tab 键,但我猜他正在使用 Tab 键检查新发现的元素是否有新的可用选项 我也试过了。 我像他一样制作了一个按钮和输入框,然后进入了交互模式。 element(by.tagName("button")).click() 对我来说很好。 它点击了 index.html 上的按钮。 但是,在单击该元素之前,我无法检查是否已找到该元素。 这意味着当我完成对点元素(by.tagName(“button”))的输入后,我无法通过制表符看到单击选项。 还有更多。 尝试访问命令提示符上的“单击”选项会杀死命令提示符并使其无响应。 我必须强制退出命令提示符并重新启动。 (我上传的图片显示你没有响应的命令提示,如果你做 'bc' 然后 tab。)
  • 将量角器测试与Bootstrapped AngularJS一起使用(Using Protractor Test with Bootstrapped AngularJS)
    问题 我希望能够使用量角器测试我的Angular应用程序。 由于我使用RequireJS,因此无法在DOM中使用ng-app指令,这就是为什么我使用angular.bootstrap手动引导Angular的angular.bootstrap 。 量角器输出如下错误输出: 错误:在页面http://localhost:1428/上找不到Angular:重试查找角度超出了 然后,我意识到量角器文档中有一个警告: 对于使用angular.bootstrap手动引导的应用,Protractor不能立即使用。 您必须使用ng-app指令。 好吧,是否有任何变通办法可以通过手动引导的角度应用程序运行量角器测试,还是应该开始学习替代测试套件? 回答1 去量角器调皮,并添加此 onPrepare: function() { // implicit and page load timeouts browser.manage().timeouts().pageLoadTimeout(40000); browser.manage().timeouts().implicitlyWait(25000); // for non-angular page browser.ignoreSynchronization = true; // sign in before all tests } 对我有用
  • 量角器:单击按钮后如何等待页面完成?(Protractor : How to wait for page complete after click a button?)
    问题 在测试规范中,我需要单击网页上的按钮,然后等待新页面完全加载。 emailEl.sendKeys('jack'); passwordEl.sendKeys('123pwd'); btnLoginEl.click(); // ...Here need to wait for page complete... How? ptor.waitForAngular(); expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg'); 回答1 根据您要执行的操作,可以尝试: browser.waitForAngular(); 或者 btnLoginEl.click().then(function() { // do some stuff }); 兑现诺言如果您可以在beforeEach做到这一点,那就更好了。 注意:我注意到Expect()在比较之前会等待内部的Promise(即getCurrentUrl)得到解决。 回答2 我只是看了一下源代码-量角器仅在少数情况下正在等待Angular(例如,调用element.all或设置/获取位置时)。 因此,量角器无需等待每条命令后Angular的稳定。 另外,有时在我的测试中,我似乎在Angular摘要循环和click事件之间进行了竞争,因此有时我必须这样做: elm.click()
  • 用Selenium测试AngularJS(Testing AngularJS with Selenium)
    问题 我在堆栈ASP MVC + AngularJS上有一个SPA应用程序,我想测试UI。 目前,我正在尝试使用PhantomJS和WebKit驱动程序的Selenium。 这是一个示例测试页面-具有单个元素的视图。 列表项<li>从服务器动态加载,并受Angular限制。 <div id="items"> <li>text</li> <li>text2</li> </div> 我正在尝试通过测试,并且此行中有错误: _driver.FindElements(By.TagName('li')) 此时,没有已加载的元素,并且_driver.PageSource不包含元素。 如何等待商品加载? 请不要建议Thread.Sleep() 回答1 这将等待页面加载/ jquery.ajax(如果存在)和$ http调用,以及任何伴随的摘要/渲染周期,将其放入实用程序函数中,然后等待。 /* C# Example var pageLoadWait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(timeout)); pageLoadWait.Until<bool>( (driver) => { return (bool)JS.ExecuteScript( @"*/ try { if (document.readyState !==
  • 在角量角器茉莉花测试中查看console.log输出(view console.log output in angular protractor jasmine test)
    问题 如何在angularjs量角器茉莉花测试中查看console.log输出? 截至目前,浏览器自身关闭速度过快。 更多信息-我正在使用angularjs教程,步骤8。我正在尝试将e2e测试更改为量角器。 我正在使用的量角器配置文件基于%appdata%\ npm \ node_modules \ protractor \ referenceConf.js。 在配置文件引用的js规范文件中,我有console.log的实例。 但是,在执行量角器e2e测试期间,该网站以chrome打开,我看到浏览器中发生了事情,然后关闭了浏览器,然后才能检查任何console.log输出。 我认为我需要以某种方式保持chrome打开。 如何? 回答1 使用browser.manage().logs().get('browser') browser.manage().logs().get('browser').then(function(browserLogs) { // browserLogs is an array of objects with level and message fields browserLogs.forEach(function(log){ if (log.level.value > 900) { // it's an error log console.log(
  • Protractor: Error while waiting for Protractor to sync with the page: "both angularJS testability and angular testability are undefined
    I am trying to write some end to end tests and waned to use async and await. configuration file exports.config = { framework: 'jasmine', seleniumAddress: 'http://localhost:4444/wd/hub', specs: ['spec.js'], SELENIUM_PROMISE_MANAGER: false, getPageTimeout: 10000, multiCapabilities: [ { browserName: 'firefox' }, { browserName: 'chrome' } ] } spec file describe('home-view', function(){ beforeEach(async function(){ await browser.get('http://localhost:49335/index.html#!/home'); }); it('sorted by firstname', async function(){ await element(by.css("[ng-click=\"sortData('firstname')\"]")).click(); var
  • Angularjs - 在 Protractor e2e 测试中模拟触摸事件(Angularjs - simulate touch event in Protractor e2e test)
    问题 我将 Protractor 与 Jasmine 用于我的移动 Angularjs 应用程序。 我想在特定元素上测试触摸事件(touchStart / touchEnd 等...)。 就像是: it('should play video', function(){ var poster = by.css('.video-poster'); element(poster).??? //Simulate touch event here }); 回答1 更新: 由于量角器返回一个 Selenium 元素查找器而不是一个角度元素,你必须使用executeScript()函数来调用它的 JavaScript 方法,例如: var poster = element(by.css('.video-poster')); browser.executeScript( 'angular.element(arguments[0]).triggerHandler("touchstart");', poster); 原来的: 您应该能够触发事件,例如: element(poster).triggerHandler("touchstart"); 如果您需要事件对象中的更多内容,您可以创建一个这样的答案:jQuery Trigger Event in AngularJS Karma Test 笔记:
  • Using Protractor Test with Bootstrapped AngularJS
    I want to be able to test my Angular application with Protractor. Since I use RequireJS, I cannot use ng-app directive in my DOM and that is why I bootstrap Angular manually with angular.bootstrap. Protractor prints an error output like below: Error: Angular could not be found on the page http://localhost:1428/ : retries looking for angular exceeded Then, I realized that Protractor documentation has a warning: Protractor does not work out-of-the-box with apps that bootstrap manually using angular.bootstrap. You must use the ng-app directive. Well, Is there any workaround to run Protractor