• 0
  • 0
分享
  • App的WebView页面中,当搜索栏无搜索按钮时处理方法
  • 恬恬圈 2022-01-04 09:58:46 字数 4179 阅读 830 收藏 0

一、遇到的问题

1.png

在做移动端的UI自动化测试时,经常会遇到上图所示的搜索框,这里有个麻烦就是搜索框没有“搜索”按钮,UI自动化测试时不能确认搜索。

要解决这个问题,我们可以通过 driver.press_keycode('66') 方法模拟键盘回车,具体的使用方法请参考:

http://testingpai.com/article/1595507207594/comment/1595559375540

但是这种方法只能适用于Android环境,iOS环境不能使用。由于我是在Webview环境做UI自动化测试,无论是Android环境,iOS环境都可以使用js方法解决疑难杂症,操作时只需要通过python发送js方法就可以。

二、操作方法

2.png

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)


作者:飞翔的猪

原文链接:https://www.cnblogs.com/zdx20/p/15607139.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   为什么是 Fiddler?  理由很简单:因为大多数测试同学都是用 Fiddler。虽然不同的抓包工具功能都大同小异,但就像开发者统一开发工具能够提高团队协作的效率一样,开发和测试之间统一工具也能提高大家的沟通效率。如果测试同学在使用 Fiddler 抓包时遇到了什么问题,比如说某个请求抓不到,你给的答复却是:我用 whistle/charles 没问题啊,这肯定会让测试同学抓狂。  前置准备  下载 Fiddler Everywhere  下载地址:https://www.telerik.com/download/fiddler-everywhere  使用这个版本的原因是作为...
            0 0 6749
            分享
          •   在Apple Pay上线十周年之际,Apple Pay和Apple Wallet副总裁透露了有关未来 iPhone 上非接触式支付和数字密钥的新细节。苹果的移动支付服务于 2014 年 10 月 20 日推出,该公司最近庆祝了该功能推出 10 周年。 Apple Pay 使人们可以在iPhone上完成支付,而无需使用实体卡,但这项服务当时并没有立即受到市场欢迎。  苹果公司 Apple Pay 和 Apple Wallet 副总裁詹妮弗-贝利(Jennifer Bailey)在接受 The Points Guy 采访时解释说,公司必须教育消费者并与商家合作,努力说服他们使用这项服务。 据贝...
            0 0 189
            分享
          •   2022年度软件测试行业的趋势预测:如果你也想了解更多发展趋势,那就点击下方链接填写调查问卷吧!助力测试行业发展,还能获得精美礼包哦~ 链接:http://vote.51testing.com/   我有一个秋招群,有时会看到他们在聊外包岗的相关话题,基本是 99% 的人都在尽力躲开外包岗。  确实,很多人都不想被套上外包岗的标签,但事实上,外包公司真的很多,总有人会在外包岗。  那外包岗真的一点也不值得去吗?  答是我也不清楚,不过今天咱不谈值不值得去的话题,而是谈一谈帅地身边的外包同事,注意,腾讯那么大,可能每个部门的外包人员待遇也是不一样的,所以我指的是,我身边的外包同事。  信息主...
            0 0 1405
            分享
          •       一、前言      作为移动互联网产品『最后一公里的守护者』,我们必须要清楚的知道自己该做什么、怎么做。但从版本迭代速度、需求量级、测试人员不断变动等方面综合来看,我们很多人都没有做好充分的准备。测试方法落后、测试用例覆盖不全、测试效率低下,使得测试将要成为阻碍产品质量进一步提升的另一瓶颈。      因此,沉淀一下自己的工作心得,希望能帮助更多的人完善测试设计,提升自我测试能力。      二、提高测试用例质量  &nbs...
            0 0 2340
            分享
          • 在罗永浩之后,粉丝量匹敌李佳琦的刘畊宏也从抖音跳到了淘宝。10月31日,刘畊宏妻子王婉霏ViVi在淘宝首播,还上线了自有品牌VIVICYCLE,主打健身服饰品类。然而,热闹的直播只是少数人的盛宴。多位从业者坦言,今年“双11”部分中小主播薪资被腰斩,部分单品投流费用甚至超过九成,没“底子”也难做供应链,更有人感慨“现在的电商不太适合机构创业者和个体主播了”。随着行业“二八定律”加速固化,后来者居上的几率越来越渺茫。头部主播迁移中小主播薪资2万变1万10月31日晚间7点,刘畊宏妻子王婉霏ViVi现身“ViVi肥油咔咔掉”淘宝直播间向粉丝介绍团队和商品。北京商报记者看到,直播间上架的商品链接共34...
            0 0 953
            分享
      • 51testing软件测试圈微信