Appium自动化测试(一)环境安装+实例登录

最近开始接触Appium自动化测试。代码小菜鸟又开始遇到无穷无尽的问题。特此记录走过的坑。

感谢此过程秋钱大神相助和各位同事的友情tip


按以下顺序开始你的自动化之旅吧

关于Appium安装,虽然虫师的文章是2015年的,但经本小菜鸟试验过,还是很好用的。里面appium, jdk, sdk安装都有。请参考虫师的appium安装传送门


关于UIAUTOMATOR先下下下~

使用Uiautomator需要满足:

Android SDK Tools, Revision 21 or higher

Android SDK Platform, API 16 or higher

更加详细信息 Read More:参考文章

1. Eclipse: Eclipse下载

2. Ant: Ant下载

具体安装参考:

a. 安装JDK, 设置环境变量。

b. 下载Ant, 得到一个压缩包,解压以后放在一个指定的目录下。设置ANT_HOME用户变量,然后在系统变量中添加bin目录。Win10上用%ANT_HOME%有时不可行,那就用绝对路径吧。

c. cmd->ant,回车以后看到以下代表成功了。

Buildfile: build.xml does not exist
Build failed

Ant传送门

3. 开始一个java project练练手(三张图送你happy)

依赖包的添加过程:创建一个新的java项目,Project->Properties->JavaBuildPath->Libraries a.Add Library->Junit->choose Junit3->Finish; b.Add External JARs->找到sdk->platforms下的一个androidXX(我选择了android23)->添加android.jar and uiautomator.jar。SDK相关请参考上面虫师传送门。

添加好依赖包,在src右键new一个新的package,自定义你需要的class name. 图一是一个简单的demo.

Appium自动化测试(一)环境安装+实例登录_第1张图片

将编写好的测试代码打包。python刚过来java的银儿要养成时常保存代码的好习惯。

android-sdk-windows\tools>android create uitest-project -n AutoRunner -t 1 -p 项目路径。 1 是sdk id可以通过android list来查看

Appium自动化测试(一)环境安装+实例登录_第2张图片

到工程的bin目录下运行ant build生产jar包(有遇到报错在bin目录下执行build.xml不存在,回到工程目录下执行ant build可以正常生产jar包,并不懂为什么~~)

说明 adb shell uiautomator runtest xxx.jar -c packagename.classname

Appium自动化测试(一)环境安装+实例登录_第3张图片


到此,你可以看到设备上在跑你的脚本了。~~撒花

不过每次代码变动都需要重新打包,push,执行,烦烦烦~~后面把公用部分抽取出来做成公用接口。


另附上python实现登录实例:python这次载在对launch app后需要先对是否已经是登录状态做判断。可能段数太低,一个小小if condition竟然搞了半天才找对方向。用True&False对是否是登录状态做出一个判断,然后执行不同的操作。

device name: adb devices

查看android app的package name 和 activity

1. 打开AndroidManifest.xml 找到包含android.intent.action.MAIN 和 android.intent.category.LAUNCHER对应的Activity

2. 有apk的情况,命令行敲 aapt dump xmltree xxx.apk AndroidManifest.xml

3. 没有apk,程序已安装时。先输入下面的命令,然后打开要查看的APP

adb logcat -c

adb logcat ActivityManager:l *:s

4. 启动要查看的APP,然后输入命令adb shell dumpsys window w | findstr // | findstr name=

# coding: utf-8

import time
import unittest
from appium import webdriver
import os

def find_element_by_id_no_except(driver,identification):
    try :
        driver.find_element_by_id(identification)
        return True
    except Exception as e:
        print (Exception,':',e)
        return False

class Login_Logout(unittest.TestCase):

    def setUp(self):
        self.desired_caps = {}
        self.desired_caps["platformName"] = "Android"
        self.desired_caps["platformVersion"] = "4.3"
        self.desired_caps["deviceName"] = "device name"
        self.desired_caps["appPackage"] = "package name"
        self.desired_caps["appActivity"] = ".activity"
        self.desired_caps["unicodeKeyboard"] = True #使用unicodeKeyboard的编码方式来发送字符串
        self.desired_caps["resetKeyboard"] = True #将键盘给隐藏起来

        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", self.desired_caps)
        time.sleep(5)

    def tearDown(self):
        self.driver.quit()

    def test_run(self):
        #默认开启4723端口接受webdriver请求,做一个循环保证启动APP后一定会登录一次
        for i in range(0,2):
            self.driver.find_element_by_name("检测").click()
            time.sleep(3)
            elem = find_element_by_id_no_except(self.driver, "ivAvatar")
            if elem !=True:
                self.driver.find_element_by_name("登录").click()
                time.sleep(3)
                elem = self.driver.find_element_by_id("etName")
                elem.clear()
                elem.send_keys("telephone_number")
                elem = self.driver.find_element_by_id("etPassword")
                elem.clear()
                elem.send_keys("password")
                # swipeToUp(self.driver, 500)
                time.sleep(3)
                self.driver.find_element_by_id("btnLogin").click()
                time.sleep(10)
                WebDriverWait(self.driver, 20).until(lambda the_driver: the_driver.find_element_by_id("ivAvatar").is_displayed())
            else:
                self.driver.find_element_by_id("tv_car_start_check").click()
                elem = find_element_by_id_no_except(self.driver, "etMeter")
                if elem !=True:
                    time.sleep(1)
                else:
                    self.driver.find_element_by_id("etMeter").send_keys("1000")
                    self.driver.find_element_by_id("btnOk").click()
                    time.sleep(10)
                self.driver.back()
                self.driver.find_element_by_id("ivAvatar").click()
                self.driver.find_element_by_id("btnLogout").click()
                time.sleep(2)
                self.driver.find_element_by_name("确定").click()
                time.sleep(3)


if __name__ == '__main__':
    unittest.main(verbosity=2)

我知道这个小程序很挫,就当试试手了,毕竟小菜鸟进阶路还很漫长,加油加油!!


Q&R

1. 登录手机账号,输入的手机号输入混乱重复。

解决办法:使用unicode编码方式发送字符。绕过手机软键盘输入,输入中文前面加u,如(u"中文")。注意:运行该脚本后,手动输入会无法调出软键盘。这时候需要到设置,找到输入法,恢复默认输入法便可。

self.desired_caps["unicodeKeyboard"] = True
self.desired_caps["resetKeyboard"] = True

2. ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

解决办法:马大哈的错误。极可能的原因是停止了appium。重新开启吧。



你可能感兴趣的:(Appium)