Macaca [求助] 运行 Macaca 的官方例子时出的问题

zujie · 2017年03月04日 · 最后由 gmjdadk 回复于 2017年03月17日 · 2196 次阅读

运行 macaca 官方实例时出的问题

环境

Macaca : 1.2.0
iOS : 10.2
device : 6s 真机
python : 3.5
Xcode : 8.2.1

描述

https://github.com/macaca-sample/macaca-test-sample-python 上的例子拿过来,修改了部分代码------desired_caps ={}里面的参数和 test01 的 xpath, 这里的 xpath 是由 app-inspector 获得的

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import unittest
import os
import time
from macaca.webdriver import WebDriver

desired_caps = {
    'platformName': 'iOS',
    'platformVersion': '10.2',
    'deviceName': 'iPhone 6s',
    'bundleId':'com.xxxxxxxxx',
    'udid':'21dccb97283100b914bf8b335945f116f9fb580f'
}

server_url = {
    'hostname': 'localhost',
    'port': 3456
}

def switch_to_webview(driver):
    contexts = driver.contexts
    driver.context = contexts[-1]
    return driver

def switch_to_native(driver):
    contexts = driver.contexts
    driver.context = contexts[0]
    return driver

class MacacaTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = WebDriver(desired_caps, server_url)
        cls.driver.init()

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def test_01_login(self):
        self.driver \
            .element_by_xpath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeTextField[1]') \
            .send_keys('中文+Test+12345678')   \

        self.driver \
            .element_by_xpath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeSecureTextField[1]') \
            .send_keys('111111') \

        self.driver \
            .element_by_name('Login') \
            .click()

    def test_02_scroll_tableview(self):
        self.driver              \
            .element_by_name('HOME') \
            .click()

        self.driver             \
            .element_by_name('list') \
            .click()

    def test_03_gesture(self):
        self.driver \
            .touch('drag', {
              'fromX': 200,
              'fromY': 400,
              'toX': 200,
              'toY': 100,
              'duration': 2
            })

        time.sleep(1)

        self.driver \
            .touch('drag', {
              'fromX': 100,
              'fromY': 100,
              'toX': 100,
              'toY': 400,
              'duration': 2
            })

        self.driver \
            .element_by_name('Alert') \
            .click()

        time.sleep(1)

        driver \
            .accept_alert() \
            .back()

        time.sleep(1)

        self.driver \
            .element_by_name('Gesture') \
            .click()

        self.driver \
            .touch('tap', {
              'x': 100,
              'y': 100
            })

        time.sleep(1)

        self.driver \
            .touch('doubleTap', {
              'x': 100,
              'y': 100
            })

        time.sleep(1)

        self.driver \
            .touch('press', {
              'x': 100,
              'y': 100,
              'duration': 1
            })

        time.sleep(1)

        self.driver \
            .element_by_id('info') \
            .touch('pinch', {
              'scale': 2,
              'velocity': 1
            })

        time.sleep(1)

        self.driver \
            .touch('drag', {
              'fromX': 100,
              'fromY': 100,
              'toX': 100,
              'toY': 600,
              'steps': 100
            })

    def test_04_webview(self):
        self.driver \
            .element_by_name('Webview') \
            .click()

        time.sleep(3)
        self.driver.save_screenshot('./webView.png') # save screen shot

        switch_to_webview(self.driver) \
            .element_by_id('pushView') \
            .touch('tap')

        switch_to_webview(self.driver) \
            .element_by_id('popView') \
            .touch('tap')

    def test_05_web(self):
        switch_to_native(self.driver) \
            .element_by_name('Baidu') \
            .touch('tap')

        time.sleep(3)
        self.driver.save_screenshot("./baidu.png")

        switch_to_webview(self.driver) \
            .element_by_id('index-kw') \
            .send_keys('macaca') \
            .element_by_id('index-bn') \
            .touch('tap')

    def test_06_logout(self):
        switch_to_native(self.driver) \
            .element_by_name('PERSONAL') \
            .click()

        self.driver.element_by_name('Logout') \
            .click()

if __name__ == '__main__':
    unittest.main()

终端 macaca server --verbose输出的 log 如下

问题

上面圈出了三处问题,

  1. Xcode Cocopods 不知道跟这个有什么关系
  2. 为什么会输出我的设备不存在? 明明一直都连接着, 而且上面的日志输出也跑了一部分代码
  3. 127.0.0.1:80 这个端口连接遭拒怎么解决

还有其他什么我没有注意到的问题还望大神指正

其他

另外这里要说明的是,

  • 根据源代码 desired_caps = {}中的'app': 'https://npmcdn.com/ios-app-bootstrap@latest/build/ios-app-bootstrap.zip',来下载安装 bootstrap App 安装不下来,一直卡在那里,
  • https://github.com/xudafeng/ios-app-bootstrap github 上面下载的的 ios-app-bootstrap.xcodeproj 文件直接在 xcode 上 build 会报错
    • err1: 'team name' 要修改为自己的 team
    • err2:'bundle id' 要修改为自己的 bundle id
    • err3 : 在 ios-app-bootstrap/ios-app-bootstrap/components/AlertViewController.swift 中会有个 Logger 模块找不到, 这个就不知道该怎么办了, 在 TesterHome 搜帖子的时候发现一位同学@pieceone自己改了一下, 并给了链接: https://pan.baidu.com/s/1bp7QVQB 密码: m84g 下下来, 重签名, 成功编译安装到真机上
共收到 2 条回复 时间 点赞

LZ 跟我遇到的问题一模一样,我也很头疼,前三个 case 都是 netive 的 case,没有问题,第四个 case 就开始报找不到设备,这个 case 是 webview 的操作,我推测是调用 ios-webkit-debug-proxy 的时候出问题了

PS:Logger 模块找不到是因为你需要在工程目录里执行 carthage 来安装依赖

我尝试去改 remote-debugger.js,也没起作用,不知道问题出在哪

zujie 关闭了讨论 09月08日 14:30
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册