万物科技 学,以致用

10. 使用Appium测试iOS应用

2017-05-15
Geng

我们已经知道了如何安装,启动Appium,下一步就是开始真正测试了。最初本来是准备使用Ruby的,因为Appium官网的例子是以Ruby为主,Ruby写起来也挺舒服。但是国内测试圈还是Python为主,所以这里我就开始使用Python来写测试用例了。

排雷

本来一切顺利,但是在运行测试代码的过程中,我发现会出现莫名其妙的bug,根据github issue,发现是selenium的问题,我们可以首先卸载高版本的selenium,再安装低版本的selenium

pip uninstall selenium
pip install -U selenium==3.3.0

这个坑填平后,我们可以开始测试了。

python-client介绍

我们在7. 测试前准备 – 更新中已经介绍过python-client的安装,这里不再重复。

这里只是简单介绍一下,大概有个了解即可,否则这部分成了测试内容了。

使用

Appium Python ClientSelenium 3.0兼容,主要使用方法与Selenium 2 (WebDriver)是一样的。我们测试的时候,使用的是Selenium webdriver的超集,即appium中的webdriver:

from appium import webdriver

设置UnitTest环境:

# Android environment
import unittest
from appium import webdriver

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['app'] = PATH('../../../apps/selendroid-test-app.apk')

self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# iOS environment
import unittest
from appium import webdriver

desired_caps = {}
desired_caps['platformName'] = 'iOS'
desired_caps['platformVersion'] = '7.1'
desired_caps['deviceName'] = 'iPhone Simulator'
desired_caps['app'] = PATH('../../apps/UICatalog.app.zip')

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

定位元素

Appium有多种定位元素的方法,比如XPath,class,id等。根据实际使用和官方推荐,建议大家使用id来定位元素,在Appium中,就是Accessibility ID。对于iOS来说,是accessibility identifier,或者没有设置accessibility identifier的话,是显示的名称;对于Android来说,是content-description

self.driver.find_element_by_accessibility_id('Animation')

操作

Appium提供了Selenium 3.0的触摸和多点操作。

一个简单的测试

首先,我们需要一个例子,可以到苹果官网下载这个小例子

下载下来后,运行应用并找到“.app”文件路径,详细代码如下:


"""
简单iOS测试,初次尝试使用Appium.
"""
import unittest
import os
from appium import webdriver
from time import sleep

class TableSearchTests(unittest.TestCase):

    def setUp(self):
        # Set up appium
        app = os.path.abspath('/Users/www.wanwu.tech/Desktop/Search.swift.app')
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4723/wd/hub',
            desired_capabilities={
                'app': app,
                'platformName': 'iOS',
                'platformVersion': '10.2',
                'deviceName': 'iPhone Simulator',
                'bundleId':'com.example.apple-samplecode.Search-swift'
            })


    def test_search_field(self):
        # 定位
        search_element = self.driver.find_element_by_accessibility_id("Search")
        # 输入
        search_element.send_keys("iPad")
        # 等待
        sleep(2)

        ipad = self.driver.find_element_by_accessibility_id("iPad")
        # 确定真的有
        self.assertEqual('iPad', ipad.get_attribute('name'))


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


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(TableSearchTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

上面代码比较简单,仔细看看应该没有什么难度,这里只是简单介绍下如何结合Appium Inspector来使用。

下图可见,点击Search搜索框,在右侧可以标注红框位置,可以发现提示,根据这个提示,使用如下代码:

# 定位
search_element = self.driver.find_element_by_accessibility_id("Search")

然后在这个输入框中,我们可以输入比如“ipad”,进行搜索。在Appium中,可以点击下图红框上面的Send Keys,输入“ipad”进行搜索。因为Appium比较慢,所以这里等待了两秒钟:

search_element.send_keys("iPad")
# 等待
sleep(2)

进入下一个界面后,还是通过类似的方法,定位了一个元素,然后使用Python单元测试Assert语句,判断时候正确。这里使用了Appium中et_attribute()方法,具体有哪些属性,可以参考下图红框的部分:

ipad = self.driver.find_element_by_accessibility_id("iPad")
# 确定真的有
self.assertEqual('iPad', ipad.get_attribute('name'))

其他部分就是测试启动结束和appium一些固定操作,部分已经介绍过,其他基本都是固定写法,不再过多介绍。

结语

这里简单介绍了Appium的使用,因为这部分内容主要是持续集成的内容,所以我这里不准备深入Appium的内容,下半年我会在移动应用测试中详细介绍Appium使用,欢迎关注。


Comments

你可以请我喝喝茶,聊聊天,鼓励我

Wechat Pay
wechat

Thanks!