Appium元素定位之应用登录

作者: Dotry | 来源:发表于2018-11-18 20:15 被阅读6次

    1. 概述

    按照编码届的传统,学习一样技术,不打出“Hello World”不算入门,今天我们就来看看对于Appium 我们如何写出出“Hello World”级别的代码。继上一篇文章Windows下Appium环境搭建之后,这次先从页面元素查找,再到应用登录。

    2.元素查找

    正如我们所了解Python在页面元素查找支持Xpath,BeautifulSoup等等相关框架,同样Appium也是基于selenium的,那么它也是同样支持其相关特性的。下面简单从一个App考研帮的安装到点击讲起。

    2.1 界面解析

    我们启动Appium 客户端之后,可以看到如下界面:

    appium_cmd.png
    点击红色的区域即可进入到以下界面:
    appium_par.png
    填写左侧红色方框关于capability 的参数,即可以生成右侧JSON 格式配置参数,点击'Start Session'即可以连接真机,可以看到“跳过”的id
    appium_element.png 为“com.tal.kaoyan:id/tv_skip”。根据以上我们就先来查找按钮“跳过”然后点击。
    根据上述分析和需求,我们可以写出以下代码:
    from  appium import webdriver
    
    desired_caps={}
    desired_caps['deviceName']='Nexus 6P'# 设备名称
    desired_caps['platforVersion']='8.1.0'# 平台版本
    desired_caps['udid']='8XV5T15A10001108'# 真机的uid
    desired_caps['platformName'] = 'Android'# 设备操作系统
    desired_caps['noReset']='True'# 是否重置app
    
    desired_caps['app']='/Users/zhanxiuwen/Projects/Python/Appium/kyb.apk'# apk 路径
    desired_caps['appPackage']='com.tal.kaoyan'#包名
    desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'# 启动页面
    
    driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
    #查找id 为 tv_skip 的元素
    skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
    #点击跳转
    skipBtn.click()
    

    连接手机,运行可以看出app自动点击“跳过”进入登录页面。我们从代码中可以看出和上述的JSON 格式一致,因此更加可以确定在[Windows下Appium环境搭建]中所说的“(https://www.jianshu.com/p/32a5aef630cc)Appium-desktop工具其实也封装了Appium server和Node.js依赖环境”。
    这里有个细节就是
    desired_caps['noReset']='True'# 是否重置app ,"noReset"参数故名思义就是app每次启动是否重置的开关,关于“capability” 后续文章会专门说到。
    从上述显现配合“noReset”参数,我们可以用来控制app每次启动是否是重置,即第一次安装使用的效果,显然我们平时使用的过程中,只需要登录一次,“跳过”这个按钮不一定会出现。如果没有这个按钮,那么就会报出元素找不到异常。或许有人想到添加以下判断即可:

    skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
    if skipBtn:
        skipBtn.click()
    else:
        print('no skipBtn')
    

    但是实际上这样并不行,依旧会报出元素不存在的异常。
    那么在Appium中我们可以作如下异常处理即可,简单完整代码如下:

    from  appium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    desired_caps={}
    desired_caps['deviceName']='Nexus 6P'
    desired_caps['platforVersion']='8.1.0'
    desired_caps['udid']='8XV5T15A10001108'
    desired_caps['platformName'] = 'Android'
    desired_caps['noReset']='True'
    desired_caps['app']='/Users/zhanxiuwen/Projects/Python/Appium/kyb.apk'
    desired_caps['appPackage']='com.tal.kaoyan'
    desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
    driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
    driver.implicitly_wait(5)
    
    def checkSkipElement():
        try:
            skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
            skipBtn.click()
            print('has element')
        except NoSuchElementException:
            print("no such element")
        pass
    checkSkipElement()
    

    从代码可以看出简单的try-except 就可以处理这种元素不存在的问题,这也是在Appium中的最根本处理方式。以上是对元素查找和元素操作的简单介绍,接下来相对复杂点对应用进行登录操作。

    3.应用登录

    根据上述对元素的定位和操作介绍,我们大概有个基本了解。根据Appium我们可以查找到应用的用户名和密码id appium_login.png

    根据该应用的使用情况,当应用登录成功后,界面会出现“我”这个元素,如下图:


    appium_mine.png
    因此这个元素是否存在可以作为应用是否登录的简单判断。有了上述逻辑分析,我们可以简单写出以下代码,代码结合上述代码一起理解很简单,看注释就可以懂,不做过多代码解释:
    点击跳过:
    # coding: utf8
    from appium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from LoginUtils import find_myself
    
    
    def connect_devices():
        desired_caps = {}
        desired_caps['deviceName'] = 'Nexus 6P'
        desired_caps['platforVersion'] = '8.1.0'
        desired_caps['udid'] = '8XV5T15A10001108'
        desired_caps['platformName'] = 'Android'
        desired_caps['noReset'] = 'True'
        desired_caps['app'] = '/Users/zhanxiuwen/Projects/Python/Appium/kyb.apk'
        desired_caps['appPackage'] = 'com.tal.kaoyan'
        desired_caps['appActivity'] = 'com.tal.kaoyan.ui.activity.SplashActivity'
        driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
        return driver
    
    def checkSkipElement( driver):
        try:
            skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
            skipBtn.click()
            print('has element')
        except NoSuchElementException:
            print("no such element")
        pass
    
    def main():
        driver = connect_devices()
        driver.implicitly_wait(2)
        checkSkipElement(driver)
        find_myself(driver)
        pass
    
    if __name__ == '__main__':
        main()
    

    登录判断,输入密码点击登录

    # coding: utf8
    from selenium.common.exceptions import NoSuchElementException
    
    #处理登录逻辑,设置用户名 密码和点击登录
    def login(driver):
        driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
        driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('owentest')
        driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('12345678')
        # driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
        print('login success')
    
    #查找元素"我"是否存在
    def find_myself(driver):
        try:
            driver.find_element_by_id('com.tal.kaoyan:id/mainactivity_button_mysefl')
        except NoSuchElementException:
            login(driver)
        else:
            driver.find_element_by_id('com.tal.kaoyan:id/mainactivity_button_mysefl').click()
            driver.find_element_by_id('com.tal.kaoyan:id/activity_usercenter_username').click()
            login(driver)
    

    从代码可以看出整个登录流程基本走通,但还存在其他场景,这个就需要我们结合具体场景具体分析,上述均属于抛砖引玉,写出了一个简单的Appium入门级别的“Hello World”。后续将会逐渐深入。

    相关文章

      网友评论

        本文标题:Appium元素定位之应用登录

        本文链接:https://www.haomeiwen.com/subject/pcngfqtx.html