额,出错原因是你的 setUp 第二次执行时开不了 session 。
你以为的执行顺序是:
setUp->Test001->Test002
实际执行顺序是:
setUp->Test001->setUp->Test002
解决方法:
setUp
改名为 setUpBeforeClass
, tearDown
改为 tearDownAfterClass
(如果有)driver.quit()
)使用单元测试框架(如 Junit)前最好先了解一下它的一些基本概念吧。例如 Junit 的 setUp 和 tearDown :http://etutorials.org/Programming/Java+extreme+programming/Chapter+4.+JUnit/4.6+Set+Up+and+Tear+Down/
appium/build/settings_apk/settings_apk-debug.apk
appium/build/settings_apk/settings_apk-debug.apk
appium/lib/devices/android/android-common.js
和 appium-adb 的 appium-adb/lib/adb.js
)建议先用方案一,稳定后再做方案二的后两步吧。主要的重点难点都在 apk 和 adb 命令那里。
appium 设定 network 是通过 settings.apk 设定的,它的项目地址是 https://github.com/appium/io.appium.settings
虽然要求有点高,但如果你懂得基本的 android app 开发的话可以把它写到这个 app 里。
相关的文章http://blog.csdn.net/stevenhu_223/article/details/9052083
我去看了下 Java 客户端的 setNetworkConnection
的用法
public void networkConnectionTest() {
NetworkConnectionSetting networkConnection = new NetworkConnectionSetting(false, true, true);
networkConnection.setData(false);
networkConnection.setWifi(false);
driver.setNetworkConnection(networkConnection);
networkConnection = driver.getNetworkConnection();
assertEquals(new NetworkConnectionSetting(false, false, false), networkConnection);
}
用起来和 python 版的一样啊,三个值分别代表数据连接、wifi 和飞行模式。
没见到有控制蓝牙的功能。
不错,晚些试用一下。
另外,有些地方 markdown 语法用错了。
####1.更新 iOS SDK cocoaPods 版本
应为
#### 1.更新 iOS SDK cocoaPods 版本
,
更新的崩溃列表查看崩溃时间改为**最近 30 天**
应为
更新的崩溃列表查看崩溃时间改为 **最近 30 天**
markdown 对空格还是比较敏感的。
例子很赞。学习了。
学习了,去看了一下 sbt-native-packager ,打包功能真心强大!
这是 mac ?brew install node
装上的 node 不是可以不用 sudo 来安装 npm 包的吗?
分析很不错,确实找到问题根源了。
不过 appium 支持 uiautomator 的 api 本来意图是用来找元素的(所以才叫 find_element_by_android_uiautomator
)。如果返回值不是一个元素,当然会报异常。
大致看了一下, appium 对于 uiautomator 语句的检查十分严格,要求必须返回 UiScrollable 或 UiObject ,并且严格限定了参数的写法。我试过用类似 new UiSelector().checked(new UiScrollable(new UiSelector().scrollable(true)).scrollToEnd(3))
的方式绕过返回值类型的限制,但没想到它竟然连 checked 的内容都限定为只能是 true
或 false
(boolean 类型),而对于参数类型为 string 的限定了参数内容第一个和最后一个字符必须是双引号。我尝试用 new UiSelector().fromParent
绕过(object 类型的检查是最松的),但结果还是不行(提示 Could not parse UiSelector argument: UiSelector has no new UiScrollable method
)
看来 appium 只支持 uiautomator api 中查找元素的部分,而不是完全支持 uiautomator api 。不过这也符合 find_element_by_android_uiautomator
这个方法本身的定位。
学习了。 MonkeyTalk 的 API 好强大。
我终于看懂了,批量生成 SQL 语句/ json 数据。
有 api 可以让程序访问后自动生成吗?
对业务同学来说,像 MTSC 上面那种形式的 mock server 才容易上手吧。
新版的 robotframework 自带了 datetime 这个 library 的吧。
你使用 RIDE 的吗?找到一个相关的问题:http://stackoverflow.com/questions/26843149/unable-to-import-datetime-library-in-robot-framework
#2 楼 @chocolatesweety 你贴的是 appium client 输出的 log ,一些错误细节已经被隐藏掉了,所以定位不了问题。
1、appium server log(如果是命令行,就是命令行里的输出字符,如果是 GUI,就是里面黑色底的界面里面的内容)
麻烦提供一下:
1、appium server log(如果是命令行,就是命令行里的输出字符,如果是 GUI,就是里面黑色底的界面里面的内容)
2、使用环境:appium 版本、client 版本、android 版本等。
引起 Unknown server error 的原因有很多,有可能是 dump 出错,UIAutomator 挂了等等。光靠 unknown server-side error 定位不了问题的,需要 appium server log 才能比较准确地准确定位问题。
我竟然和三位大神一起放在被 @ 的位置,受宠若惊啊!
对于 serverAddress,我建议如果允许外部调用的话统一使用 0.0.0.0 。
这个是监听地址,只有发送的网络包里的 destination 是符合这个 serverAddress 及 port 的才会被 appium 捕获到。
如果输入 127.0.0.1 那就只有在 server 那台机器上的脚本能连到这个 appium server 了,因为外部链接都不可能是发到 127.0.0.1 的(因为 127.0.0.1 在任何机器上都是指代这台机器本身,发请求到 127.0.0.1 是发不了给其他机器的)。
0.0.0.0 表示广播地址,能匹配所有 ip 地址,即监听所有发到这个机子的指定端口的网络包。这个和直接用本机 ip 地址的主要区别是:用这个的话你就不用管这台机本机地址是什么了(针对 ip 地址经常会变化的环境或者批量部署比较有用。否则换个 ip 这个参数就得改一次)
至于这个参数的存在理由,其实主要就在于是否使用 127.0.0.1 了(即是否能被网络中其他电脑调用,说白了是权限的差异)。我见过的其他类似程序(如 xwalkdriver)是封装成默认只允许本地连接,如果需要允许外部链接需要另外设置允许的外部链接地址。
#14 楼 @shu element name 指的是 content-desc 或者 text 属性。
可以看下我以前的这个帖子:关于 appium get_attribute 方法的坑。
实际上只需要给个 element.id 就够了,appium 不仅支持 byName,也支持 byXpath,byId 等。只是在 android 上由于隐藏元素在控件树上不可见,所以在 findElement 的时候就会出错了。
我后面发个帖子专门说下这个 scrollTo 吧。
#11 楼 @zsx10110 问题就是在 android 上用不了。
对于 android 底层使用的 UIAutomator,至少需要知道 scrollView 和需要查找的元素的 text ,但这个 API 只传了需要查找元素的 text ,没有 scrollView 。appium 应该要通过控件树自动找到 element 所在的 scrollable view,然后把它传给 UIAutomator 。
对于 iOS 的 UIAutomation,因为 UIAutomation API 直接有个 scrollToVisible
的方法可以不传 scrollView ,所以可以直接使用。