当前位置:网站首页>UI自动化测试 App的WebView页面中,当搜索栏无搜索按钮时处理方法
UI自动化测试 App的WebView页面中,当搜索栏无搜索按钮时处理方法
2022-08-05 03:50:00 【入坑玩家】
一、遇到的问题
在做移动端的UI自动化测试时,经常会遇到上图所示的搜索框,这里有个麻烦就是搜索框没有“搜索”按钮,UI自动化测试时不能确认搜索。
要解决这个问题,首先 ,在使用unicode输入法输入中文文本后,使用os模块进行adb命令切换输入法:os.system(“adb shell ime set com.sohu.inputmethod.sogou/.SogouIME”) ,记得切换后使用sleep等待个一两秒,重点:必须sleep等待一下。
我们在使用 driver.press_keycode(‘66’) 方法模拟键盘回车操作,在等待停顿一下,切换回unicode输入法os.system(“adb shell ime set io.appium.settings/.UnicodeIME”)。
这个时候输入中文也可以了,搜索也可以了。不过以后遇到这种情况都需要去调用下此方法进行切换。封装一下就好。
但是这种方法只能适用于Android环境,iOS环境不能使用。由于我是在Webview环境做UI自动化测试,无论是Android环境,iOS环境都可以使用js方法解决疑难杂症,操作时只需要通过python发送js方法就可以。
二、操作方法
1、找到搜索框元素
通过document对象找到搜索框的元素位置,如上图搜索框:
document.getElementsByTagName('input')[0];
2、js模拟回车事件的方法
下面是实现回车事件的JavaScript方法:
function inputeven() {
let el = document.getElementsByTagName('input')[0];
let evtType = 'keyup';
let keyCode = 13;
let evtObj;
if (document.createEvent) {
if (window.KeyEvent) {
//firefox 浏览器下模拟事件
evtObj = document.createEvent('KeyEvents');
evtObj.initKeyEvent(evtType, true, true, window, true, false, false, false, keyCode, 0)
} else {
//chrome 浏览器下模拟事件
evtObj = document.createEvent('UIEvents');
evtObj.initUIEvent(evtType, true, true, window, 1);
delete evtObj.keyCode;
if (typeof evtObj.keyCode === 'undefined') {
//为了模拟keycode
Object.defineProperty(evtObj, 'keyCode', {
value: keyCode
})
} else {
evtObj.key = String.fromCharCode(keyCode)
}
if (typeof evtObj.ctrlKey === 'undefined') {
//为了模拟ctrl键
Object.defineProperty(evtObj, 'ctrlKey', {
value: true
})
} else {
evtObj.ctrlKey = true
}
}
el.dispatchEvent(evtObj)
} else if (document.createEventObject) {
//IE 浏览器下模拟事件
evtObj = document.createEventObject();
evtObj.keyCode = keyCode;
el.fireEvent('on' + evtType, evtObj)
}
}
inputeven();
在进行UI自动化时,使用selenium的 execute_script() 方法发送js指令时,需要是字符串格式的,因此需要将上面的方法压缩:
js = function inputeven(){
let el=document.getElementsByTagName('input')[0];let evtType='keyup';let keyCode=13;let evtObj;if(document.createEvent){
if(window.KeyEvent){
evtObj=document.createEvent('KeyEvents');evtObj.initKeyEvent(evtType,true,true,window,true,false,false,false,keyCode,0)}else{
evtObj=document.createEvent('UIEvents');evtObj.initUIEvent(evtType,true,true,window,1);delete evtObj.keyCode;if(typeof evtObj.keyCode==='undefined'){
Object.defineProperty(evtObj,'keyCode',{
value:keyCode})}else{
evtObj.key=String.fromCharCode(keyCode)}if(typeof evtObj.ctrlKey==='undefined'){
Object.defineProperty(evtObj,'ctrlKey',{
value:true})}else{
evtObj.ctrlKey=true}}el.dispatchEvent(evtObj)}else if(document.createEventObject){
evtObj=document.createEventObject();evtObj.keyCode=keyCode;el.fireEvent('on'+evtType,evtObj)}}inputeven();
3、要适应pytest自动化测试框架,上面的方法需要进行如下封装:
def js_keyboard_enter(self, element_located):
"""
搜索框输入后,通过js方法确认搜索(用于搜索框没有搜索确认按钮)
:param element_located:已定位到的搜索框元素document对象
:return:
"""
# js方法实现搜索确认事件
js = "function inputeven(){let el=%slet evtType='keyup';"
"let keyCode=13;let evtObj;if(document.createEvent){if(window.KeyEvent){evtObj=document.createEvent"
"('KeyEvents');evtObj.initKeyEvent(evtType,true,true,window,true,false,false,false,keyCode,0)}"
"else{evtObj=document.createEvent('UIEvents');evtObj.initUIEvent(evtType,true,true,window,1);"
"delete evtObj.keyCode;if(typeof evtObj.keyCode==='undefined'){Object.defineProperty(evtObj,'keyCode',"
"{value:keyCode})}else{evtObj.key=String.fromCharCode(keyCode)}if(typeof evtObj.ctrlKey==='undefined')"
"{Object.defineProperty(evtObj,'ctrlKey',{value:true})}else{evtObj.ctrlKey=true}}el.dispatchEvent(evtObj)}"
"else if(document.createEventObject){evtObj=document.createEventObject();evtObj.keyCode=keyCode;el."
"fireEvent('on'+evtType,evtObj)}}inputeven();" % (element_located)
# 执行搜索确认的js方法
self.driver.execute_script(js)
这里我将操作的搜索框document对象作为入参,在使用该方法时只需要传入操作的搜索框元素document对象即可。
4、使用举例
在前面的第1步中,我们已经通过document对象找到操作的搜索框,search_document_loc = “document.getElementsByTagName(‘input’)[0];”
调用js_keyboard_enter()方法,执行回车事件,确认搜索:
@allure.step("搜索框输入后,通过js方法确认")
def search_enter(self):
self.js_keyboard_enter(search_document_loc)
粉丝专享
现在我邀请你进入我们的软件测试学习交流群:【769146372】,备注“入群”, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!
软件测试工程师自学教程:
边栏推荐
- ffmpeg 枚举decoders, encoders 分析
- 结构体初解
- MySql index learning and use; (I think it is detailed enough)
- ffmpeg enumeration decoders, encoders analysis
- 【已解决】Unity Coroutinue 协程未有效执行的问题
- mutillidae下载及安装
- UE4 后期处理体积 (角色受到伤害场景颜色变淡案例)
- This year's Qixi Festival, "love vegetables" are more loving than gifts
- [TA-Frost Wolf_may-"Hundred Talents Project"] Graphics 4.3 Real-time Shadow Introduction
- 关于#SQL#的迭代、父子结构查询问题,如何解决?
猜你喜欢
2022-08-04 The sixth group, hidden from spring, study notes
YYGH-13-客服中心
[论文笔记] MapReduce: Simplified Data Processing on Large Clusters
静态方法获取配置文件数据
ASP.NET application--Hello World
Never put off till tomorrow what you can put - house lease management system based on the SSM
Defect detection (image processing part)
运维监控系统之Open-Falcon
Web3.0 Dapps - the road to the future financial world
银行数据采集,数据补录与指标管理3大问题如何解决?
随机推荐
DEJA_VU3D - Cesium功能集 之 059-腾讯地图纠偏
Common open source databases under Linux, how many do you know?
Kubernetes 网络入门
Burp installation and proxy settings
关于#SQL#的迭代、父子结构查询问题,如何解决?
ffmpeg 枚举decoders, encoders 分析
pyqt5 + socket 实现客户端A经socket服务器中转后主动向客户端B发送文件
UE4 为子弹蓝图添加声音和粒子效果
Ice Scorpion V4.0 attack, security dog products can be fully detected
今年七夕,「情蔬」比礼物更有爱
MRTK3 develops Hololens application - gesture drag, rotate, zoom object implementation
There are several common event handling methods in Swing?How to listen for events?
High Item 02 Information System Project Management Fundamentals
YYGH-13-Customer Service Center
UE4 通过互动(键盘按键)开门
rpc-remote procedure call demo
iMedicalLIS listener (2)
UE4 在游戏运行时更改变量 (通过鼠标滑轮来更改第一人称角色的最大行走速度)
Shell script: for loop and the while loop
MySql index learning and use; (I think it is detailed enough)