前言:
为什么要写这篇文章,最近在做自动化测试的时候,客户需求说要用安卓内部浏览器测试H5。由于之前没有做过这种类型的测试,所以百度上和一些技术贴看上了下,都是千篇一律的用com.android.browser包来启动,但是经过实验,现在市面上很多机型内置浏览器的包名都已经有自己的格式了,例如vivo的包名就是com.vivo.browser,用网上的方法根本启动不了。所以才有了现在这篇文章。
首先说下大致的思路,我们获取包名和activity只需要获取launActivity就可以,再通过字符串截取,把两者分开。获取launActivity的难点在于首先要启动浏览器,所以我们只需要添加一个方法,通过"adb shell am start -a android.intent.action.VIEW -d http://www.baidu.com"这个命令启动浏览器,然后用"adb shell dumpsys window w |findstr \/ |findstr name=",来获取activity。这就是一个大致的思路,实现代码如下:
1、第一步还是最基本的设置
def get_desired_capabilities():
desired_caps = {
'platformName': 'Android',
'platformVersion': '7.1.1',
'deviceName': 'Udid',
'udid': 'Udid',
'appPackage': 'browserPakcage',
'appActivity': 'activity',
'appWaitPackage': 'browserPakcage',
# 若没有设置 app,appium 将不会重复安装app
# 'app': "%app_path%",
# 若设置为False, appium 不自动拉起应用
# 'autoLaunch': False,
'automationName': 'Uiautomator2',
'newCommandTimeout': 4800,
'unicodeKeyboard': True,
'WebView.setWebContentsDebuggingEnabled':True,
'recreateChromeDriverSessions':True,
'noReset': True,
'recreateChromeDriverSessions': True,
# 设置chromedriver路径,若不设置,使用appium默认版本driver
'chromedriverExecutable': '/tmp/chromedriver',
'appiumVersion': 1080 #1.8.0
}
这是最基本的设置就不用过多的赘述了,接下来进行第二步
2、定义一个函数,用于拿到手机的串号
def shell(self, command):
serial = self.driver.capabilities.get('udid')
command = "adb -s %s shell %s" % (serial, command)
result = os.popen(command).read()
3、接下来我们是最繁琐的一步了,代码已经撸下来了,具体含义也已经备注清楚了
def findActivity(self):
command = "adb -s %s shell %s" % (
self.serial, "am start -a android.intent.action.VIEW -d http://www.baidu.com")
# 通过adb命令启动浏览器
os.popen(command).read()
time.sleep(3)
# 等待很重要,这里加个等待,避免启动了别的软件拿到的就是其他软件的activity了
command1 = "adb -s %s shell %s" % (self.serial, "dumpsys window w |findstr \/ |findstr name=")
# 根据adb命令拿到刚刚启动的浏览器的activity
result1 = os.popen(command1).read()
activityLine = result1.split('\n')[0]
# 把刚刚拿到的activity放进数据
activity = activityLine[activityLine.find('name=') + 5: -2]
# 取到想要的activity的name
browserPakcage = activity[0:activity.find('/')]
# 取到内置浏览器的启动的包名
activity = activity[activity.find('/') + 1:]
print ("package: %s" % browserPakcage)
print ("activity: %s" % activity)
return browserPakcage, activity
4、包名和activity都拿到了接下来就是一些基本的设置了,把刚刚获取的内容重新赋值
def setUp(self):
desired_caps = desired_capabilities.get_desired_capabilities()
browserPakcage, activity = self.findActivity()
desired_caps["appPackage"] = browserPakcage
desired_caps["appActivity"] = activity
desired_caps["appPackage"] = browserPakcage
uri = desired_capabilities.get_uri()
self.automationName = desired_caps.get('automationName')
self.driver = webdriver.Remote(uri, desired_caps
5、现在就可以开始写要测试的内容了,代码就不贴出来了
def run(self):
#执行的步骤
#执行的步骤
#执行的步骤
#执行的步骤
#执行的步骤
6、启动了程序当然要关闭一下
def tearDown(self):
self.driver.quit()
7、最后就开始执行了
if __name__ == '__main__':
mqc = MqcTest()
try:
mqc.setUp()
mqc.run()
except Exception, e:
print("STEP : 用例执行失败")
print("ASSERT : false, program error")
traceback.print_exc()
finally:
mqc.tearDown()
至此,整个过程就结束了,是不是非常简单。同学如果有什么不明白的地方可以在下方留言。
原创不易,如果这篇文章对你有所帮助,请点个赞~