或可直接查询testerhome发表的文章: https://testerhome.com/topics/7898

介绍

Macaca是一套完整的自动化测试解决方案,基于node.js开发。由阿里巴巴公司开源:

地址:https://github.com/macacajs/

特点:

同时支持PC端和移动端(Android、iOS)自动化测试。

支持JavaScript(Node.js)、Java、Python。

前置准备

安装Java

Java下载地址:(http://www.java.com/zh_CN/download/manual.jsp)

打开下载链接选择相应的版本进行下载。我们以Windows安装JDK为例,

双击下载的JDK ,设置安装路径。这里我选择默认安装在:

D:\Program Files (x86)\Java\jdk1.8.0_25\目录下。

下面设置环境变量:

【我的电脑】->右键菜单--->属性--->高级--->环境变量--->系统变量-->新建:

变量名:JAVA_HOME

变量值:D:\Program Files (x86)\Java\jdk1.8.0_25

变量名:CALSS_PATH

变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

找到path变量名—>“编辑”添加:

变量名:PATH

变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

安装Ant构建工具

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。

下载地址:http://ant.apache.org/manualdownload.cgi

下载zip包之后解压,我的解压位置为:D:\java\apache-ant

然后,将该目录添加到环境变量path下面。

变量名:PATH

变量值:D:\java\apache-ant\bin;

安装Android SDK

Android SDK提供了你的API库和开发工具构建,测试和调试应用程序

官方地址:(http://developer.android.com)

如果无法下载,你也可以通过该地址下载Studio与SDK。

下载地址: (http://www.android-studio.org/index.php/download)

如果只是想运行Android模拟器,单独下载SDK也可以。

Android SDK(Windows)百度网盘下载地址:(http://pan.baidu.com/s/1kVOvxEB)

下面设置环境变量:

【我的电脑】右键菜单--->属性--->高级--->环境变量--->系统变量-->新建..

变量名:ANDROID_HOME

变量值:D:\android\android-sdk-windows (以本机为主)

找到path变量名—>“编辑”添加:

变量名:PATH

变量值:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;

iOS前置准备

Macaca环境安装

1、Macaca由Node.js开发,所以需要安装Node.js。

地址:https://nodejs.org/en/

2、安装Node.js完成。 首先切换切换淘宝源,因为国外资源访问很慢,而且有些资源还无法下载。

  • npm install -g cnpm --registry=https://registry.npm.taobao.org

3、通过淘宝源安装 macaca-cli

  • cnpm i macaca-cli -g

4、安装webdriver-client

  • cnpm install webdriver-client

5、安装macaca-electron

  • cnpm install macaca-electron -g

macaca-electron是基于Electron开发的Macaca驱动,是Macaca驱动之一。

6、安装macaca-chrome

  • cnpm install macaca-chrome -g

7、安装Macaca Python Client,支持pip安装。

下载地址:https://pypi.python.org/pypi/wd

  • python3 -m pip install wd

8、安装macaca-chromedriver

  • cnpm install macaca-chromedriver -g

9、安装macaca-android

  • cnpm install macaca-android -g

10、安装macaca-ios

  • cnpm i macaca-ios -g

注意事项

1、npm方式安装慢的问题

  • npm install -g cnpm --registry=http://r.cnpmjs.org (或用淘宝镜像:registry = https://registry.npm.taobao.org)
  • 或者先安装cnpm,再用cnpm代替npm命令 (安装cnpm方式,请参照上述)

2、切换源方式

按快捷键【Win+X】 --> 选择“提示命令符(管理员)A”,打开超级管理员权限的cmd命令窗口,

输入命令:“npm config set registry https://registry.npm.taobao.orgnpm

回车,即可跟换源,输入命令“ config get registry ”回车可以查看更换是否成功

3、安装chromedriver超时失败

  • npm install -g chromedriver --chromedriver_cdnurl=http://chromedriver.storage.googleapis.com
  • 或者 npm install -g chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver

官网示例

启动

启动Macaca服务

  • macaca server --verbose 【加--verbose,打印详细日志】
  • python tests/macaca-desktop-sample.test.py 【运行测试】

常用命令

安装

  • npm i macaca-cl -g

服务端

  • macaca server (正常模式)
  • macaca server -p 3456 (设置端口)
  • macaca server -p 3456 & (设置端口后台运行)
  • macaca server --verbose(输出详细日志)

测试

  • macaca run (运行当前目录用例集)
  • macaca run -d ./test (运行指定目录下用例集)

检查

  • macaca doctor (环境检查)

帮助

  • macaca -h
  • macaca server -h
  • macaca run -h
  • macaca doctor -h

代码

  • macaca electron示例
  1. import unittest
  2. import time
  3. from macaca import WebDriver
  4. desired_caps = {
  5. 'platformName': 'desktop',
  6. 'browserName': 'electron'
  7. }
  8. server_url = {
  9. 'hostname': 'localhost',
  10. 'port': 3456
  11. }
  12. class MacacaTest(unittest.TestCase):
  13. @classmethod
  14. def setUpClass(cls):
  15. cls.driver = WebDriver(desired_caps, server_url)
  16. cls.driver.init()
  17. @classmethod
  18. def tearDownClass(cls):
  19. cls.driver.quit()
  20. def test_get_url(self):
  21. self.driver \
  22. .set_window_size(1280, 800) \
  23. .get('https://www.baidu.com')
  24. def test_search_macaca(self):
  25. self.driver \
  26. .element_by_id('kw') \
  27. .send_keys('macaca')
  28. self.driver \
  29. .element_by_id('su') \
  30. .click()
  31. time.sleep(3)
  32. html = self.driver.source
  33. self.assertTrue('macaca' in html)
  34. self.assertTrue(
  35. self.driver.element_by_css_selector_if_exists(
  36. '#head > div.head_wrapper'))
  37. self.driver \
  38. .element_by_xpath_or_none('//*[@id="kw"]') \
  39. .send_keys(' elementByXPath')
  40. self.driver \
  41. .element_by_id('su') \
  42. .click()
  43. self.driver.take_screenshot()
  44. if __name__ == '__main__':
  45. unittest.main()
  • chrome 示例
  1. #coding=utf-8
  2. import unittest
  3. from macaca import WebDriver
  4. from time import sleep
  5. desired_caps = {
  6. 'platformName': 'Desktop', #// iOS, Android, Desktop
  7. 'browserName': 'Chrome', #// Chrome, Electron
  8. }
  9. # 对应Macaca服务的ip和端口号。
  10. server_url = {
  11. 'hostname': '127.0.0.1',
  12. 'port': 3456
  13. }
  14. class MacacaTest(unittest.TestCase):
  15. @classmethod
  16. def setUpClass(cls):
  17. cls.driver = WebDriver(desired_caps, server_url)
  18. cls.driver.init()
  19. @classmethod
  20. def tearDownClass(cls):
  21. cls.driver.quit()
  22. def test_get_url(self):
  23. self.driver.get('https://www.baidu.com')
  24. self.assertEqual(self.driver.title, '百度一下,你就知道')
  25. def test_search_macaca(self):
  26. self.driver.element_by_id("kw").send_keys("macaca")
  27. self.driver.element_by_id("su").click()
  28. sleep(2)
  29. title = self.driver.title
  30. self.assertTrue('macaca',title)
  31. if __name__ == '__main__':
  32. unittest.main()
  • android示例
  1. #coding=utf-8
  2. import unittest
  3. import os
  4. import time
  5. from macaca import WebDriver
  6. desired_caps = {
  7. 'platformName': 'android',
  8. 'app': 'https://npmcdn.com/android-app-bootstrap@latest/android_app_bootstrap/build/outputs/apk/android_app_bootstrap-debug.apk',
  9. 'reuse': 3
  10. }
  11. server_url = {
  12. 'hostname': 'localhost',
  13. 'port': 3456
  14. }
  15. def switch_to_webview(driver):
  16. contexts = driver.contexts
  17. driver.context = contexts[-1]
  18. return driver
  19. def switch_to_native(driver):
  20. contexts = driver.contexts
  21. driver.context = contexts[0]
  22. return driver
  23. class MacacaTest(unittest.TestCase):
  24. @classmethod
  25. def setUpClass(cls):
  26. cls.driver = WebDriver(desired_caps, server_url)
  27. cls.driver.init()
  28. @classmethod
  29. def tearDownClass(cls):
  30. cls.driver.quit()
  31. def test_01_login(self):
  32. self.driver \
  33. .element_by_xpath('//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.EditText[1]') \
  34. .send_keys('中文+Test+12345678') \
  35. els = self.driver \
  36. .elements_by_class_name('android.widget.EditText')
  37. els[1].send_keys('111111')
  38. self.driver \
  39. .element_by_name('Login') \
  40. .click()
  41. def test_02_scroll_tableview(self):
  42. self.driver \
  43. .element_by_name('HOME') \
  44. .click()
  45. self.driver \
  46. .element_by_name('list') \
  47. .click()
  48. def test_03_gesture(self):
  49. self.driver \
  50. .touch('drag', {
  51. 'fromX': 200,
  52. 'fromY': 400,
  53. 'toX': 200,
  54. 'toY': 100,
  55. 'steps': 50
  56. })
  57. time.sleep(1)
  58. self.driver \
  59. .touch('drag', {
  60. 'fromX': 100,
  61. 'fromY': 100,
  62. 'toX': 100,
  63. 'toY': 400,
  64. 'steps': 50
  65. })
  66. self.driver \
  67. .element_by_name('Alert') \
  68. .click()
  69. time.sleep(1)
  70. self.driver \
  71. .accept_alert() \
  72. .back()
  73. time.sleep(1)
  74. self.driver \
  75. .element_by_name('Gesture') \
  76. .click()
  77. self.driver \
  78. .touch('tap', {
  79. 'x': 100,
  80. 'y': 100
  81. })
  82. time.sleep(1)
  83. self.driver \
  84. .touch('doubleTap', {
  85. 'x': 100,
  86. 'y': 100
  87. })
  88. time.sleep(1)
  89. self.driver \
  90. .touch('press', {
  91. 'x': 100,
  92. 'y': 100,
  93. 'steps': 100
  94. })
  95. time.sleep(1)
  96. self.driver \
  97. .element_by_id('com.github.android_app_bootstrap:id/info') \
  98. .touch('pinch', {
  99. 'percent': 200,
  100. 'steps': 200
  101. })
  102. time.sleep(1)
  103. self.driver \
  104. .touch('drag', {
  105. 'fromX': 100,
  106. 'fromY': 100,
  107. 'toX': 100,
  108. 'toY': 600,
  109. 'steps': 100
  110. })
  111. def test_04_webview(self):
  112. self.driver \
  113. .element_by_name('Webview') \
  114. .click()
  115. time.sleep(3)
  116. self.driver.save_screenshot('./webView.png') # save screen shot
  117. switch_to_webview(self.driver) \
  118. .element_by_id('pushView') \
  119. .touch('tap')
  120. switch_to_webview(self.driver) \
  121. .element_by_id('popView') \
  122. .touch('tap')
  123. def test_05_web(self):
  124. switch_to_native(self.driver) \
  125. .element_by_name('Baidu') \
  126. .touch('tap')
  127. time.sleep(3)
  128. self.driver.save_screenshot("./baidu.png")
  129. switch_to_webview(self.driver) \
  130. .element_by_id('index-kw') \
  131. .send_keys('macaca')
  132. self.driver \
  133. .element_by_id('index-bn') \
  134. .touch('tap')
  135. def test_06_logout(self):
  136. switch_to_native(self.driver) \
  137. .element_by_name('PERSONAL') \
  138. .click()
  139. self.driver.element_by_name('Logout') \
  140. .click()
  141. if __name__ == '__main__':
  142. unittest.main()
  • android示例【简精版】
  1. #coding=utf-8
  2. import unittest
  3. import time
  4. from macaca import WebDriver
  5. desired_caps = {
  6. 'platformName': 'Android', # iOS, Android, Desktop
  7. #'browserName': 'Chrome', # Chrome, Electron
  8. "package": "com.huawei.iptv.stb",
  9. "activity": "com.huawei.iptv.stb.ui.HeadTabActivity",
  10. "deviceName":"192.168.1.105:5555",
  11. }
  12. server_url = {
  13. 'hostname': '127.0.0.1',
  14. 'port': 3456
  15. }
  16. class MacacaTest(unittest.TestCase):
  17. def setUp(self):
  18. self.driver = WebDriver(desired_caps, server_url)
  19. self.driver.init()
  20. def tearDown(self):
  21. self.driver.quit()
  22. def test_macaca(self):
  23. el=self.driver.element_by_name("直播")
  24. el.click()
  25. time.sleep(2)
  26. if __name__ == '__main__':
  27. unittest.main()
  • iOS示例
  1. import unittest
  2. import os
  3. import time
  4. from macaca import WebDriver
  5. desired_caps = {
  6. 'platformName': 'iOS',
  7. 'platformVersion': '10.0',
  8. 'deviceName': 'iPhone 5s',
  9. 'app': 'https://npmcdn.com/ios-app-bootstrap@latest/build/ios-app-bootstrap.zip',
  10. }
  11. server_url = {
  12. 'hostname': 'localhost',
  13. 'port': 3456
  14. }
  15. def switch_to_webview(driver):
  16. contexts = driver.contexts
  17. driver.context = contexts[-1]
  18. return driver
  19. def switch_to_native(driver):
  20. contexts = driver.contexts
  21. driver.context = contexts[0]
  22. return driver
  23. class MacacaTest(unittest.TestCase):
  24. @classmethod
  25. def setUpClass(cls):
  26. cls.driver = WebDriver(desired_caps, server_url)
  27. cls.driver.init()
  28. @classmethod
  29. def tearDownClass(cls):
  30. cls.driver.quit()
  31. def test_01_login(self):
  32. self.driver \
  33. .element_by_xpath('//XCUIElementTypeTextField[1]') \
  34. .send_keys('中文+Test+12345678') \
  35. self.driver \
  36. .element_by_xpath('//XCUIElementTypeSecureTextField[1]') \
  37. .send_keys('111111') \
  38. self.driver \
  39. .element_by_name('Login') \
  40. .click()
  41. def test_02_scroll_tableview(self):
  42. self.driver \
  43. .element_by_name('HOME') \
  44. .click()
  45. self.driver \
  46. .element_by_name('list') \
  47. .click()
  48. def test_03_gesture(self):
  49. self.driver \
  50. .touch('drag', {
  51. 'fromX': 200,
  52. 'fromY': 400,
  53. 'toX': 200,
  54. 'toY': 100,
  55. 'duration': 2
  56. })
  57. time.sleep(1)
  58. self.driver \
  59. .touch('drag', {
  60. 'fromX': 100,
  61. 'fromY': 100,
  62. 'toX': 100,
  63. 'toY': 400,
  64. 'duration': 2
  65. })
  66. self.driver \
  67. .element_by_name('Alert') \
  68. .click()
  69. time.sleep(1)
  70. driver \
  71. .accept_alert() \
  72. .back()
  73. time.sleep(1)
  74. self.driver \
  75. .element_by_name('Gesture') \
  76. .click()
  77. self.driver \
  78. .touch('tap', {
  79. 'x': 100,
  80. 'y': 100
  81. })
  82. time.sleep(1)
  83. self.driver \
  84. .touch('doubleTap', {
  85. 'x': 100,
  86. 'y': 100
  87. })
  88. time.sleep(1)
  89. self.driver \
  90. .touch('press', {
  91. 'x': 100,
  92. 'y': 100,
  93. 'duration': 1
  94. })
  95. time.sleep(1)
  96. self.driver \
  97. .element_by_id('info') \
  98. .touch('pinch', {
  99. 'scale': 2,
  100. 'velocity': 1
  101. })
  102. time.sleep(1)
  103. self.driver \
  104. .touch('drag', {
  105. 'fromX': 100,
  106. 'fromY': 100,
  107. 'toX': 100,
  108. 'toY': 600,
  109. 'steps': 100
  110. })
  111. def test_04_webview(self):
  112. self.driver \
  113. .element_by_name('Webview') \
  114. .click()
  115. time.sleep(3)
  116. self.driver.save_screenshot('./webView.png') # save screen shot
  117. switch_to_webview(self.driver) \
  118. .element_by_id('pushView') \
  119. .touch('tap')
  120. switch_to_webview(self.driver) \
  121. .element_by_id('popView') \
  122. .touch('tap')
  123. def test_05_web(self):
  124. switch_to_native(self.driver) \
  125. .element_by_name('Baidu') \
  126. .touch('tap')
  127. time.sleep(3)
  128. self.driver.save_screenshot("./baidu.png")
  129. switch_to_webview(self.driver) \
  130. .element_by_id('index-kw') \
  131. .send_keys('macaca') \
  132. .element_by_id('index-bn') \
  133. .touch('tap')
  134. def test_06_logout(self):
  135. switch_to_native(self.driver) \
  136. .element_by_name('PERSONAL') \
  137. .click()
  138. self.driver.element_by_name('Logout') \
  139. .click()
  140. if __name__ == '__main__':
  141. unittest.main()

结束语

Macaca 自动化框架 [Python 系列]的更多相关文章

  1. 初探接口测试框架--python系列7

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  2. 初探接口测试框架--python系列2

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  3. 初探接口测试框架--python系列3

    点击标题下「微信」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...

  4. 初探接口测试框架--python系列4

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  5. 初探接口测试框架--python系列5

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  6. 初探接口测试框架--python系列6

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  7. 【转】基于Selenium的web自动化框架(python)

    1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Sel ...

  8. 初探接口测试框架--python系列1

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  9. minium-微信小程序自动化框架-python,官方文档

    minium文档 个人将其部署到了自己的服务器上,如有需要可以访问共同学习这个minium 用python来实现小程序自动化测试... 文档地址 http://49.232.203.244:3000/ ...

随机推荐

  1. js如何准确获取当前页面url网址信息

    1.window.location.href(设置或获取整个 URL 为字符串) var test = window.location.href;alert(test);返回:http://i.cnb ...

  2. JavaWeb三层结构---课设02

    收获总结 1三层架构模式 区分层次的目的即为了“高内聚,低耦合”的思想 分层介绍: Javaweb设计分为三层:数据访问层,业务逻辑层和表示层. 数据访问层:只提供对基本数据的访问,不涉及任何的业务逻 ...

  3. JavaScript 模拟策略模式

    /** * 模拟一个接口,其方法会抛出异常: */ function FlyInter () {} FlyInter.prototype.fly = function() { throw '实现这个接 ...

  4. 使用EF扩展EntityFramework.BulkInsert实现批量插入

    EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而EntityFramework.BulkInsert则是利 ...

  5. Android实现屏蔽微信拉黑和删除联系人功能

    实现效果: 让微信永远弹不出那个删除的对话框不就相当于屏蔽掉该功能了吗?哈哈效果如图: 实现原理: 同样是利用AccessibilityService辅助服务,关于这个服务类还不了解的同学可以先看下我 ...

  6. CSS3 3D变形效果

    CSS3 3D变形效果 CSS3 transform3D变形 transform的含义是:改变,使-变形:转换 三维变换使用基于二维变换的相同属性,如果您熟悉二维变换,你们发现3D变形的功能和2D变换 ...

  7. C#剪贴板对文件的复制、粘贴操作

    1.把文件加到剪贴板: System.Collections.Specialied.StringCollection files=new System.Collections.Specialied.S ...

  8. jQuery是什么

    在使用jQuery之前,我们需要了解jQuery是个什么东东. 顾名思义,j是JavaScript而query的意思是查询. jQuery就是用javascript更加方便的查询和控制页面控件  ,即 ...

  9. JavaScript严格模式说明带示例

    严格模式(use strict) 目的 消除JS中一些不合理.不严谨之处,减少一些怪异行为 消除代码中的一些不安全之处,保障代码运行安全 提高编译器效率,增加运行速度 为以后的JS新规范做铺垫 兼容性 ...

  10. 用手机或外部设备在同一局域网下访问虚拟主机wampsever的方法版本号是2.4.9

    1,首先在虚拟服务器电脑上可以打开http://localhost/ 2,在外部设备访问时报错为:You don't have permission to access / in on this se ...