Appium 求教 Appium 中对移动 APP,公共测试步骤的封装和 Python 类的使用

pupie · October 16, 2015 · Last by Jwong replied at November 16, 2016 · 1528 hits

有几个问题:
在 Appium 中,基于 app 测试,有很多.find_element_by_id 的步骤,而这些步骤会在测试用例中使用很多次,所以我想将这些步骤抽取出来,做成公用方法,或者类的方法,
这样在写用例的时候就可以快速开发。

由于刚入手 Appium 和 Python,对一些特性不太熟悉。我是创建一个 AndroidTest 类,继承 unittest.TestCase 类,然后在 AndroidTest 类中写入公共方法,如 GoUserTab()
这样子在 MyAndroidTest(AndroidTest) 中,可以这样使用:AndroidTest.GoUserTab(self)

但是问题:
1)我又在 AndroidTest 类中定义了一个类 User,和其方法 GoUserTab2(),想将用户相关操作放在一起,为何使用的时候 AndroidTest.User.GoUserTab2(self) 就报错呢?

TypeError: unbound method GoUserTab2() must be called with User instance as first argument (got YYWAndroidTest instance instead)

2)大家对写用例的时候,将公共步骤提取成方法有好的建议吗?

Python 代码如下

# coding:utf-8
import os
import unittest
from appium import webdriver
from time import sleep

PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)


class AndroidTest(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '4.4'
        desired_caps['deviceName'] = 'MI_2'
        desired_caps['app'] = PATH(
            'myapp.apk'
        )
        desired_caps['appPackage'] = 'com.myapp'
        desired_caps['appActivity'] = '.LoadingActivity'  # 启动APP显示Splash的Activity

        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

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

    def GoUserTab(self):  
        self.driver.find_element_by_id('myapp:id/navigation_user_btn').click()


    class User():
        def GoUserTab2(self):  
            AndroidTest.driver.find_element_by_id('myapp:id/navigation_user_btn').click()  #点击用户按钮进入用户信息页面


class MyAndroidTest(AndroidTest):

    def test_user_tab(self):
        self.driver.implicitly_wait(8)
        AndroidTest.GoUserTab(self) #这样用没有问题
        #AndroidTest.User.GoUserTab2(self)  #这样用会报错


# unitest.main()函数用来测试 类中以test开头的测试用例
if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(MyAndroidTest("test_user_tab"))
    unittest.TextTestRunner(verbosity=2).run(suite)
共收到 3 条回复 时间 点赞

AndroidTest.GoUserTab(self) # 这样用没有问题
#AndroidTest.User.GoUserTab2(self) # 这样用会报错

如果我没想错的话 第一句你完全可以使用 self.GoUserTab() 调用
而第二个报错的原因是你要实例化出一个 User 的对象才能够调用里面的 GoUserTab2,除非你把 GoUserTab2 改成类方法。

如果自己没有什么好的想法,建议用 selenium 推荐的 pageObject 模式来写用例,可维护性比较强。

参考链接:http://selenium-python.readthedocs.org/en/latest/page-objects.html

第二个报错应该是 user 对象没有实例化,但是我自己试了下也是错误的,不知道问题点在哪里

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up