Appium 解决微信公众号、小程序切换 webview 后无法定位元素的问题

贫僧纠结中 · 2018年02月25日 · 最后由 diaohanji 回复于 2019年03月19日 · 3240 次阅读

感谢@qiqiqinqin 同学
如何切换 webview 进入小程序请参考https://testerhome.com/topics/12003

脚本思路:
进入 webview 后会存在多个 handle 同 Web 页签一样,获取所有的 handle,然后在遍历所有的 handle,通过 switch_to_window 进行 handle 切换,当某个 handle 可以定位到我们需要定位的元素时,然后我们就可以进行之后的自动化操作了!

#coding=utf-8
from appium import webdriver
import time,os,re
from appium.webdriver.common.touch_action import TouchAction


desired_caps = {}
desired_caps['platformName'] = 'Android'    
desired_caps['deviceName'] = 'Android001'   
desired_caps['unicodeKeyboard'] = True      
desired_caps["resetKeyboard"] = True        
desired_caps["newCommandTimeout"]=30       
desired_caps['fullReset'] = 'false'     
desired_caps['appPackage'] = 'com.tencent.mm'           
desired_caps['appActivity'] = 'com.tencent.mm.ui.LauncherUI'        
desired_caps['recreateChromeDriverSessions'] = True
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 10
desired_caps['chromeOptions']={'androidProcess': 'com.tencent.mm:appbrand0'}
driver = webdriver.Remote(command_executor = 'http://127.0.0.1:4723/wd/hub',desired_capabilities = desired_caps)  
time.sleep(2)
time.sleep(1)
driver.implicitly_wait(10)
driver.find_element_by_name('发现').click()
time.sleep(1)
driver.swipe(100,1200,100,900)
driver.find_element_by_name('小程序').click()
driver.find_element_by_name('美团外卖').click()
time.sleep(2)
contexts = driver.contexts
print contexts
time.sleep(2)
driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0')
print '切换成功'
print driver.current_context
all_handles = driver.window_handles
print len(all_handles)
for handle in all_handles:
    try:
        driver.switch_to_window(handle)
        print driver.page_source
        driver.find_element_by_css_selector('.filter-select.flex-center')    #定位“筛选 ”按钮
        print '定位成功'
        break
    except Exception as e:
        print e
driver.find_element_by_css_selector('.filter-select.flex-center').click()
time.sleep(5)
driver.quit()
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 12 条回复 时间 点赞
贫僧纠结中 关闭了讨论 02月25日 16:36
贫僧纠结中 重新开启了讨论 02月25日 16:41

安卓的 handle 和 Windows 的 iframe 一样的?

—— 来自 TesterHome 官方 安卓客户端

oly 回复

iframe 是表单,handle 是页签不一样的,Andriod 的 handle 和 Web 的 handle 是一样的!

就是都需要切换到对应这个标签 < iframe handle>里面,才能找到这个标签< iframe handle>内 的元素.

不是切换 iframe,是切换 handle,iframe 和 handle 是两个不一样的东西,再说了 iframe 标签也是以/iframe 结尾!

👍 👍 👍
大赞楼主,解决了困扰我很多天的问题。

楼主 你现在微信还能切换到 webview 我的微信无法切换,问了很多人也是跟我一个样。 我切换上下文 会卡主,过几分就报错

宣梦达 回复

刚试了,是可以切换 context 和 handle 的

楼主,我切换到 appbrand0 只有一个 handle,这个对应的是 preload 页面,怎么办

楼主有遇到切换 webview 成功、切换 handle 也成功,但打印页面元素不是小程序页面的元素的问题吗?反而再次切换到 native 后能打印出小程序页面元素,但是依然不能定位。

不知道我这什么情况,获取 window handle 就报错,有没有遇到
File "Test001_RefuseSaleManagerRegister.py", line 29, in testRefuseRegisterApplication
len(self.appium_driver.window_handles)
File "D:\software\python\3.6.6\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 723, in window_handles
return self.execute(Command.W3C_GET_WINDOW_HANDLES)['value']
File "D:\software\python\3.6.6\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
self.error_handler.check_response(response)
File "D:\software\python\3.6.6\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response
raise wde
File "D:\software\python\3.6.6\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response
super(MobileErrorHandler, self).check_response(response)
File "D:\software\python\3.6.6\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not proxy. Proxy error: Could not proxy command to remote server. Original error: 404 - "unknown command: session/3fd9b884785f1cbec78ea5da25dbcdf9/window/handles"

driver.contexts 没有小程序 webview 怎么办呢
没有这个 WEBVIEW_com.tencent.mm:appbrand0
只有 ['NATIVE_APP', 'WEBVIEW_com.tencent.mm:tools', 'WEBVIEW_com.tencent.mm:toolsmp']

2楼 已删除
nanalia 回复

在? 你那个问题解决了?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册