今天写完了公司产品DDM的安卓客户端的部分特别简单的用例,基本覆盖了各个模块最基础、最简单操作,是目前最能够体现我水平的一个脚本。
个人博客:https://blog.csdn.net/zyooooxie
一)
前两天解决了一个大概困扰我2个月的问题:关于app自动化测试中,那些没有id、不想用class属性来定位,但是text属性不同,如何来元素等待、定位方面的。
A.定位操作
我最常用的定位是driver.find_element_by_android_uiautomator(‘new UiSelector().text(“XXXXXX”)’).click();
但是如何来实际用呢?如何把text的值如何传递到里面?【数据与脚本分离】
因为value是个字符串,传递进去时某个写的值,无法实际引到你的元素定位上。直到我无意间尝试,使用到格式化字符,突然通了。
driver.find_element_by_android_uiautomator(‘new UiSelector().text("%s")’ % XXX).click()
这就是解决方法。XXX是某元素的text值。
B.元素等待
使用text的来查找元素等待 使用显式等待,有2种方式:
1 WebDriverWait(self.driver, 10,).until(EC.text_to_be_present_in_element((By.XPATH, locator), text))
2 WebDriverWait(self.driver, 10).until(lambda self.driver: self.driver.find_element(by, locator).is_displayed())
第一种等待 是说这个元素的text属性 和你给的参数 做对比;
推荐第二种,只要定好位,查找可见。但是!考虑到前提(那些没有id、不想用class属性来定位,但是text属性不同:如果使用id class 属性那就用不着text来定位了) 我就只好推荐xpath定位,那又和第一种没啥不同了。
二)
app的xpath定位 推荐是 ‘//class[@text=“XXXX”]’ 和 ‘//class[contains(@text,“XXXX”)]’
目前就拿这2个来主要定位。
自己写的相对路径 确实比uiautomatorviewer 和appium 给的绝对路径方便多了。
三)
我一直在考虑如何优化app自动化脚本的运行速度
我写的100个用例起码 跑1个半小时左右。除了使用分布式借助多台设备的方法外,目前我尽量在脚本少用了xpath定位,使用显式等待,少用强制等待,几乎不用隐式等待。
另外 我想到的是 减少app的重启次数,借助装饰器@classmethod,虽然是可以减少次数,但是只要一个用例执行时候出错,其他都得挂了。所以我还没想通,如何更理想来做。
【web自动化,我也是运用装饰器@classmethod,减少了启动浏览器的次数:执行一个用例后,下一个用例前面添加一个刷新 refresh;此外web自动化脚本因为执行速度快,也用不了多长时间。】
四)
不初始化app,减少登录的次数
我之前整理3个方法 :
1.脚本设置启动服务的时候,desired_caps[“noReset”] = True,强烈推荐把这个也写到appium的inspector里面,不然每次定位元素的时候也会重置;
2.要不就初始化setUp时候,把登录步骤写到初始化里面;
3.使用装饰器@classmethod,只要登录一次,后面用例可以不登录。
五)
最不推荐的坐标定位方法
app自动化测试最无语的 应该是要属坐标定位。换了手机,不同分辨率,这个坐标就不对了。得算出所在屏幕的比例(或是看前端、ui设置多少像素和倍数)或是算出不同分辨率下所在位置。
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie