【Appium作业】Appium 企业微信实战1 - 环境搭建与脚本录制

作业:使用 Appium Inspector 录制企业微信搜索功能的测试用例,搜索一个存在的联系人。

用例步骤:

  • 打开企业微信(提前登录)
  • 进入通讯录
  • 点击搜索按钮
  • 输入 已存在的联系人姓名, 例如“aa”,
  • 点击联系人,进入聊天页面
  • 输入“测试code”
  • 点击发送
  • 退出应用

注意:

  1. 提前登录,绕过登录功能
  2. 使用录制功能完成上面的功能,
  3. 进行简单的重构,使用 pytest 测试框架。
  4. 可以加入参数化,实现多条搜索功能的测试用例。

提交作业
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()

https://github.com/Fish-feces/test_project/blob/master/test_appium/test_wework.py

https://github.com/606keng/weeds_study/blob/master/appium_study/test_qiyeweixin.py

写的不错,也实现了参数化,思路很清晰,赞

隐式等待的时间建议在 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

https://github.com/August-A/HogwartsPythonTesting/blob/master/app/test_homework1.py

作业:

https://github.com/ZHHAYO/TestingDemo/blob/master/test_appium_wechatwork/test_sendmessage.py

https://github.com/yyn0918/Test_N/blob/master/Test_Appium/test_wework_class1.py

https://github.com/q838732947/devtest/blob/master/app/testcase/test_wework_pytest.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()

https://github.com/whiteParachute/PythonTest/blob/master/appium/record/test_search.py

https://github.com/mengqiD11/appium01/blob/master/test_qwork.py