Appium微信小程序自动化之开启webview调试功能方法封装

简介: Appium微信小程序自动化之开启webview调试功能方法封装

一、前置说明


Appium在微信小程序自动化时,需要开启微信的webview调试功能,以方便对webview的元素进行定位。


二、操作步骤


import time
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction
from selenium.common import NoSuchElementException
from common.check_utils import CommonChecker
from common.exception import WechatMiniProgramError
from common.logger import logger
from driver.appium.webdriver.webdriver import WebDriver
class WechatMiniProgramDriver:
    """
    - 封装背景:微信从8.0.19开始将内核从x5换成了xweb
        - 需要使用 http://debugxweb.qq.com/?inspector=true 开启微信webview调试功能
        - 使用 http://debugx5.qq.com 不能再开启webview的调试功能,会报 503 错误
    - 小程序的本质:WebView
    - Appium微信小程序自动化的流程:
        - 手机开启usb调试功能, 连接至电脑
        - 开启微信 webview 调试功能
        - 微信内打开相应的小程序
        - chrome浏览器中定位小程序元素,chrome://inspect/#devices
        - 自动化操作元素
    """
    DEBUG_LINK = 'http://debugxweb.qq.com/?inspector=true'
    def __init__(self, webdriver: WebDriver):
        self.driver = webdriver
    @property
    def wrapped_driver(self):
        return self.driver
    def enable_webview_debugging(self):
        """
        如果小程序页面,可以直接定位到元素,则可以不用开启webview_debugging功能;
        如果小程序页面,不能直接定位到元素,需要使用 chrome://inspect/#devices 定位元素,则需要使用本方法开启允许调试功能。
        实现逻辑:将 'http://debugxweb.qq.com/?inspector=true' 在聊天窗口发送给自己,然后在消息窗口点击该链接即可开启webview调试功能
        """
        try:
            # 不直接使用文本定位,避免微信设置为英文时,获取不到元素
            elements = {
                '微信': ('xpath', '//android.widget.RelativeLayout[@resource-id="com.tencent.mm:id/nvt"][1]'),
                '通讯录': ('xpath', '//android.widget.RelativeLayout[@resource-id="com.tencent.mm:id/nvt"][2]'),
                '发现': ('xpath', '//android.widget.RelativeLayout[@resource-id="com.tencent.mm:id/nvt"][3]'),
                '我': ('xpath', '//android.widget.RelativeLayout[@resource-id="com.tencent.mm:id/nvt"][4]'),
            }
            # 从微信首页,点击"我"
            self.driver.find_element(*elements.get('我')).click()
            nick_name_ele = self.driver.find_element('id', 'com.tencent.mm:id/kbb')
            nick_name = nick_name_ele.text
            # 在通讯录中,搜索用户昵称
            self.driver.find_element(*elements.get('通讯录')).click()
            # 点击搜索
            self.driver.find_element('id', 'com.tencent.mm:id/jha').click()
            # 输出用户昵称
            self.driver.find_element('id', 'com.tencent.mm:id/d98').send_keys(nick_name)
            # 点击联系人
            self.driver.find_element('xpath',
                                     f'//android.widget.TextView[@text="{nick_name}"][@resource-id="com.tencent.mm:id/odf"]').click()
            # 给自己发送消息
            self.driver.find_element('id', 'com.tencent.mm:id/bkk').clear().send_keys(self.DEBUG_LINK)
            self.driver.find_element('id', 'com.tencent.mm:id/bql').click()
            # 点击链接
            self.driver.find_elements('id', 'com.tencent.mm:id/bkl')[-1].click()
            # 查找页面名称'微信,是一个生活方式'是否出现,如果出现,表示启动webview调试成功
            self.driver.find_element('id', 'com.tencent.mm:id/oct')
            # 点击X, 关闭‘微信,是一个生活方式’页面,
            self.driver.find_element('id', 'com.tencent.mm:id/actionbar_up_indicator').click()
            # 在聊天窗口,点击返回
            self.driver.find_element('id', 'com.tencent.mm:id/a4p').click()
            # 在搜索页面,点击取消
            self.driver.find_element('id', 'com.tencent.mm:id/b5i').click()
            # 回到"微信"首页
            self.driver.find_element(*elements.get('微信')).click()
            logger.info('Successfully enabled wechat webview debugging.')
        except:
            logger.error('Failed to enable wechat webview debugging.')
    def quit(self):
        return self.driver.quit()


三、Demo验证


import os.path
import pytest
from common import path
from driver.appium.support.wechat import WechatMiniProgramDriver
from driver.appium.webdriver.webdriver import WebDriver
from driver.appium.webdriver.appium_service import AppiumService
def setup_module():
    import logging
    logging.basicConfig(level=logging.DEBUG)
    # 启动 appium server
    server_manager = AppiumService()
    server_manager.start()
@pytest.fixture(scope='module')
def driver():
    appium_server_url = 'http://localhost:4723'
    apk_path = os.path.join(path.get_apk_resources_dir(), 'wechat-8.0.43.apk')
    capabilities = {
        "platformName": "Android",
        "automationName": "uiautomator2",
        "deviceName": "192.168.2.106:5555",
        "udid": "192.168.2.106:5555",
        "app": apk_path,
        # "appPackage": "com.tencent.mm",
        # "appActivity": ".ui.LauncherUI",
        "noReset": "true",
        "forceAppLaunch": "true",  # 注意:加上这个参数才能启动微信
    }
    webdriver = WebDriver(command_executor=appium_server_url, capabilities=capabilities)
    # 实例化WechatMiniProgramDriver
    driver = WechatMiniProgramDriver(webdriver)
    yield driver
    driver.quit()
def test_enable_webview_debugging(driver):
    driver.enable_webview_debugging()


运行代码之后,可以顺利打开微信,通过向自己发送消息并点击消息,开启webview调试功能:

看到这个页面后,表示启动微信webview调试功能启动生效。

目录
相关文章
|
2月前
|
小程序
|
20天前
|
敏捷开发 Java 测试技术
探索自动化测试的奥秘:从Selenium到Appium
【9月更文挑战第14天】软件测试,这个看似枯燥乏味却至关重要的领域,正经历着一场革命。随着技术的进步,自动化测试工具如Selenium和Appium已成为质量保证的利器。本文将带你一探这些工具的神秘面纱,了解它们如何简化测试流程、提升效率,并确保软件产品的质量。准备好,我们将深入自动化测试的世界,解锁其背后的原理和实践技巧。
|
2月前
|
小程序 JavaScript
微信小程序中的页面跳转(通过点击按钮、调用方法的形式)
这篇文章讲解了微信小程序中页面跳转的方法,包括使用按钮点击事件和调用方法实现跳转,以及推荐使用`this.pageRouter.navigateTo`代替`wx.navigateTo`的方式。
微信小程序中的页面跳转(通过点击按钮、调用方法的形式)
|
2月前
|
小程序 数据安全/隐私保护
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
在 `src/http` 目录下创建 `request.ts` 文件,并配置 Taro 的网络请求方法 `Taro.request`,支持多种 HTTP 方法并处理数据加密。
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
|
2月前
|
Java 测试技术 API
探索自动化测试的奥秘:从Selenium到Appium
【8月更文挑战第31天】本文旨在引导读者理解自动化测试的重要性,并逐步深入介绍如何利用Selenium和Appium这两个强大的工具来提升测试效率和质量。文章不仅分享理论知识,还通过具体代码示例,展示如何在Web应用和移动应用测试中实施自动化策略。
|
2月前
|
测试技术 Android开发 iOS开发
探索自动化测试的奥秘:从Selenium到Appium
【8月更文挑战第31天】在软件测试的海洋中,自动化测试如同一艘快艇,带领我们高效地穿越波涛汹涌的手动测试海域。本文将带你从Selenium的网页自动化测试出发,一路驶向Appium的移动应用自动化测试岛屿,揭秘这两种工具如何改变软件测试的航向。你将看到代码示例的灯塔,指引你理解它们如何在实战中发挥作用,以及为什么掌握这些技能对于测试人员来说至关重要。
|
2月前
|
Java 测试技术 Android开发
探索自动化测试之美:从Selenium到Appium
【8月更文挑战第31天】在软件开发的世界中,测试是确保产品质量的关键步骤。随着技术的发展,自动化测试工具如Selenium和Appium成为了开发者的得力助手。本文将通过一个简单的代码示例,带领读者了解如何利用这些工具进行高效的自动化测试,确保软件的稳定性和可靠性,同时也让测试过程变得更加轻松有趣。
|
29天前
|
运维 Ubuntu Devops
自动化运维工具的魅力:Ansible入门
【9月更文挑战第5天】在快速变化的IT世界里,自动化运维不再是可选项,而是必需品。Ansible,一款简单却强大的自动化工具,正成为众多DevOps工程师的首选。本文将带你了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook,从而开启你的自动化之旅。
67 36
|
5天前
|
机器学习/深度学习 运维 Cloud Native
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为信息技术的重要支柱,其效率与创新能力直接关系到企业信息系统的稳定性和业务连续性。本文将探讨如何通过技术手段,实现运维从传统手工操作向自动化、智能化的转变,进而构建一个高效、可靠的运维体系。我们将从自动化工具的应用开始,逐步深入到智能运维的实践,最终展望云原生架构下的运维未来趋势。
|
9天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为保障企业IT系统稳定运行的关键环节,正经历着前所未有的变革。本文将探讨如何通过实施自动化和引入智能化技术,构建一个更加高效、可靠的运维体系,以应对日益复杂的业务需求和技术挑战。
21 1
下一篇
无影云桌面