作业:使用 Appium Inspector 录制企业微信搜索功能的测试用例,搜索一个存在的联系人。
用例步骤:
- 打开企业微信(提前登录)
- 进入通讯录
- 点击搜索按钮
- 输入 已存在的联系人姓名, 例如“aa”,
- 点击联系人,进入聊天页面
- 输入“测试code”
- 点击发送
- 退出应用
注意:
- 提前登录,绕过登录功能
- 使用录制功能完成上面的功能,
- 进行简单的重构,使用 pytest 测试框架。
- 可以加入参数化,实现多条搜索功能的测试用例。
作业:使用 Appium Inspector 录制企业微信搜索功能的测试用例,搜索一个存在的联系人。
注意:
- 提前登录,绕过登录功能
- 使用录制功能完成上面的功能,
- 进行简单的重构,使用 pytest 测试框架。
- 可以加入参数化,实现多条搜索功能的测试用例。
提交作业
https://github.com/tangfeng-sys/tangfeng1/blob/master/App/test_dingwei.py
yaml文件地址
https://github.com/tangfeng-sys/tangfeng1/blob/master/App/search.yaml
"""
作业:使用 Appium Inspector 录制企业微信搜索功能的测试用例,搜索一个存在的联系人。
用例步骤:
打开企业微信(提前登录)
进入通讯录
点击搜索按钮
输入 已存在的联系人姓名, 例如“aa”,
点击联系人,进入聊天页面
输入“测试code”
点击发送
退出应用
注意:
提前登录,绕过登录功能
使用录制功能完成上面的功能,
进行简单的重构,使用 pytest 测试框架。
可以加入参数化,实现多条搜索功能的测试用例。
"""
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from time import sleep
from appium import webdriver
class TestHmwork:
@classmethod
def setup(cls):
caps = {}
caps["platformName"] = "android"
caps["deviceName"] = "mandy"
caps["appPackage"] = " com.tencent.wework"
caps["appActivity"] = ".launch.WwMainActivity"
caps["noReset"] = True
cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
cls.driver.implicitly_wait(20)
def test_homework(self):
el1 = self.driver.find_element_by_id("com.tencent.wework:id/gi5")
el1.click()
el2 = self.driver.find_element_by_id("com.tencent.wework:id/f_7")
el2.send_keys("junjun")
el3 = self.driver.find_element_by_id("com.tencent.wework:id/cvo")
el3.click()
el4 = self.driver.find_element_by_id("com.tencent.wework:id/doo")
el4.send_keys("测试code")
el5 = self.driver.find_element_by_id("com.tencent.wework:id/dok")
el5.click()
@classmethod
def teardown(cls):
cls.driver.quit()
写的不错,也实现了参数化,思路很清晰,赞
隐式等待的时间建议在 3-5 秒,不建议设置太长。一旦出现报错,要等到 20 秒结束才能退出并发现问题。要注意考虑测试用例的运行效率。
setup 里面一般是用来做初始化的一些操作,测试步骤最好还是在用例里面编写,保证每一条用例的独立性。你这样写在这里没有问题,如果我想增加一些用例在这个类里,就很局限了。
这里起的变量的名字,最好起一个有意义的名字,方便代码维护。
老师说的对,已修改。
from time import sleep
import pytest
from appium import webdriver
"""
作业:使用 Appium 编写企业微信搜索功能的测试用例,搜索一个存在的联系人。
用例步骤:
打开企业微信(提前登录)
进入通讯录
点击搜索按钮
输入 已存在的联系人姓名, 例如“aa”,
点击联系人,进入聊天页面
输入“测试code”
点击发送
退出应用
注意:
提前登录,绕过登录功能
进行简单的重构,使用 pytest 测试框架。
可以加入参数化,实现多条搜索功能的测试用例。
"""
class TestWeworkRecoding():
def setup(self):
desire_caps = {}
desire_caps['platformName'] = 'android'
desire_caps['deviceName'] = 'emulator-5554'
desire_caps['deviceVersion'] = '6.0.1'
desire_caps['appPackage'] = 'com.tencent.wework'
desire_caps['appActivity'] = 'com.tencent.wework.launch.WwMainActivity'
desire_caps['noReset'] = 'True'
self.driver = webdriver.Remote("http://localhost:4723/wd/hub", desire_caps)
self.driver.implicitly_wait(5)
def teardown(self):
el8 = self.driver.find_element_by_id("com.tencent.wework:id/gpp")
el8.click()
# self.driver.quit()
@pytest.mark.parametrize('search_key, send_message',[
('xiaohua', '测试code'),
('李振华', '测试code')
])
def test_search(self, search_key, send_message):
el1 = self.driver.find_element_by_id("com.tencent.wework:id/gq_")
el1.click()
el2 = self.driver.find_element_by_id("com.tencent.wework:id/ffq")
el2.click()
el3 = self.driver.find_element_by_id("com.tencent.wework:id/ffq")
el3.send_keys(search_key)
el3.click()
el4 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.ListView/android.widget.RelativeLayout[2]/android.widget.RelativeLayout/android.widget.RelativeLayout[1]/android.widget.RelativeLayout/android.widget.TextView")
el4.click()
el5 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout[2]/android.widget.FrameLayout/android.widget.ListView/android.widget.RelativeLayout[2]/android.widget.RelativeLayout/android.widget.RelativeLayout")
el5.click()
el6 = self.driver.find_element_by_id("com.tencent.wework:id/dtv")
el6.send_keys(send_message)
el7 = self.driver.find_element_by_id("com.tencent.wework:id/dtr")
el7.click()
sleep(2)
Appium Inspector 录制出来的测试用例经常会生成 XPath 的绝对路径,这种定位方式不稳定,如果页面布局有微小的变动,我们都要修改我们的测试用例,维护起来也不方便,看不出来这个路径要表达什么。我们需要学到的定位方式 ,找到能唯一定位到这个元素的定位器。比如使用 XPath 的层级定位,组合定位等。
所以录制出来的测试用例我们通常都需要去优化一下它的定位方式。
作业:使用 Appium Inspector 录制企业微信搜索功能的测试用例,搜索一个存在的联系人。
https://github.com/tao12d/testpro_calc/blob/master/app/test_appium_homework1.py
from time import sleep
import pytest
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestSend:
"""
用例步骤:
1、打开企业微信(提前登录)
2、进入通讯录
3、点击搜索按钮
4、输入 已存在的联系人姓名, 例如“aa”
5、点击联系人,进入聊天页面
6、输入“测试code”
7、点击发送
8、退出应用
"""
def setup(self):
# 1、打开企业微信(提前登录)
desired_caps = {
'platformName': 'android',
'deviceName': 'emulator-5554',
'appPackage': 'com.tencent.wework',
'appActivity': '.launch.WwMainActivity',
'noReset': True,
'autoGrantPermissions': True
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
self.driver.implicitly_wait(6)
@pytest.mark.parametrize('pinyin, name', [
("nihao", "你好"),
("shezhiheng", "佘志恒")
])
def test_send(self, pinyin, name):
# 2、进入通讯录
self.driver.find_element_by_android_uiautomator('new UiSelector().text("通讯录")').click()
# 3、点击搜索按钮
self.driver.find_element(MobileBy.ID, 'com.tencent.wework:id/guu').click()
# 4、输入 已存在的联系人姓名
self.driver.find_element(MobileBy.ID, 'com.tencent.wework:id/fk1').send_keys(pinyin)
locator = (MobileBy.XPATH, f'//*[@text="{name}"]')
ele = WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(locator))
ele.click()
# 5、点击联系人,进入聊天页面
locator_chat = (MobileBy.ID, 'com.tencent.wework:id/abo')
ele_chat = WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(locator_chat))
ele_chat.click()
# 6、输入“测试code”
locator_input = (MobileBy.ID, 'com.tencent.wework:id/dx1')
ele_input: WebElement = WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(locator_input))
ele_input.send_keys("测试code")
# 7、点击发送
locator_send = (MobileBy.ID, 'com.tencent.wework:id/dwx')
ele_send: WebElement = WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(locator_send))
ele_send.click()
sleep(5)
def teardown(self):
# 8、退出应用
self.driver.quit()