微信小程序测试技术公开课

本节课主要是讲解微信小程序的基本测试技术,并利用appium的webview测试技术结合adb proxy完成微信小程序的自动化测试。

微信小程序技术架构

chrome提供的inspect分析工具,在浏览器中输入如下地址

  • chrome://inspect/#devices

使用chrome查看手机上打开的webview进程与基本信息

可以使用chrome inspect分析微信小程序的控件结构与布局。

使用console执行自己的javascript代码
image

微信小程序性能测试

微信小程序自动化测试

微信小程序自动化测试python版代码示例

class TestWXMicroWebView:
    # 为了演示方便,未使用page object模式
    def setup(self):
        caps = {}
        caps["platformName"] = "android"
        caps["deviceName"] = "测试人社区 ceshiren.com"
        caps["appPackage"] = "com.tencent.mm"
        caps["appActivity"] = "com.tencent.mm.ui.LauncherUI"
        caps["noReset"] = True
        caps['unicodeKeyboard'] = True
        caps['resetKeyboard'] = True

        caps['chromedriverExecutable'] = \
            '/Users/seveniruby/projects/chromedriver/chromedrivers/chromedriver_78.0.3904.11'

        # options = ChromeOptions()
        # options.add_experimental_option('androidProcess', 'com.tencent.mm:appbrand0')
        caps['chromeOptions'] = {
            'androidProcess': 'com.tencent.mm:appbrand0'
        }

        caps['adbPort'] = 5038

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

        self.driver.find_element(By.XPATH, "//*[@text='通讯录']")
        self.driver.implicitly_wait(10)

        self.enter_micro_program()
        print(self.driver.contexts)

    def enter_micro_program(self):
        # 原生自动化测试
        size = self.driver.get_window_size()
        self.driver.swipe(size['width'] * 0.5, size['height'] * 0.4, size['width'] * 0.5, size['height'] * 0.9)
        self.driver.find_element(By.CLASS_NAME, 'android.widget.EditText').click()
        self.driver.find_element(By.XPATH, "//*[@text='取消']")
        self.driver.find_element(By.CLASS_NAME, "android.widget.EditText").send_keys("雪球")
        self.driver.find_element(By.CLASS_NAME, 'android.widget.Button')
        self.driver.find_element(By.CLASS_NAME, 'android.widget.Button').click()
        self.driver.find_element(By.XPATH, "//*[@text='自选']")

    def find_top_window(self):
        for window in self.driver.window_handles:
            print(window)
            if ":VISIBLE" in self.driver.title:
                print(self.driver.title)
            else:
                self.driver.switch_to.window(window)

    def test_search_webview(self):
        # 进入webview
        self.driver.switch_to.context('WEBVIEW_xweb')
        self.driver.implicitly_wait(10)
        self.find_top_window()

        # css定位
        self.driver.find_element(By.CSS_SELECTOR, "[src*=stock_add]").click()
        # 等待新窗口
        WebDriverWait(self.driver, 30).until(lambda x: len(self.driver.window_handles) > 2)
        self.find_top_window()
        self.driver.find_element(By.CSS_SELECTOR, "._input").click()
        # 输入
        self.driver.switch_to.context("NATIVE_APP")
        ActionChains(self.driver).send_keys("alibaba").perform()
        # 点击
        self.driver.switch_to.context('WEBVIEW_xweb')
        self.driver.find_element(By.CSS_SELECTOR, ".stock__item")
        self.driver.find_element(By.CSS_SELECTOR, ".stock__item").click()

参考链接

赏金内推

在活动期间,第一名进入BAT的同学直接奖励一万元奖学金。

赏金内推活动
image

名企offer薪酬表

名企测试开发助力课程

1 个赞

环境是什么样的?
真机 or 模拟器的安卓版本
微信版本

去看当天的公开课视频吧,真机 微信最新版本

oppo.txt (119.5 KB) huawei.txt (47.8 KB)

真机:Oppo 和huawei
问题:1.进入webview第一次self.driver.switch_to.context,context的内容与老师的不同,这个正常吗?

2.oppo的context解析出来的是正常的,是因为走了5038端口,用了adb_proxy.py中的方法重写了吗?
而huawei的context解析异常,是socket内容不符合adb_proxy吗?

3.前后打印的contexts内容:
进入前打印contexts: [‘NATIVE_APP’, ‘WEBVIEW_com.tencent.mm:appbrand0’,
‘WEBVIEW_com.tencent.mm:toolsmp’]
进入后打印contexts: [‘NATIVE_APP’, ‘WEBVIEW_com.tencent.mm:appbrand0’,
‘WEBVIEW_com.tencent.mm:appbrand2’, ‘WEBVIEW_com.tencent.mm:toolsmp’]
进入后多了一个WEBVIEW_com.tencent.mm:appbrand2,是否就是我需要switch_to的context?

4.前面chromeOptions配置参数时,"androidProcess"的值是怎么得来?我用了adb -P 5038 shell ps | findstr com.tencent.mm,发现在点开微信小程序之后多出来一个新进程com.tencent.mm:appbrand2,
com.tencent.mm:appbrand0进程反而是微信运行时就启动了的。

5.oppo在切换context时,一直会报"unknown error: Failed to get PID for the following process: com.tencent.mm:appbrand0",然而我换成了com.tencent.mm:appbrand2,也会报这个错误
与助教咨询多次,chromedriver的版本是从Inspector中得到的,启动的是appium server,这个问题还是没有解决。