由于脚本编写过程中通常会涉及到脚本调试的过程(完整的用例、单个步骤等),如果每次都需要重新启动 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老师是否需要解决该问题,如果能解决的话脚本编写/调试就更加方便了。