测试人社区

【课程贴】拉勾 app 自动化训练营

开营仪式

image

adb 实用命令

  • adb shell dumpsys 命令

  • demo 代码块:
demo() {
        find_element ej_  | awk -F\" '{print $4}'  | while read e; do
        click "$e"
        location=$(get_text b_3)
        echo $e $location
        find_element b_3 >/dev/null && back || back
    done
}

appium 环境搭建

  • Appium 两种安装方式
    1、Appium Desktop = Appium Server + Appium Inspector
    2、命令行版本的Appium Server
  • 安装 Appium
    • 官方文档的安装方式(基本安装不上):
      • npm install -g appium
    • 淘宝cnpm (最稳定的方法)
      • npm install -g cnpm --registry=https://registry.npm.taobao.org
      • cnpm install -g appium

搭建环境 注意

  • Appium 建议1.5
  • Java 1.8
  • SDK build-tools/ 下对应的版本,需要使用<=29的版本

appium 录制

  • 配置:

{
  "platformName": "Android",
  "deviceName": "hogwarts",
  "appPackage": "com.tencent.wework",
  "appActivity": ".launch.LaunchSplashActivity",
  "noReset": "true"
}
  • 获取包名和activity名
Mac/Linux: adb logcat |grep -i activitymanager (-i忽略大小写)
Windows:  adb logcat |findstr /i activitymanager

appium 录制用例优化

不建议使用录制出来的用例?

1、非常不便于维护,没有任何框架结构
2、生成的定位符通常是 xpath绝对定位,还需要优化
3、还需要在录制出来的用例中添加断言

课后练习

自己注册一个企业微信,实现添加联系人用例

Allure

安装:

1、allure

2、 allure-pytest

  • 安装allure-pytest插件
    • pip install allure-pytest

运行

1、生成中间结果
pytest 文件名 --alluredir /path/to/your/report

2、allure 命令生成最终的html 结果

allure serve /path/to/your/report
allure generate /path/to/your/report -o /path/to/finialreport

参考代码

@allure.title("{name}")
    @pytest.mark.parametrize("name, gender,phonenum",get_data())
    def test_addcontact(self,name, gender,phonenum):
        # name = "霍格沃兹02"
        # gender = '女'
        # phonenum = '13800000002'
        self.driver.find_element(MobileBy.XPATH, "//*[@text='通讯录']").click()
        self.driver.find_element(MobileBy.XPATH, "//*[@text='添加成员']").click()
        self.driver.find_element(MobileBy.XPATH, "//*[@text='手动输入添加']").click()
        self.driver.find_element(MobileBy.XPATH,
                                 "//*[contains(@text,'姓名')]/../*[@class='android.widget.EditText']").send_keys(name)
        self.driver.find_element(MobileBy.XPATH, "//*[@text='男']").click()
        self.driver.find_element(MobileBy.XPATH, f"//*[@text='{gender}']").click()
        # if gender == '男':
        #     self.driver.find_element(MobileBy.XPATH, "//*[@text='男']")
        # else:
        #     self.driver.find_element(MobileBy.XPATH, "//*[@text='女']")
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'手机')]/..//android.widget.EditText").send_keys(
            phonenum)
        self.driver.find_element(MobileBy.XPATH, "//*[@text='保存']").click()
        sleep(2)
        # page_source 打印当前页面的xml布局结构
        print(self.driver.page_source)
        mytoast = self.driver.find_element(MobileBy.XPATH, "//*[@class='android.widget.Toast']").text
        assert '添加成功' == mytoast
        myphoto = "./img/photo.png"
        self.driver.save_screenshot(myphoto)
        allure.attach.file(myphoto,attachment_type=allure.attachment_type.PNG)


class TestWework(object):

    def setup(self):
        caps = {}
        caps["platformName"] = "android"
        caps["deviceName"] = "wework"
        caps["appPackage"] = "com.tencent.wework"
        caps["appActivity"] = ".launch.WwMainActivity"
        caps["noReset"] = "true"

        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(10)

    def test_case(self):

        self.driver.find_element_by_xpath("//*[contains(@resource-id,'h54')]//*[@text='通讯录']").click()
        self.driver.find_element_by_xpath("//*[contains(@resource-id,'hqr')]//*[@text='添加成员']").click()
        self.driver.find_element_by_id("cui").click()
        self.driver.find_element_by_xpath("//*[contains(@resource-id,'b8o')]//*[@text='必填']").send_keys("东北大萌虎")
        self.driver.find_element_by_id("f9s").send_keys("13166668888")
        self.driver.find_element_by_id("e__").click()
        self.driver.find_element_by_xpath("//*[contains(@resource-id,'b91')]//*[@text='男']").click()
        self.driver.find_element_by_id("hk6").click()


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

思路很清晰,完成的不错。
待改进:
1、appActivity 应该不是按课上提供的方式获取的, 你获取的这个主页的页面名称也可以,不过对于有些应用,直接进到主页会丢失一些数据,最好还是从我们教的方式,获取启动页面的activity
2、用例名最好起个有意义的名
3、适当加一些注释
4、适当加入一些断言来判断结果正确性