Protractor 的 waitForAngular() 在 angular-webapp 上失败(真实设备上的 appium/chrome)

2024-01-25

我(新)使用量角器来运行 e2e 黄瓜测试。 我有一个基于 angularJS 的网络应用程序。我正在使用 appium 在真实的 Android 设备上远程运行测试。这是我正在使用的版本:

windows8.1
[email protected] /cdn-cgi/l/email-protection (with submodule seleniu[email protected] /cdn-cgi/l/email-protection)
[email protected] /cdn-cgi/l/email-protection
android device with 4.4.4

我的量角器配置(摘录),对应于https://github.com/angular/protractor/blob/master/docs/browser-setup.md https://github.com/angular/protractor/blob/master/docs/browser-setup.md:

currentDeviceUDID = (...);
var appToTestURL = 'http://my.website.com:9000/app/index.html';

exports.config = {
  seleniumAddress: 'http://localhost:4723/wd/hub';
  chromeOnly: false,
  specs: ['features/sample.feature'],

  capabilities: {
    browserName: 'chrome',
    'appium-version': '1.0',
    platformName: 'Android',
    platformVersion: '4.4.4',
    udid: currentDeviceUDID
  },

  baseUrl: appToTestURL

  framework: 'cucumber',
  cucumberOpts: {
    require: 'features/stepDefinitionsSample.js',
    tags: '@dev',
    format: 'progress'
  },

  // configuring wd in onPrepare
 onPrepare: function () {
    var wd = require('wd'),
    protractor = require('protractor'),
    wdBridge = require('wd-bridge')(protractor, wd);
    wdBridge.initFromProtractor(exports.config);
  },

  allScriptsTimeout: 30000,
  getPageTimeout: 30000
};

如您所见,我已将量角器的 webdriver url 替换为 appium webdriver。我使用“appium &”从命令行启动appium,然后使用“protactor cucumbertest.conf”运行测试

手机打开 Chrome 浏览器并导航到我使用“browser.get(url)”提供的 url

问题如下:调用 waitForAngular() 异步等待网站加载并在所有打开的 http 请求上(据我所知),未在手机上成功执行。电话对呼叫没有反应,并且 webdriver 代理返回 500。

对应于https://github.com/angular/protractor/issues/1358 https://github.com/angular/protractor/issues/1358,我知道 waitForAngular() 函数混合在量角器中到调用中

['getCurrentUrl', 'getPageSource', 'getTitle'];

protractor.js 文件中的 waitForAngular() 后面是下面的函数,该函数被代理到手机:

functions.waitForAngular = function(selector, callback) {
  var el = document.querySelector(selector);
  try {
    if (angular.getTestability) {
      angular.getTestability(el).whenStable(callback);
    } else {
      angular.element(el).injector().get('$browser').
      notifyWhenNoOutstandingRequests(callback);
    }
  } catch (e) {
    callback(e);
  }
};

附加信息:当我在 webdriver(浏览器)对象上引发错误时,错误消息指向量角器目录内的 chromedriver.exe。我不明白为什么错误不是来自 appium 的 chromedriver


所以太棒了; 如果没有成功调用 waitForAngular,我无法(稳定或根本)访问手机页面上的元素,因此不进行测试。也许我在这里误解了一些基本的配置细节,欢迎所有提示。

编辑:在此处添加了 appium 服务器日志:http://pastebin.com/vqBGUdXH http://pastebin.com/vqBGUdXH


我想我已经确定了问题所在。 Appium 和 Protractor 工作正常。

我的 angularJS 应用程序导致了这个问题。它使用 $timeout 进行轮询(我强制使用没有 $interval 的角度 1.07)。这会导致量角器期望页面仍处于加载阶段并且尚未完成。因此函数调用waitForAngular()永远不会返回,并且测试在指定的超时时间之后超时。

这种行为是预期和已知的,也记录在案(最好先阅读文档;))http://angular.github.io/protractor/#/timeouts http://angular.github.io/protractor/#/timeouts

该文档建议进行以下连续轮询:替换$timeout with $interval:

如果您的应用程序不断轮询$timeout or $http,它永远不会被注册为完全加载。您应该使用$interval任何连续轮询的服务(interval.js)(在 Angular 1.2rc3 中引入)。

现在,我用另一种方式解决了这个问题:禁用内置角度同步并手动同步

this.Before(function(next){
    ptor = protractor.getInstance();
    ptor.ignoreSynchronization = true; //disables waitForangular()
    next();
});
  1. 同步方法一:

    //at a testcase, wait for an element to be visible with a promise/then
    browser.wait(function () {
        element.all(by.css('.myCssClass')).then(function (items) {
            items[0].getText().then(function (text) {
                console.log(text);
            });
        });
        return true;
    }
    
  2. 同步方法2:

    // "eventually" (chai-as-promised) internally uses "promise" (and therefore acts like "then")
    browser.get(url);
    expect(browser.getTitle()).to.eventually.equal("connect me").and.notify(next);
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Protractor 的 waitForAngular() 在 angular-webapp 上失败(真实设备上的 appium/chrome) 的相关文章

  • Android STFP 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的 Android 项目中使用 SFTP 安卓已经有了吗 SFTP 库 还是我必须实现它 I
  • Android平台源码中哪里可以找到版本信息

    Android 平台源文件中的版本信息在哪里找到 我尝试查找 设置 gt gt 中列出的有关手机的一些信息 显示的一些信息包括固件版本 模块编号 基带版本 内核版本 你可以给它办理登机手续platform build core versio
  • Android:如何从输入流创建 9patch 图像?

    我使用下面的代码实例化 9patch 图像并将其设置为按钮的背景 下图显示了不理想的结果 InputStream MyClass class getResourceAsStream images btn default normal 9 p
  • Android浏览器上的Web应用程序宽度问题

    所以到目前为止我只在 Android 浏览器上遇到过这个问题 基本上我的网站几乎一直运行良好 而且我还没有在 Dolphin Opera 或 Skyfire 上看到这个问题 但偶尔当我从手机主屏幕之一上的书签重新打开 Android 浏览器
  • Mesibo 通话 UI 未更新

    我正在尝试更改 Mesibo Call UI 的配置 但它并没有改变 我尝试如下 MesiboCallConfig mesiboCallConfig new MesiboCallConfig mesiboCallConfig backgro
  • 有没有办法替代Android中的标准Log?

    有没有办法以某种方式拦截对 android 中标准 Log 的调用并执行其他操作 在桌面 Java 中 人们通常会得到一些记录器 因此有多种方法可以安装不同的日志处理程序 实现 但是 Android似乎对Log有静态调用 我找不到任何有关替
  • Android 导航回到 Activity;不要重新加载父级

    我有一个场景 我单击 ListFragment 并启动一个新的 Activity 如下所示 public void onListItemClick ListView l View v int position long id super o
  • 错误 libGL.so:无法使用 Android 模拟器打开共享对象文件

    我试图在 Ubuntu 12 04 64 位 中运行 android 模拟器 但是 我收到以下错误 Starting emulator for AVD emulatr Failed to load libGL so error libGL
  • 如何找到特定路线上两点之间的距离?

    我正在为我的大学开发一个 Android 应用程序 可以帮助学生跟踪大学巴士的当前位置 并为他们提供巴士到达他们的预计时间 截至目前 我获取了公交车的当前位置 通过公交车上的设备 和学生的位置 我陷入了必须找到两个 GPS 坐标之间的距离的
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • 返回主要活动(意图)时传递数据我做错了什么?

    我是安卓新手 这可能是最简单的问题 但我不明白这里出了什么问题 我试图创建一个通过意图传递值的基本示例 因此 当我关闭第二个活动时 我需要将数据传递到主活动 这是代码 意图测试1 主要活动 public void onClick View
  • 如何在虚拟机 VirtualBox 上运行 Android-x86 4.2 iso?

    我想用Android x86测试和调试我的应用程序 我之前成功尝试过其他版本的Android x86 但是关于android x86 4 2有一个错误 所以我在这里问我的问题 因为它可能会发生在其他人身上 我安装了oracle VM vir
  • 使用 DiffUtil 在 RecyclerView 上添加拖放

    我有一个从房间数据库更新的列表 我从 Room 收到更新的数据作为新列表 然后将其传递给列表适配器 https developer android com reference androidx recyclerview widget Lis
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • Proguard - 找不到任何超级类

    我收到此错误 Unexpected error while performing partial evaluation Class org apache log4j chainsaw Main Method
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • 使用 Glide 库设置图像加载完成后进度条的可见性

    您好 我想要一个图像进度条 该进度条将在图像加载时显示 但当图像加载完成时 我想将其设置为消失 早些时候我为此使用了毕加索库 但我不知道如何将它与 Glide 库一起使用 我知道有一些资源就绪功能 但我不知道如何使用它 谁能帮我 毕加索图书
  • 如何让用户在android列表视图中选择主题?

    我有一个带有两个标签的列表视图 标题和副标题 我想要深色和浅色背景作为用户选项 标题具有 textAppearanceMedium 副标题具有 textAppearanceSmall 我希望样式 MyTheme Dark 具有白色文本 My
  • 在DialogFragment中,onCreate应该做什么?

    我目前正在摆弄 DialogFragment 以学习使用它 我假设相比onCreateView onCreate 可以这样做 public void onCreate Bundle savedInstanceState super onCr
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或

随机推荐

  • iOS 7 onchange 事件在 iPad 3+Mini 中被破坏 // 需要解决

    请仅在运行 ios 7 的 iPad 上进行测试 iOS 7 似乎不支持 iPad 上 onchange 事件的alert 和confirm 奇怪的是 它可以在运行 ios 7 0 的 iPhone 4s 和桌面浏览器上运行 但不能在运行
  • 在使用 PKCE 的 OAuth 2.0 授权代码流程中,是什么阻止在第一次调用身份验证服务器时拦截代码质询?

    想象一下这次攻击 攻击者拦截对授权服务器的第一次调用 然后进行代码挑战 图中的步骤1 攻击者现在使用授权代码拦截来自授权服务器的响应 图中的步骤2 然后攻击者可以 POST 授权代码和代码验证程序来获取访问令牌 步骤3 Refer to t
  • Haml - 非法嵌套:纯文本中的嵌套是非法的

    我在使用 HAML 时遇到代码中的奇怪错误 其中我的代码在本地计算机上运行 但当我部署它时 出现以下错误 ActionView Template Error 非法嵌套 在纯文本中嵌套是非法的 我的代码看起来像这样 td style gt w
  • 使用日期的 For 循环编译错误:语法错误

    我正在尝试运行一个脚本 该脚本将浏览特定列的所有行 然后它将这些列中的日期与设定的日期进行比较 如果日期大于则删除该行 我收到的错误称为编译错误 语法错误 Sub removewrongyear Dim i As Integer For i
  • 预编译头文件和普通包含文件

    使用预编译头时 当我在常规头中包含一个已经包含在预编译头中的头时 是否会产生影响 或产生不良影响 或者换句话说 当我在另一个头文件中包含头 x 并同时在我的预编译头文件中包含 x 时 这是否会阻止预编译头提供的优化发挥作用 No 一般来说
  • 如何正确应用RGBA_8888和抖动?

    我有带有渐变的splash png 但在屏幕上这个图像看起来不太好 我的简单 apk这个问题包括 public class TestditherActivity extends Activity Override public void o
  • 替换文本文件中的一行

    我有一个文本文件 被另一个应用程序用作配置文件 我已将文件的每一行读入字符串数组 string arrLine File ReadAllLines pathToFile 这正是我需要的 现在 我需要做的就是用字符串替换 arrLine x
  • 如何从角度材料日期选择器获取当前时间?

    我正在使用角度材料日期选择器https material angular io components select overview https material angular io components select overview
  • 在CMake项目下编译单个文件?

    我正在开发一个 C 项目 该项目将包含在一个更大的项目中 我已经看到 在更大的项目 是一个 Qt 应用程序 它是从 qmake 生成的 上 我可以从 linux 命令行编译单个文件 只需输入特定文件的相对路径作为 make 的参数 另一方面
  • 尝试将实体编码为 json 时出现问题

    我尝试将 Doctrine 实体编码为 JSON 字符串 以作为 Ajax 响应发送 所以 我检查了文档 串行器组件 http symfony com doc current components serializer html 我尝试使用
  • Vue.js 空过滤结果

    在 Vue 中 我必须过滤一些数据
  • Swift3随机扩展方法

    我使用这个扩展方法来生成随机数 func Rand range Range
  • 从使用 atexit() 注册的函数内部获取退出状态

    在我的里面atexit 注册函数我想获得退出状态 参数exit 3 或者 main 返回了什么 有没有任何便携式方法可以做到这一点 是否有任何 GNU libc 特定的方法可以做到这一点 例如我可以引用的全局持有该值 这是一个技巧 hack
  • 如何将图片上传到另一台服务器?

    我想创建一个提供 html 内容的应用程序服务器 其中包含由不同域上的另一台服务器提供的静态图像的链接 图片由用户通过应用服务器上传 我将执行以下操作将 JPEG 文件上传到应用程序服务器 if file exists folder nam
  • TFS 构建失败,但 Visual Studio 可以工作

    我做了一个新的构建定义 大多数选项保留默认值 我暂时只是玩玩而已 问题是 当我在 Visual Studio 2013 中以发布模式构建项目时 一切都很好 没有错误 当 TFS 构建它时 我遇到了一些错误 我必须将其从我自己的语言翻译成英语
  • 如何在滚动视图中调整图像视图的大小,就像在此图像中完成的那样?

    我创建了一个滚动视图 并在其中放置了一个图像视图 我希望滚动它以与下图中相同的方式调整大小 但到目前为止我还没有取得什么成功 在我的尝试中 图像在滚动时调整了大小 但是调整大小后仍有剩余空间 您将如何修改以下内容 Image 到目前为止我的
  • JS 中的 Excel PMT 函数

    我在互联网上找到了一个关于 PMT 计算的小片段 function PMT i n p return i p Math pow 1 i n 1 Math pow 1 i n function CalculatePMTFromForm idL
  • 如何在多个显示器上最大化窗口?

    使用 AutoHotkey 如何绑定热键以在多个显示器上拉伸 最大化 跨越窗口 以便它覆盖两个显示器 现在 我必须通过用鼠标手动拉伸窗口来完成此操作 我知道有专用工具可以执行此操作 但我已经在运行 AutoHotkey 脚本 并且宁愿限制我
  • SOQL python 中的通配符

    我正在尝试使用 simple salesforce 包使用 python 从 salesforce 进行查询 当我使用通配符时 它会抛出故障错误 soql SELECT FROM Contact where LastModifiedDate
  • Protractor 的 waitForAngular() 在 angular-webapp 上失败(真实设备上的 appium/chrome)

    我 新 使用量角器来运行 e2e 黄瓜测试 我有一个基于 angularJS 的网络应用程序 我正在使用 appium 在真实的 Android 设备上远程运行测试 这是我正在使用的版本 windows8 1 email protected