1。场景之前写了几个微信小程序的方法。有源码的小程序,推荐使用微信开放的SDK进行自动化。否则,只能使用本机或WebView方法。最近在用Python+Appium做一个微信小程序的自动化项目。遇到了很多问题,都一一解决了。本文就和大家聊一聊微信小程序自动化的坑?2、小程序入口对于大多数人来说,小程序的使用方式是在微信主界面下拉屏幕,然后选择目标小程序。图标,进入程序应用另外,由于小程序在屏幕上的显示位置不固定,会影响自动化程序的稳定性defswipe_down(step):#screenwidthx=driver.get_window_size()['width']#屏幕高度y=driver.get_window_size()['height']#起点x轴y轴坐标x1=int(x*0.5)y1=int(y*0.25)#终点y轴坐标y2=int(y*(0.25+step))#向下滑动屏幕driver.swipe(x1,y1,x1,y2,1000)#向下滑动屏幕swipeDown(0.4)#找到目标小程序的图标元素,从顶部#pass这里进入小程序,推荐另一种方式。具体操作步骤为:先将目标小程序转发给文件传输助手,然后将文件传输助手设置为置顶消息。这样只需要点击第一条消息Item进入文件传输助手页面,再点击最后一条消息即可进入小程序页面#进入文件传输助手聊天页面为iteminchat_record_elements:chat_record_name=item。textifchat_record_name=='文件传输助手':item.click()breakdeffind_element_by_id_and_text(driver:webdriver,id,text):"""通过id查找有文本内容的元素:paramdriver::paramid::paramtext::return:"""result=Noneelements=driver.find_elements_by_id(id)ifelements:foriteminelements:ifitem.text==text:result=itembreakreturnresult#点击小程序进入到目标应用mini_program_tag=find_element_by_id_and_text(driver,'com.tencent.mm:id/apc','160挂号丨预约健康医疗服务平台')3.查看网页元素由于小程序是基于腾讯X5内核的WebView,为了方便页面元素的定位和操作,需要启用de错误模式。一般来说,对于6.X以下版本的微信,只需要在任意聊天记录中点击debugx5.qq.com链接,进入X5调试页面,打开TBS内核Inspector调试功能即可。但在实际使用过程中发现,部分手机即使使用低版本的微信,也无法通过Chrome命名检查查看小程序页面的元素。因此,如果您的设备无法使用上述方法检测网页元素,建议下载微信畅玩版,root后安装XP框架和WebViewDebugHook插件,并强制开启调试功能。下载地址:https://github.com/feix760/WebViewDebugHook4。ChromeDriver版本对应正常使用appium命令打开AppiumServer,会使用系统默认的ChromeDriver#Openappiumserverappium如果ChromeDriver版本与微信WebView版本不一致,会报如下错误。因此,我们启动AppiumServer的正确步骤如下:首先在Chrome中输入chrome://inspect/#devices查看WebView的版本号。然后通过下面的链接找到对应的ChromeDriver版本号,查看地址:https://raw。githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json接下来下载对应的版本号:2.29ChromeDriver下载地址:https://chromedriver.storage.googleapis.com/index.html最后使用——chromedriver-executable参数,显式指定某个版本的ChromeDriver启动AppiumServer#Openappiumserver#显式运行某个版本的chromedriverappium--chromedriver-executable/Users/xingag/Desktop/test/chromedriver295上下文和流程因为微信中有多个上下文,所以要操作网页的控件元素,首先要切换到对应的上下文和Selenium类型。只需要找出所有的上下文,过滤出当前合适的上下文,就可以保证上下文是正确的。搞定,最好等几秒再搞定#Allcontextsprint(driver.contexts)#切换到对应的Webcontextdriver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0')另外一个坑是,小程序在其他进程中独立运行。如果不显式指定正在运行的进程,上下文切换将失败。解决方法如下:首先打开小程序界面,然后通过adb命令,在栈顶找到activity对应的pid。然后,通过pid值找到topactivity的小程序#current进程adbshel??ldumpsysactivitytop|grepACTIVITY#ACTIVITYcom.tencent的进程名。mm/.plugin.appbrand.ui.AppBrandUI247e612pid=4389#通过进程pid,即:4389,找到进程名adbshel??lps4389#u0_a29143893182274008262160sys_epoll_00000000Scom.tencent.mm:appbrand0#小程序进程名:com.tencent0atthemend在启动配置项中添加chromeOptions项,指定目标小程序的运行进程#WeChat配置文件caps={"platformName":"Android","deviceName":"ca2b3455","appPackage":'com.tencent.mm',"appActivity":'com.tencent.mm.ui.LauncherUI',"autoGrantPermissions":True,#指定目标小程序的进程名"chromeOptions":{"androidProcess":"com.tencent.mm:appbrand0"},"noReset":True}6.切换窗口句柄和切换上下文后,就可以对当前页面的元素控件进行操作了。但是,如果出现页面跳转,则窗口可能会发生变化,直接元素搜索会失败。因此,一般对于WebView页面中的元素操作,可以先获取所有的窗口句柄,遍历并切换到每个窗口句柄,直到找到该元素。需要注意的是,如果是单页操作,不涉及窗口句柄切换deffind_element_by_web(driver:WebDriver,by:By,selector):"""在webview中查找元素涉及切换窗口句柄:handle:return:"""#获取所有句柄all_handles=driver.window_handlesresult_element=Noneforhandleinall_handles:try:driver.switch_to.window(handle)#搜索方法ifby==By.XPATH:result_element=driver.find_element(By.XPATH,selector)elifby==By.CSS_SELECTOR:result_element=driver.find_element(By.CSS_SELECTOR,selector)print('查找成功,直接返回')breakexceptExceptionase:print('查找失败,继续搜索')passreturnresult_element7最后,使用Appium自动化微信小程序遇到的坑主要就是上面这些,其他操作和native、hybrid应用类似,这里就不详细解释了
