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()
import pytest
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class Test_Appium:
def setup(self):
desired_caps = {}
desired_caps['platformName'] = 'android'
desired_caps['deviceName'] = 'emulator-5554'
desired_caps['appPackage'] = 'com.tencent.wework'
desired_caps['appActivity'] = 'com.tencent.wework.launch.WwMainActivity'
desired_caps['noReset'] = 'true'
desired_caps['autoGrantPermissions']='true'
desired_caps['skipDeviceInitialization']='true'
self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
@pytest.mark.parametrize('name,mes',[('a1','mes1')])
def test_1(self,name,mes):
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/dnj' and @text='通讯录']").click()
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/gq_']").click()
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/ffq']").send_keys(name)
WebDriverWait(self.driver,5).until(expected_conditions.element_to_be_clickable((MobileBy.XPATH,"//*[@resource-id='com.tencent.wework:id/de1']")))
self.driver.find_element(MobileBy.XPATH,"//*[@resource-id='com.tencent.wework:id/de1']").click()
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/aam']").click()
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/dtv']").click()
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/dtv']").send_keys(mes)
self.driver.find_element(MobileBy.XPATH, "//*[@resource-id='com.tencent.wework:id/dtr']").click()