由于脚本编写过程中通常会涉及到脚本调试的过程(完整的用例、单个步骤等),如果每次都需要重新启动 APP,然后执行相关的步骤才能到达自己想调试的地方,这样的过程费时费力。Macaca 官方只提供了 Nodejs 版本的单步调试思路/工具(https://macacajs.com/zh/debugging )。若是采用该思路,Python 的 Shell 也是可以做到的,即初始化 Driver 并手动操作 APP 至需要调试的地方,再在 Python Shell 中输入需要调试的脚本行,最后运行。但是这种方式过于笨拙,因此,有了如下调试思路。

原理如下流程图:
1、启动 Driver 后,通过 BAT(Windows 下)启动 CMD 窗口,根据 CMD 窗口输入的 CMD 来判断是否执行 run.py(里面可以写需要调试的脚本)。需要调试的时候随时可以更改 run.py 中的脚本,然后再再 CMD 中输入 run 即可。

2、run.py 中的大致流程

如上为整体思路,而具体实现(我是在我的项目中使用的,大家可以 clone 下来看一下效果,以便在自己的项目/自己的语言上实现, https://github.com/Hualiner/UI-auto-test-base-macaca
1、启动 Driver,以及接受 CMD 命令的 py

def drive(server_url, run):
    log = Log()
    log.set_logger(run.get_device()['udid'], run.get_path() + '\\' + 'client.log')

    log.i('platformName: %s', run.get_device()['platformName'])
    log.i('udid: %s', run.get_device()['udid'])
    log.i('package: %s\n', run.get_device()['package'])

    log.i('macaca server port: %d\n', run.get_port())

    # init driver
    driver = WebDriver(run.get_device(), server_url)
    driver.init()

    # set cls.path, it must be call before operate on any page
    path = ReportPath()
    path.set_path(run.get_path())

    # set cls.driver, it must be call before operate on any page
    base_page = BasePage()
    base_page.set_driver(driver)

    while True:
        cmd = input("Please input run or exit:").lower()
        if cmd == 'run':
            print('Run run.py')
            print(os.system('python run.py %s %s %s %s'
                            % (run.get_port(),
                               run.get_device()['udid'],
                               run.get_path(),
                               driver.session_id
                               )
                            )
                  )
        elif cmd == 'exit':
            print('Good Bye')
            break

    # quit driver
    driver.quit()

def main():
    # read all devices on this PC
    devices = Devices().get_devices()

    # read free ports on this PC
    ports = Ports().get_ports(len(devices))

    if not len(devices):
        print('there is no device connected this PC')
        return

    runs = []
    runs.append(RunCases(devices[0], ports[0]))

    # start macaca server
    macaca_server = MacacaServer(runs)
    macaca_server.start_server()

    drive(macaca_server.server_url(runs[0].get_port()), runs[0])

    macaca_server.kill_macaca_server()

if __name__ == '__main__':
    main()

2、run.py 的实现,其中 Run().run() 中的代码即是我们需要调试的代码,随时可更换

class Run(BasePage):
    def run(self):
        # self.click_element_by_accessibility_id('为爱车投保')

        home = PlatformAppHomePage()
        home.click_insurance()

def init():
    port = int(sys.argv[1])
    udid = sys.argv[2]
    report_path = str(sys.argv[3])
    session = sys.argv[4]

    server_url = {
                'hostname': '127.0.0.1',
                'port': port,
    }

    log = Log()
    log.set_logger(udid, report_path + '\\' + 'client.log')

    driver = WebDriver('', server_url)
    driver.attach(session)

    # set cls.path, it must be call before operate on any page
    path = ReportPath()
    path.set_path(report_path)

    # set cls.driver, it must be call before operate on any page
    base_page = BasePage()
    base_page.set_driver(driver)

if __name__ == '__main__':
    init()

    Run().run()

效果如下(clone 源码后,下载 “金惠家 APP”,运行 App/ForTest 下的 run_cases.bat):
1、启动 Driver

2、run

3、exit

也许我们的项目思路不同,所以大家可能会觉得我的流程图未能完整描述我的代码。因为,我只需要让大家知道一个关键点,即 driver.attach(session_id) 就可以了,有了它其他问题只是与自己项目(UI 自动化的思路)实践情况上的差别而已。

另外,Macaca Server(启动手机 APP 后,即 driver.init() 后)与 app-inspector 不能同时使用,请问@xdf老师是否需要解决该问题,如果能解决的话脚本编写/调试就更加方便了。


↙↙↙阅读原文可查看相关链接,并与作者交流