没有需要配置的地方。运行 “TestSuite_xxx” 文件加下的 run_cases.bat 就会执行 “TestSuite_xxx” 文件夹下 “TestCase” 文件夹中的 test_xxx.py 里面的用例,你确定没重名什么的?你可以截图来看一下
这个方法,先通过你给的方式以及对应的值查找,没有查找到就向上滑动,然后继续找,默认五次,五次后仍没找到就向下滑动按类似方式查找。你看一下调用的方法就能看出
你可以参考一下这个https://testerhome.com/topics/7739
不好意思,我目前只在 win 上使用过,与其他系统有关的路径相关的(Public/RunCases),以及系统命令相关的(Public/Ports)你自己想想办法解决吧,相信你能行的
如果你说的测试报告里面类似于我文中那种 screenshot 列中图片显示都是那个配图图标的话,需要点击这个图标跳转才能看到。如果点击了图标跳转后仍看不到的话,这个就需要具体问题具体分析了
请问在 CMD 中单独运行 Macaca 有报错吗?QQ:752298505
你问一下其他人 autoAcceptAlerts 的使用场景吧,这个我用得不多。另外,你可以在脚本里面直接跳过这个弹窗。
至于 autoAcceptAlerts 的功能是 Macaca 本身的实现的,你所说的未对 Homepage 的 Alerts 生效,这个我就不清楚了。另外,问一下,你所说的 Homepage 的 Alerts 是什么样的形式?是 Android 系统给出的?还是应用给出的?
我不清楚你使用这两个方法使用的参数/具体情况如何,所以无法给出合理的解答。如果你对这两个方法的过程有疑问,你可以在这两个方法里面加上打印看看。另外,为了快速调试,可以使用 https://testerhome.com/topics/7854 中的方式来调试
我用的 Python3.6,按理说没有什么差别。要不你加我 QQ,我远程看看?
你是否清楚流程?如果清楚的话,你在流程中间加写打印看看。
在 Public 里面的 Drivers.py 中加打印,看你的截图是过了 macaca_server.start_server(),然后你看看后面的流程哪儿出了问题
那你需要好好了解下 driver.tap([(532,791),(526,788),(607,791)],100) 这里面每个参数的含义是什么了,我没用过 Appuim,但是推断应该是 driver.tap([(532,791),(526,788),(607,791)],100) 里面参数的问题
在 Android 开发者选项中,有个 “输入” 分区,把其中的 “显示指针位置” 勾选上(操作屏幕时可以看到在那触摸了屏幕)。然后,你运行你的脚本,看看脚本到底点击了没或者在哪个地方点击的
文章结构清晰、能使阅读者直观理解作者意图即可,是否必须 markdown 排版倒非必须
好的
谢谢达峰老师提醒!
启动 Driver 后(获得 session 后),后面就可以手动操作了。需要调试的脚本在 run.py 里面写好,手动操作 App 至需要调试的地方,然后在 CMD 窗口中输入 run 就可以了。后面还需要调试,那就再编写 run.py 里面的脚本,再手动操作 App 至需要调试的地方,再在 CMD 窗口中输入 run。如此反复……
所以,启动 App 只有一次的
要是能解决就太好啦,期待
多谢大大提供另一种思路!
刚看了 “如何用 ipython 学 appium(https://testerhome.com/topics/7357 )这篇文章,相比我上面的思路,使用 ipython 有一个好处就是 “通过%run 命令运行脚本成功后,脚本中的变量和函数等可以直接在 ipython 中使用”。
但是,把调试目的聚焦过后(我调试的脚本能够正常使用这个 Driver/seesion 才是最终的目的),就会发现,启动 Driver 只是先期的一个准备工作,而其相关的变量/函数是否公用则无关紧要。
因此,解决完 Driver/session 的问题过后,那么就是如何方便调试脚本的输入的问题,如果按照 “如何用 ipython 学 appium” 文中的在 ipython 中输入脚本行(输入一行调试一行),那么对于多个步骤的连续调试(用例、聚合步骤等)就显得有点麻烦(当然,ipython 是否能继续 “通过%run 命令运行需要调试的脚本 py 文件” 我不清楚,文章中没给出这样的示例,如果能这种调试方式也不错)
而我上面的思路,其第一步(启动 Driver/session)与 “如何用 ipython 学 appium” 无差别的,主要差别在后续,即,我的调试脚本依然在 IDE(PyCharm)中编写(调用已有的步骤、聚合步骤、或者像 “如何用 ipython 学 appium” 一样调试新增操作过程),这样调试脚本的编写与其他正式脚本的编写都是在 IDE 中完成(同一个工程中,调用也很方便)。所以,对比来看,我的调试思路是适合我的 UI 自动化思路的。
最后,再次感谢大大提供思路,让我知道有一个 ipython 的存在。我决定粉你
MonkeyRunner 这个支持同时初始化多个设备吗?你可以把 time.sleep()、device = MonkeyRunner.waitForConnection(10 ,device_id)、device.wake() 都注释掉,换上其他执行的过程,就可以看出差别。
python 多线程本身与是否加延时没有什么关系的,我给你加延时是为了给你看到两个线程的执行过程。所以问题还是在于你的脚本执行的代码是怎么写的,你可以贴上一部分,不然大家想帮也帮不了你
如下不加延时的代码:
import threading
def device1():
for i in range(10):
print('device1')
def device2():
for i in range(10):
print('device2')
threads = []
t1 = threading.Thread(target=device1)
threads.append(t1)
t2 = threading.Thread(target=device2)
threads.append(t2)
if __name__ == '__main__':
for t in threads:
print('start', t)
t.start()
for t in threads:
print('join', t)
t.join()
print('all end')
下面是对应的执行结果:
另外,Public/Ports 里面,你也得稍微改一下
class Ports:
@staticmethod
def is_using(port):
"""判断端口号是否被占用"""
# Mac OS
# cmd = "netstat -an | grep %s" % port
# Windows
cmd = "netstat -an | findstr %s" % port
if os.popen(cmd).readlines():
return True
else:
return False
我在 Windows 上面使用的,我想可能是 Public/RunCases 中的问题(如下文件路径,Windows 与 Ubuntu 有点区别),你应该可以解决的
class RunCases:
def __init__(self, device, port):
self.test_report_root = '.\\TestReport'
self.device = device
self.port = port
if not os.path.exists(self.test_report_root):
os.mkdir(self.test_report_root)
date_time = time.strftime('%Y-%m-%d_%H_%M_%S', time.localtime(time.time()))
self.test_report_path = self.test_report_root + '\\' + date_time + '-%s' % self.device['udid']
if not os.path.exists(self.test_report_path):
os.mkdir(self.test_report_path)
self.file_name = self.test_report_path + '\\' + 'TestReport.html'
我留意到这个
请问你的电脑是 Windows?还是其他系统?