Appium Android+Appium 点击 webview 当中的元素时,提示找不到元素

李瑶瑶 · December 04, 2019 · Last by YueC replied at December 06, 2019 · 1010 hits

问题描述:
我是Android手机,用inspector可以查看到webview当中的元素,然后我找到元素去操作点击时提示:selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

我想可能是没有切换context,但是我进去手机有webview的页面打印driver.contexts时,提示这个页面的contexts只有【native_app】,没有webview的context

所以想问一下大佬们,用inspector可以查看到webview里面的元素,但是操作不了,并且我的页面只有native_app,没有webview的context,怎么实现操作webview呢?我百度搜索说如果可以直接获取到webview的元素,就不用切换直接当做原生来操作,但是我试了xpath、text、name多种定位方式都不能找到元素

inspector截图:

共收到 18 条回复 时间 点赞
1Floor has been deleted
2Floor has been deleted

我pagesource也是可以打印webview中的元素的,但是driver.find_element就是一直提示找不到

李瑶瑶 回复

有没有 appium 的日志,能不能以代码块形式贴上来?

陈恒捷 回复

这是appium日志的报错:

[HTTP] {"using":"xpath","value":"//android.support.v4.view.ViewPager[1]/android.widget.RelativeLayout[1]/android.webkit.WebView[1]/android.webkit.WebView[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[2]/android.widget.ListView[1]/android.view.View[1]/android.widget.GridView[2]/android.view.View[1]/android.view.View[3]","sessionId":"d4433388-3306-4810-b75d-a22905514d93"}
[debug] [W3C (d4433388)] Calling AppiumDriver.findElement() with args: ["xpath","//android.support.v4.view.ViewPager[1]/android.widget.RelativeLayout[1]/android.webkit.WebView[1]/android.webkit.WebView[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[2]/android.widget.ListView[1]/android.view.View[1]/android.widget.GridView[2]/android.view.View[1]/android.view.View[3]","d4433388-3306-4810-b75d-a22905514d93"]
[debug] [BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, -android uiautomator
[debug] [BaseDriver] Waiting up to 0 ms for condition
[debug] [WD Proxy] Matched '/element' to command name 'findElement'
[debug] [WD Proxy] Proxying [POST /element] to [POST http://localhost:8257/wd/hub/session/56592bc2-90df-486a-b370-785de3a90a87/element] with body: {"strategy":"xpath","selector":"//android.support.v4.view.ViewPager[1]/android.widget.RelativeLayout[1]/android.webkit.WebView[1]/android.webkit.WebView[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[2]/android.widget.ListView[1]/android.view.View[1]/android.widget.GridView[2]/android.view.View[1]/android.view.View[3]","context":"","multiple":false}
[WD Proxy] Got an unexpected response: {"sessionId":"56592bc2-90df-486a-b370-785de3a90a87","status":7,"value":"An element could not be located on the page using the given search parameters."}
[debug] [MJSONWP] Matched JSONWP error code 7 to NoSuchElementError
[debug] [W3C (d4433388)] Encountered internal error running command: NoSuchElementError: An element could not be located on the page using the given search parameters.
[debug] [W3C (d4433388)] at AndroidUiautomator2Driver.findElOrEls (/usr/local/homebrew/lib/node_modules/appium/node_modules/appium-android-driver/lib/commands/find.js:75:11)
[debug] [W3C (d4433388)] at <anonymous>
[HTTP] <-- POST /wd/hub/session/d4433388-3306-4810-b75d-a22905514d93/element 404 635 ms - 416
[HTTP]


这个是控制台的报错:

Traceback (most recent call last):
File "/Users/liyaoyao/Documents/basebbs-all-autotest/iOSAutoTest/iOSAppiumTest/Android.py", line 26, in <module>
browser.find_element_by_xpath("//android.support.v4.view.ViewPager[1]/android.widget.RelativeLayout[1]/android.webkit.WebView[1]/android.webkit.WebView[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[2]/android.widget.ListView[1]/android.view.View[1]/android.widget.GridView[2]/android.view.View[1]/android.view.View[3]").click()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/appium/webdriver/webdriver.py", line 258, in find_element
'value': value})['value']
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/appium/webdriver/errorhandler.py", line 29, in check_response
raise wde
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/appium/webdriver/errorhandler.py", line 24, in check_response
super(MobileErrorHandler, self).check_response(response)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

有没有大佬来帮帮我

find_element查找元素前,调用pagesource方法看下页面一致性,适当的使用WebDriverWait(driver, 20).until是可以确保页面一致性的

ltyd5788 回复

pagesource打印是能找到元素的,我用WebDriverWait试了也是报错,提示找不到元素

看看非WebView页面使用xpath可以定位到元素么,还有当前页面的其他元素试试看能定位到元素么。"查找元素前,调用pagesource方法看下页面一致性" 这里贴出日志提示会更好

ltyd5788 回复

当前页面其他非webview可以用xpath定位,就是webview上的元素不能点击,坐标点击也不能点击,就是对webview上的元素操作不了,打印上下文contexts就只有native_app,没有webview相关

desired capability 设置autoWebview 属性为 true看看

ltyd5788 回复

加了之后启动报错:selenium.common.exceptions.WebDriverException: Message: No such context found.,可以加下您QQ或者微信问您吗

Author only

想办法设置让appium采用espresso来识别控件,这种技术需要提供签名,找一下相关的设置

Android 的话 问开发有没有打开 Android webview debug 模式,不然好像切换不到webview

看了下日志,没见到啥非常有效的线索,只知道在 AndroidUiautomator2Driver.findElOrEls 抛了异常。但它具体转换成了什么 uiautomator 之类的原生框架操作语句不大清楚,不好定位。再深究得周末抽时间看源码了。

用inspector可以查看到webview里面的元素,但是操作不了

这句话有点好奇,inspector 操作不了这个可以具体说下是什么情况吗?你是做了什么动作,所以产生操作不了这个结论?

陈恒捷 回复

就是用app-inspector看UI树状图,可以直接看到定位到webview的元素,但是我用appium启动找不到这个元素,提示我遇到的这个错误,xpath、text、坐标点击都用到了,就是不能在这个webview上用appium来进行操作

先试试 chrome inpect 是否能调试 Android webView,用 chrome 拾取元素标记。如不能调试多半是开发没有开启 APP webView 调试权限
webView.setWebContentsDebuggingEnabled(true);
要是没开的话,你切不到 webview 也操作不了。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up