【App自动化测试】(十五)手机浏览器(webview)自动化测试

news2024/11/25 16:33:37

目录

  • 1. 手机浏览器自动化前提
    • 1.1 安装chromedriver
    • 1.2 安装对chromedriver版本
    • 1.3 配置capability
    • 1.4 设置chromedriver相关配置
    • 1.5 使用浏览器的inspect工具远程调试
  • 2. 手机浏览器测试代码python版本


1. 手机浏览器自动化前提

五大前提

  1. 安装chromedriver
  2. 安装对chromedriver版本
  3. 配置capability
  4. 设置chromedriver相关配置
  5. 使用浏览器的inspect工具远程调试

1.1 安装chromedriver

帖子:chromedriver下载地址与webview自动化关键代码

在以下文章中有说明,可以用于参考:
【App自动化测试】(十四)Android WebView测试方法中的 2.3.1 前提一:chromedriver安装

1.2 安装对chromedriver版本

在以下文章中有说明,可以用于参考:
【App自动化测试】(十四)Android WebView测试方法中的 2.3.2 前提二:chromedriver版本选择正确

1.3 配置capability

需要配置的capability参数

  1. browserName:chrome(新版本)/ browser(老版本)

注意:还可使用标准的appPackageappActivity,写明浏览器的包名和activity的名字。但是使用browserName是最简单的

  1. chromedriverExecutableDir:指定 chromedriver 可执行文件集合的目录

chromedriverExecutableDir的示例图:可使用不同名字的后缀进行chromedriver的版本区分
在这里插入图片描述

  1. showChromedriverLog:让appium 日志展示 chromedriver 的日志方便排查

1.4 设置chromedriver相关配置

appium chromedriver 自动发现机制中常用的appium capability参数参数:

  • chromedriverExecutableDir: 指定 chromedriver 可执行文件集合的目录
    • 将可用的chromedriver放在此目录下,当appium发现此配置项后,会去目录中寻找合适的chromedriver。
  • chromedriverChromeMappingFile: 允许显式指定版本对应关系
    • 强行指定一个版本的chromedriver去测特定的webview版本
  • showChromedriverLog: 让appium 日志展示 chromedriver 的日志方便排查

appium capability参数设置 ——python:

def setup(self):
        desired_caps = {
        "platformName":"Android",
        "deviceName":"emulator-5554",
        "appPackage": "com.example.android.apis",
        "appActivity":".ApiDemos",
        "chromedriverExecutableDir":"E:\chromedriver_webview_test",
        "chromedriverChromeMappingFile":"E:\chromedriver_webview_test\mapping.json",
        "showChromedriverLog":True
        }
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        # 使用隐式等待
        self.driver.implicitly_wait(10)

1.5 使用浏览器的inspect工具远程调试

说明:

练习的时候使用了三款模拟器:Avd Android6.0、Avd Android7.0、MUMU.
Avd Android6.0、Avd Android7.0在使用edge inspect远程调试的时候,出现解析混乱,dom无法正常加载的情况。不知道是不是因为webview版本较低导致的。MUMU模拟器则正常。

2. 手机浏览器测试代码python版本

"""
模拟器:MUMU
浏览器:MUMU自带浏览器
备注:
使用脚本访问百度并进行搜索的话会导致无法打开网址;但手动访问并搜索正常
相关问题解释帖子:https://ceshiren.com/t/topic/16195/4
"""

from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class TestBrowser:
    def setup_class(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '6.0'
        desired_caps['deviceName'] = '127.0.0.1:7555'
        #python appium client 2.x 会默认使用w3c,因此此处使用chromeOptions参数吧w3c
        desired_caps['chromeOptions'] = {'w3c': False}
  
	#方式一:
	desired_caps['browserName']= 'browser'

	#方式二:
        #还可使用标准的`appPackage`和`appActivity`,写明浏览器的包名和activity的名字。
        #desired_caps['appPackage'] = 'com.android.browser'
        #desired_caps['appActivity'] = 'com.android.browser.BrowserActivity'

        #设置chromedriver所在路径
        desired_caps['chromedriverExecutableDir']='E:\\chromedriver_webview_test'
        #开启chromedriverlog
        desired_caps['showChromedriverLog']=True
        desired_caps['noReset'] = 'true'
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        # 使用隐式等待
        self.driver.implicitly_wait(10)

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

    def test_browser(self):
        self.driver.get('https://www.sogou.com/')
  
        #使用方式二`appPackage`和`appActivity`话,需要切换上下文,要不然会报错
        #print(self.driver.contexts)
        #WebDriverWait(self.driver, 5).until(lambda driver: len(self.driver.contexts) > 1)
        #self.driver.switch_to.context('WEBVIEW_com.android.browser')

        self.driver.find_element(By.ID,'keyword').click()
        self.driver.find_element(By.ID,'keyword').send_keys("webview")
        self.driver.find_element(By.CLASS_NAME,'qbtn').click()
        assert_text=self.driver.find_element(By.XPATH,'//*[@class="vrResult"]//a/em').text
        assert assert_text=="WebView"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Map集合的概述和接口的使用

目录 一、Map集合概述 1.Map接口的特点 2.方法 二、Map接口的使用 三、Map集合的实现类 1.HashMap 2.Hashtable 3.Properties 4.TreeMap 一、Map集合概述 1.Map接口的特点 (1)用于存储任意键值对 (2)键:无序…

阿里P8整合深入理解Dubbo实战+Kafka+分布式设计核心原理内部手册

一 深入理解Apache Dubbo与实战 近年来,随着业务规模的发展和复杂度的增加,传统的单体应用已经很难适应业务迭代的诉求,越来越多的公司开始进行服务化的改造。很高兴看到ApacheDubbo被许多公司采用,作为服务化改造的基础架构进行…

学习常用算法——python

常用算法 时间复杂度 在日常生活中, 我们描述物体的重量使用的是kg, 描述物体的长度使用的是m, 那么相对的, 在计算机科学中也需要一种度量来定性地描述算法的运行时间, 这种度量方法称为大O表示法. 声明f(n)作为我们的函数, n表示的参数. 不同的参数会导致算法运行的时间不同…

超低延时4K级可定制化专业视觉计算平台

> 内置超低延时4K30 ISP IP,ISP延时 0.7 ms > 内置GigE vision IP支持 GigE Vision2.0、GenICam V2.4.0标准,支持用户自定义XML描述文件 > 内置工业机器视觉行业标准的U3 vison IP > 基于FPGA,支持Bayer、YCbCr、RGB等格式,满足高帧率/高…

ElementUI实现在下拉列表里面进行搜索

分析: 首先我们需要实现上图的效果,然后Element-UI的el-select是没有的,所以需要自己写我们需要用到el-popover组件,然后使用它的v-model"visible"来实现控制显示我们在el-popover的slot"reference" 放一个el-select 使用popper-append-to-body"false…

C++ 之 移动构造函数

1、左值和右值 C( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。 通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象,表达式结束后依然存在的持久化对象,所有的具名变量或者对象都是左值。右值是指临时的…

<Android开发> Android vold - 第一篇 vold前言简介

本次主要讲解存储模块如U盘等设备在android设备中的管理和使用的模块。本次主要基于android 8.1版本进行解析。不同android版本 vold的内容可能会有所差异。读者可对比阅读解析。 1 Vold介绍 Android中Vold是volume Daemon,即Volume守护进程;Android没有使用Linux平台下的ud…

泛型的介绍和使用方法

目录 一、泛型概述 二、泛型类 三、泛型接口 1.直接在实现类中确定好类型 2.实现类也写成泛型类 四、泛型方法 五、泛型好处 六、泛型集合 1.概念 2.特点 一、泛型概述 1. 本质是参数化类型,把类型作为参数传递。 2. 常见的形式有泛型类、泛型接口、泛型…

【虚幻引擎】UE4/UE5 后期处理盒子(PostProcessVolume)

一、简介 PostProcessVolume(后期处理盒子):UE4非常强大的一个后期处理,可以调节画面的色彩,相机的景深,视频的输出效果,环境的光线构造,电影级的氛围感。 二、参数介绍 一、场景中…

驱动开发 Linux按键中断点灯

华清远见上海中心22071班 三个按键实现按键中断&#xff0c; key1->led1 key2->led2 key3->led3 按键按一下灯亮&#xff0c;再按一下灯灭 #include <linux/module.h> #include <linux/init.h> #include <linux/cdev.h> #include <linux/f…

外贸供应链ERP怎么选?全流程综合管理解析

随着外贸体制深入改革、进出口权放开等&#xff0c;以往处于垄断地位&#xff0c;享有种种优惠政策的外贸企业&#xff0c;将面临越来越严峻的国内外市场的竞争及各种挑战。长期以来形成的相对落后的管理体制和经营模式&#xff0c;严重地影响外贸企业在新形势下的生存和发展。…

m基于GA遗传优化+SA模拟退火的混合改进算法的多产品多机器生产优化matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 这里&#xff0c;我们首先介绍一下改进算法的基本原理&#xff0c;按照前面说的&#xff0c;这里我们主要将GA和SA进行合并。 这里&#xff0c;我研究了下&#xff0c;将两种算法做如下方法的结合…

Microcorruption 第一关 Tutorial

Microcorruptioin 第一关 Tutorial 首先进入Tutorial这一关&#xff0c;这是闯关页面。 在主函数设置断点&#xff0c;控制台输入"break main"或"b main"或手动点击反汇编栏中main函数的第一行设置断点。 该闯关游戏主要是破解密码&#xff0c;查看主函数…

前端开发免费资源分享

Fancy-Border-Radius 地址&#xff1a;https://9elements.github.io/fancy-border-radius/ 简介&#xff1a;在线编辑border-radius的可视化工具&#xff0c;通过调节可以很方便地帮我们生成想要的形状&#xff0c;然后直接复制下面的css代码&#xff0c;即可使用 Make some …

sCrypt 合约中的椭圆曲线算法:第二部分

我们在脚本中实现了椭圆曲线 (EC) 算法。在之前的实现中&#xff0c;我们进行链下计算并在脚本中验证结果。我们这里直接用脚本计算。 基于EC的应用非常多&#xff0c;特别是在密码学领域&#xff0c;如数字签名、加密、承诺方案等。作为具体示例&#xff0c;我们重新实现了 E…

11.28作业

实现对点灯所涉及函数的封装 1.头文件 #ifndef __GPIO_H__ #define __GPIO_H__ //结构体封装 typedef struct{volatile unsigned int MODER;volatile unsigned int OTYPER;volatile unsigned int OSPEEDR;volatile unsigned int PUPDR;volatile unsigned int IDR;volatile un…

Kotlin进阶指南 - 单元测试

为了减少一些功能繁琐的测试流程&#xff0c;单元测试是提升开发效率的有效方式之一 在早些年的时候我有记录过一篇 Android 使用单元测试&#xff0c;只不过当时更多的针对 Java 方面的单元测试&#xff1b;在使用 Kotlin 后&#xff0c;我发现单元测试有点不同&#xff0c;好…

Nacos注册中心和服务消费方式

目录 一&#xff0c;服务治理介绍 什么是服务治理&#xff1f; 常见的注册中心 二&#xff0c;nacos简介 三&#xff0c;搭建nacos环境 四&#xff0c;代码演示 五&#xff0c;基于Feign实现服务调用 什么是Feign Feign的使用 Feign参数传递 一&#xff0c;服务治理介…

全国心力衰竭日:重症心衰的黑科技——永久型人工心脏

今天是第8个“全国心力衰竭日”。近几年&#xff0c;中国逐渐老龄化&#xff0c;心衰则是老龄化面临的严峻问题。我国心衰患病率估计已达1.3%&#xff0c;至少有1000万心力衰竭患者。中国已成为世界上拥有最大心衰患者群的国家之一。心力衰竭作为大多数心血管疾病的终末阶段&am…

如何在 docker 容器使用 nginx 实现反向代理统一站点入口

在微服务架构下&#xff0c;我们会部署很多微服务来实现我们的系统。每个微服务会有不同的端口。而用户在访问我们的站点时希望通过统一的端口来访问所有的服务&#xff0c;因为在很多情况下用户只能通过 80 或者 443 端口访问外界服务。 这个时候我们就可以使用反向代理来实现…