#4 楼 @xiang2743 哇,感谢感谢!
如果是 windows 环境,dos 中执行 npm install -g appium 命令,直接安装最新的版本
#1 楼 @sanlengjingvv 非常的感谢,指针轨迹是开了的,是持续时间太短了,导致没效果,感谢啊!
#4 楼 @lilycalla 6 楼正解,下载后,如果报找不到文件,你将 sdk\build-tools\android-X.X 目录下文件拷贝过去就行
将 sdk\build-tools\android-4.4W 目录下的 aapt.exe 拷贝到 sdk\tools 目录下
将 sdk\build-tools\android-4.4W 目录下的 zipalign.exe 拷贝到 sdk\tools 目录下
有一些应用,在首次安装后启动会有一个引导页,浏览完引导页后才会跳转到登录或者注册页面,再次启动时根据引导页直接打开登录或登录后的主界面,所以首次安装并启动的 Activity 和直接打开登录主页面的 Activity 不一样,需要在 desired_caps 中增加 appWaitActivity,为你想要等待启动的 Android Activity 名称,即引导 activity 后面增加期待使用的 activity,app 界面就可以正常跳转。
#10 楼 @umbrella1978 用例中是同一个 app 的:
用例 1 是卸载这个 app;
用例 2 是安装这个 app;
用例 3 是检查用例 2 中安装的 app 登录界面上是否有 pwoerer-by 信息;
用例 4 是登录 app,这个登录依赖的是用例 2 中安装好的 app;
用例 5 是在用例 4 成功登录进入主界面的基础上,去检查这个主界面的侧标栏是否有 powerer-by 信息
#7 楼 @sanlengjingvv driver 方法里面没有 start_activity 啊,import 的时候我是 from appium import webdriver,请问你是导入的哪个包啊
#1 楼 @xiang2743 你的意思是在登录后,继续把其他的用例不单独写,而是写在这个登录用例的后面,teardown 前,共同完成一系列的动作吗?
#5 楼 @seveniruby 请问一下,activity 在不同界面是不一样的,那在初始化的时候:
def get_desired_capabilities(app):
desired_caps = {
'platformName': 'Android',
'platformVersion': '4.3',
'deviceName': 'Android Emulator',
'appPackage' : 'com.xxx.phone',
'appActivity' : 'com.xxx.ui.FlowPager',
'app': PATH(r'../testApp/' + app)
}
,
return desired_caps
这里是写死的,岂不是从一个界面切换到另外一个界面的时候,appActivity 就不同了,用例执行就失败了啊,该如何界面这个问题呢?
#2 楼 @sanlengjingvv
我的测试基类代码如下:(TestCaseBase.py)
#!/usr/bin/env python
#-*- coding:UTF-8 -*-
import logging
import unittest
from common.stub.StubFactory import StubFactory
import os
from appium import webdriver
from common.testCaseBase.getDriver import *
class TestCaseBase(unittest.TestCase):
def getDoc(self):
'''获取用例 __doc__信息'''
doc = super(TestCaseBase,self).shortDescription()
return doc
def setUp(self):
# 启动所有的测试桩,主要是配置文件的解析、路径解析等
StubFactory().start()
#初始化driver
self.driver = getDriverInfo().androidDriverInfo()
logging.info("\n============= Begin to test [ " + self.getDoc() + " ] ===============\n")
def tearDown(self):
# 停止所有的测试桩
StubFactory().stop()
self.driver.quit()
logging.info("\n============= End to test [ " + self.getDoc() + " ] ===============\n")
对于初始化 deriver 信息,我调用了另外一个类的信息:
这个类 getDriverInfo 中的 androidDriverInfo 方法,如下:
class getDriverInfo():
''' 获取driver属性信息的类 '''
def androidDriverInfo(self):
''' 定义获取driver属性信息的函数--安卓 '''
desired_caps = desired_capabilities.get_desired_capabilities('Base_2.1.apk')
#print desired_caps
#del desired_caps['app']
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
return driver
而 desired_capabilities 调用的方法 get_desired_capabilities 代码如下:
def get_desired_capabilities(app):
desired_caps = {
'platformName': 'Android',
'platformVersion': '4.3',
'deviceName': 'Android Emulator',
'appPackage' : 'com.xxx.phone',
'appActivity' : 'com.xxx.ui.FlowPager',
'app': PATH(r'../testApp/' + app)
}
return desired_caps
#2 楼 @sanlengjingvv 请问 driver 不是只要初始化一次嘛?设置一个全局的 driver,所有用例都使用这个 driver 属性信息
@panzhigang 我也遇见了,
我发的帖子,http://testerhome.com/topics/1455
楼主这个问题解决了吗?
@mongnet
desired_capabilities 类内容如下:
#!/usr/bin/env python
#-*- coding:UTF-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
# Returns abs path relative to this file and not cwd
PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
)
def get_desired_capabilities(app):
desired_caps = {
'platformName': 'Android',
'platformVersion': '4.3',
'deviceName': 'Android Emulator',
'appPackage' : 'com.xxx.phone',
'appActivity' : 'com.xxx.ui.FlowPager',
'app': PATH(r'../testApp/' + app)
}
return desired_caps
if __name__ =='__main__':
app = get_desired_capabilities('testBase_2.1.apk')
print app
cmd 中直接执行 aapt dump badging app 的绝对路径,查找屏显信息中的 launchable-activity: name=,name=后面就是所要的 activity 信息了
原来的代码也可以使用,总之一句话,app 已安装,在不想每次执行用例都需要再次安装 app 的情况下,启动 appium 带上--no-reset 即可
在 阿里-sh-lihuazhang C-上海 - 西陆之风 @ 上海-L.T. 的帮助下,终于解决了这个问题
from appium import webdriver
from common.testCaseBase import desired_capabilities
class getDriverInfo():
''' 获取driver属性信息的类 '''
def androidDriverInfo(self):
''' 定义获取driver属性信息的函数--安卓 '''
desired_caps = desired_capabilities.get_desired_capabilities('WeChat_480.apk')
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
print '\n for test',driver,'\n'
return driver
def iOSDriverInfo(self):
''' 定义安装app函数-iOS '''
pass
if __name__ == '__main__':
driverInfo = getDriverInfo()
driver = driverInfo.androidDriverInfo()
如上代码调用的时候,安装 app,如果 app 已经安装了,在不想安装 app 的情况下, 可通过 dos 窗口,通过启动 appium 带上 --no-reset 即可避免执行用例的时候再次安装 app
--no-reset 参数解释 如下:
--no-reset Don't reset app state between sessions (IOS: don't
delete app plist files; Android: don't uninstall app
before new session)
如上解释可通过 dos 窗口执行 appium --no-reset -h 获得
#1 楼 @lihuazhang 是的,执行下个用例,就不用再需要安装 app,直接使用 driver 属性信息
请问你是如何解决的?我把 desired_caps['app'] = '' 注释掉,还是一样的错误啊,我也是想直接调用 driver 的一些属性,不需要执行下个用例的时候再次去安装 app,请看见了答复我一下啊,多谢多谢!!
很多手机助手类的软件(比如 91 助手、360、豌豆荚之类)如果已经启动了,这个时候 adb 去查看 device,往往是处于 offline 状态,如果杀掉这些软件,就可以正常了。我遇见的是这么个情况,每个人遇见的环境不同,仅供参考。
问题定位出来了,在最后一个 send_key() 后,输入法没有隐藏/消失,导致后面获取登录 button 虽然成功,但 click 失败。解决问题的思路也得到群里的大力支持,总的方向是隐藏输入法,我这里使用了 back() 方法(因为 from selenium import webdriver),模拟返回操作,使得输入法自动隐藏,修改后如下:
company = driver.find_element_by_id('xxxxxx:id/login_domain_editor')
company.click()
company.send_keys(r'xxxx')
#模拟返回键,隐藏输入法
driver.back()
loginButton = driver.find_element_by_id('xxxxxxx:id/login_btn')
driver.implicitly_wait(5)
loginButton.click()
也可以使用 hide_keyboard 方法,群里给的建议是 from appium import webdriver,毕竟是测试 app 的,这里我抛下砖,后面我改进,使用 appium 的方法
使用 find_element_by_class_name 也是一样的效果,无法触发点击操作:
button = driver.find_element_by_class_name('android.widget.Button')
driver.implicitly_wait(5)
button.click()
期间暂停了 5 秒也没用
我补充一下环境:是安卓 4.3,手机 app 程序