appium version V1.15
Android 手机版本:9.0
切换到小程序页面后,通过打印 page_source 获取到的页面信息和小程序页面信息不一致,所以在页面进行元素定位的时候,会报无法定位该元素的错误。
之前有搜过相关问题,但是试了下都不行。
请问有人知道是怎么回事吗?
androidProcess 不对,应该是 com.tencent.mm:appbrand0 之类的,你查下社区之前相关的帖子 有详细的说明
相关的帖子我之前已经查看过了,不是这个问题,因为日志打印出来的 process 名称就一个 com.tencent.mm:tools,相反如果换成 appbrand 之类的,会报错,找不到对应的 context。
假如切换 webview 没报错的话,需要切换至包含期望元素的 handel 才能找到对应元素,LZ 看看是不是这个原因。
下面是我自己切换 handel 的方法:
/**
* 【WebView】切换至包含指定元素的WindowHandle
* @param element
*/
public static Boolean jumpToWindowHandel(WebElement element){
Boolean isHave = false;
for(String handle : BaseCase.ThreadDriver.get().getDriverWX().getWindowHandles()){
BaseCase.ThreadDriver.get().getDriverWX().switchTo().window(handle); //遍历handel直到找到相应元素
waitElement(10,element);
try{
if (element.isDisplayed()){
System.out.println("找到对应元素;当前WindowHandle:" + handle);
isHave = true;
break;
}
}catch (NoSuchElementException | StaleElementReferenceException n){
System.out.println("未找到对应元素;当前WindowHandle:" + handle);
isHave = false;
}
}
return isHave;
}
}
这个方法我刚才试过了,我切换到 webview 页面之后,获取到页面的句柄有两个,但是无论我切换到哪个,page_source 返回的页面都不是小程序的页面,甚至我在切换一个页面后得到数据是发现页面是到了搜一搜的页面,我也不知道是怎么回事了。下面是句柄截图和我的代码
try:
"""登录微信首页后,点击发现按钮,切换至小程序页面"""
sleep(10)
print("print context:", self.driver.context)
find = "发现"
el_find = self.driver.find_element_by_android_uiautomator("new UiSelector().text(\""+find+"\")")
print("发现元素有在页面显示吗?: %s" % el_find.is_displayed())
if el_find.is_displayed():
el_find.click()
sleep(THINK_TIME)
"""点击小程序按钮"""
minipro = "小程序"
el_minipro = self.driver.find_element_by_android_uiautomator("new UiSelector().text(\""+minipro+"\")")
print("页面上定位到小程序元素吗?:%s" % el_minipro.is_displayed())
if el_minipro.is_displayed():
el_minipro.click()
"""切换页面活动值小程序列表显示页面"""
self.driver.wait_activity(".plugin.appbrand.ui.AppBrandLauncherUI", THINK_TIME)
sleep(THINK_TIME)
print("小程序列表页面当前的context值为:", self.driver.current_context)
sleep(THINK_TIME)
target_minipro = "体验"
el_target = action().find_byUiautormator("textContains", target_minipro)
print("切换前的页面元素:", self.driver.page_source)
print("页面上定位到target小程序元素吗?:%s" % el_target.is_displayed())
if el_target.is_displayed():
el_target.click()
"""点击小程序进入页面,切换进入webview页面"""
self.driver.switch_to.context("WEBVIEW_com.tencent.mm:tools")
sleep(10)
print("切换后的页面handle名称:",self.driver.current_window_handle)
print("切换后的页面元素:", self.driver.page_source)
"""进行页面元素选择"""
print("小程序页面的context值为:%s" % self.driver.current_context)
print("当前页面的句柄%s" % self.driver.current_window_handle)
page_handles = self.driver.window_handles
print("小程序页面的全部句柄%s " % page_handles)
self.driver.switch_to_window(page_handles[1])
sleep(10)
print("切换后的句柄", self.driver.current_window_handle)
print("页面全部元素%s" % self.driver.page_source)
except Exception as e:
raise
照你这么描述,我和 1 楼一样也怀疑 androidProcess 不对,不然 page_source 怎么会包含发现页面的内容,建议还是检查一下被测小程序的进程是不是你写的那个,比如我这边小程序的进程就是 com.tencent.mm:appbrand0。
我都试过了,chromeOptions 配置的和 switch 的名称一样。还有我想问下,你们切换 webview 的时候,日志打印出来的进程名称有 appbrand 这种的?我这边只有一个 com.tencent.mm:tools 的。而且不论我换成哪个小程序的进程名,返回的进程名就只有一个 com.tencent.mm:tools。
而且我刚才就在微信首页试了下切换成 webview 的时候,打印出来的页面也是标题是搜一搜的。
想问下你是怎么确定进程一定是 com.tencent.mm:tools 的?
我的方法:
1.打开微信后执行 adb shell ps | grep tencent,打印出进程列表
2.打开小程序后再执行一遍 adb shell ps | grep tencent,然后看看多了哪些进程
3.最后执行 adb shell dumpsys activity top | grep ACTIVITY 看下当前进程,记录下 pid,然后和第二步多出来的进程做比较,存在交集的那个就是小程序的进程
我是直接打开小程序,然后执行第 3 步,返回的名称是 com.tencent.mm:appbrandxx,但是主要的问题是即使我设置了 chromeOptions 里面的进程名称为查询到的结果,在执行过程中实际返回的进程名就只有:com.tencent.mm:tools,webview:native_app 和 webview_com.tencent.mm:tools,没有返回其它的结果了。所以后续再执行 switch_to context 的时候如果填写的不是 webview_com.tencent.mm:tools 就会报错找不到对应的名称。
我后续再重新找个手机来试试,我自己测试的时候用的是小米,不知道和手机有关系没。
说明小程序进程就是 com.tencent.mm:appbrandxx。
建议清理下手机环境然后再试试,因为这问题我遇到过,小程序自动化一直用"com.tencent.mm:appbrand0"来切换 webview,突然有一天报错切换不了,并且发现 chrome://inspect/#devices 无法调试小程序的 webview(之前都好好的),最后清了下环境就可以了。