前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Appium系列(十六)如何维护用例中定位元素

Appium系列(十六)如何维护用例中定位元素

作者头像
雷子
发布2021-03-30 16:36:13
6300
发布2021-03-30 16:36:13
举报

前言

在上一篇文章--Appium系列(十五)继续利用分层化思想优化代码,我们对于测试用例的数据进行维护,但是现在的定位元素的相关的维护没有进行优化,那么我们应该怎么优化呢,本文带着大家揭晓。

正文

方案一:

我们可以在之前的测试用例维护的文件中进行维护用例定位的相关的,在data的casedata目录创建logincase.yaml进行维护。

代码语言:javascript
复制
-
  usernameedit: tv.danmaku.bili:id/username
  passwordedit: tv.danmaku.bili:id/passport_tag
  loginbtn: tv.danmaku.bili:id/btn_login
  assertelement: tv.danmaku.bili:id/btn_login
  user: name
  user_password: 123456
  msg: 测试失败
-
  usernameedit: tv.danmaku.bili:id/username
  passwordedit: tv.danmaku.bili:id/passport_tag
  loginbtn: tv.danmaku.bili:id/btn_login
  assertelement: tv.danmaku.bili:id/btn_login
  user: shibai
  user_password: 123456
  msg: 测试成功

那么我们在测试用例也需要进行优化,那么应该如何优化呢。

代码语言:javascript
复制
from time import  sleep
from common.adbtool import *
from common.packageparse import *
import  unittest
from ddt import ddt,file_data
from appium import  webdriver
apk_path = "apk/iBiliPlayer-bili.apk"
@ddt
class testCase(unittest.TestCase):
    def setUp(self) -> None:
        packname = get_apkname(apk_path)
        dev = get_devices()[0]
        is_first_install = False
        # 1.判断是否安装app
        is_install = isinstallapk(packname, dev)
        if is_install is False:
            # 2.如果没有安装,则安装
            installapk(apk_path, dev)
            is_first_install = True

        # 3.启动apk测试
        apkname = get_apkname(apk_path)
        launcheractivity = get_apk_lautc(apk_path)
        desired_caps = {
            'platformName': 'Android',
            'deviceName': dev,  # adb  deivces
            'platformVersion': getPlatForm(dev),  # 从设置中可以获取
            'appPackage': apkname,  # 包名
            'appActivity': launcheractivity,  # apk的launcherActivity
            # 'skipServerInstallation': True
        }
        self.driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
        sleep(10)
        # 启动同意用户协议
        self.driver.find_element_by_id("tv.danmaku.bili:id/agree").click()
        if is_first_install:
            # 首次安装需要加载文件
            sleep(50)
        sleep(10)
        self.driver.find_element_by_id("tv.danmaku.bili:id/avatar_layout").click()
        sleep(5)
        self.driver.find_element_by_xpath("//*[@text='登录']").click()

    def tearDown(self) -> None:
        self.driver.close()
    @file_data("data/casedata/logincase.yaml")
    def testlogin(self,usernameedit,passwordedit,loginbtn,assertelement,user,user_password,msg):
        username = self.driver.find_element_by_id(usernameedit)
        username.clear()
        username.send_keys(user)
        password = self.driver.find_element_by_id(passwordedit)
        password.clear()
        password.send_keys(user_password)
        login = self.driver.find_element_by_id(loginbtn)
        login.click()
        try:
            self.driver.find_element_by_id(assertelement)
            self.assertTrue(False,msg=msg)
        except:
            self.assertTrue(True,msg=msg)

这个方案目前的弊端:

1.每个用例都需要单独维护一次。

2.部分的测试环境初始化的参数没有维护。

那么我们应该怎么进行优化呢,其实我们可以单独在写一个文件去存放。那么我们就出来方案二。

方案二:存放在单独的定位的文件中,然后去解析。

我们把所有定位相关的直接维护到data下面的element文件中的loginelement.yaml,没有去创建即可。内容如下:

代码语言:javascript
复制
usernameedit: tv.danmaku.bili:id/username
passwordedit: tv.danmaku.bili:id/passport_tag
loginbtn: tv.danmaku.bili:id/btn_login
assertelement: tv.danmaku.bili:id/btn_login
agreeelement: tv.danmaku.bili:id/agree
opearelement: tv.danmaku.bili:id/avatar_layout
logintextclik: //*[@text='登录']

接下来,我们去安装操作yaml的模块。

代码语言:javascript
复制
pip install pyyaml

接着我们去导入;

代码语言:javascript
复制
import  yaml

解析方法如下。我们封装在

代码语言:javascript
复制
def   getyaml(path):
    f = open(path, encoding="utf8")
    reslut=yaml.load(f)
    f.close()
    return  reslut

我门可以传入文件的路径进行调试,结果如下:

代码语言:javascript
复制
{'usernameedit': 'tv.danmaku.bili:id/username', 'passwordedit': 'tv.danmaku.bili:id/passport_tag', 'loginbtn': 'tv.danmaku.bili:id/btn_login', 'assertelement': 'tv.danmaku.bili:id/btn_login', 'agreeelement': 'tv.danmaku.bili:id/agree', 'opearelement': 'tv.danmaku.bili:id/avatar_layout', 'logintextclik': "//*[@text='登录']"}

那么我们就可以在测试用例中使用

代码语言:javascript
复制
from time import  sleep
from common.adbtool import *
from common.packageparse import *
import  unittest
from ddt import ddt,file_data
from appium import  webdriver
from common.pyyaml import  getyaml

element=getyaml("data/element/loginelement.yaml")
apk_path = "apk/iBiliPlayer-bili.apk"
@ddt
class testCase(unittest.TestCase):
    def setUp(self) -> None:
        packname = get_apkname(apk_path)
        dev = get_devices()[0]
        is_first_install = False
        # 1.判断是否安装app
        is_install = isinstallapk(packname, dev)
        if is_install is False:
            # 2.如果没有安装,则安装
            installapk(apk_path, dev)
            is_first_install = True

        # 3.启动apk测试
        apkname = get_apkname(apk_path)
        launcheractivity = get_apk_lautc(apk_path)
        desired_caps = {
            'platformName': 'Android',
            'deviceName': dev,  # adb  deivces
            'platformVersion': getPlatForm(dev),  # 从设置中可以获取
            'appPackage': apkname,  # 包名
            'appActivity': launcheractivity,  # apk的launcherActivity
            # 'skipServerInstallation': True
        }
        self.driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
        sleep(10)
        # 启动同意用户协议
        self.driver.find_element_by_id(element['agreeelement']).click()
        if is_first_install:
            # 首次安装需要加载文件
            sleep(50)
        sleep(10)
        self.driver.find_element_by_id(element['opearelement']).click()
        sleep(5)
        self.driver.find_element_by_xpath(element['logintextclik']).click()

    def tearDown(self) -> None:
        self.driver.close()
    @file_data("data/casedata/logincase.yaml")
    def testlogin(self,user,user_password,msg):
        username = self.driver.find_element_by_id(element['usernameedit'])
        username.clear()
        username.send_keys(user)
        password = self.driver.find_element_by_id(element['passwordedit'])
        password.clear()
        password.send_keys(user_password)
        login = self.driver.find_element_by_id(element['loginbtn'])
        login.click()
        try:
            self.driver.find_element_by_id(element['assertelement'])
            self.assertTrue(False,msg=msg)
        except:
            self.assertTrue(True,msg=msg)

这样我们就完成了第二种方案对于测试用例相关定位的维护。

大家可以根据自己的方式进行选择。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档