使用 uc-devtools 代替 uiautomatorviewer 查找定位H5元素
由于uiautomatorviewer 只能定位APP原生页面;
所以要定位app H5 页面内的元素 使用 uc-devtools 工具
要调试的Android 设备上已安装UC浏览器(Android 开发者版):下载地址。
安装成功如如显示:
usb链接调试手机并打开要调试定位的H5 webview 页面
然后在chrome浏览器内 输入 chrome://inspect/
浏览器内出现H5页面后,点击 inspect 就会打开 uc-devtools 工具,选中元素根据css/xpath方式定位即可
driver 配置
需要指定 chromedriver 指定版本的路径;(下面时yaml格式的配置,直接使用请删除注释)
appActivity: com.kk.duoku.ui.activitys.MainActivity
appPackage: com.coolclub.dk
deviceName: 8BNGK17907000030
noReset: 'True'
platformName: Android
platformVersion: '9'
resetKeyboard: 'True'
unicodeKeyboard: 'True'
automationName: 'UiAutomator2'
# 是否显示chromedriver的日志
showChromedriverLog: 'False'
# H5元素定位必须
chromeOptions:
androidProcess: org.chromium.content.app.Sandb
# chromedriver对应版本的绝对路径
chromedriverExecutableDir: D:\soft_install\Appium-windows-1.21.0\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win
启动appium时 开启自动下载chromedriver命令:
上一步指定 chromedriverExecutableDir,然后按照下面的命令启动appiu server 。 这样就不用关注什么chrome驱动版本关系了,haha .
appium --allow-insecure chromedriver_autodownload
获取页面context
def base_get_contexts(self):
"""
获取当前所有 contexts
:return: list, 所有 contexts
"""
return self.driver.contexts
def base_get_current_context(self):
"""
返回当前页面的 context
:return: str, 当前页面的 context
"""
return self.driver.current_context
原生页面与H5页面的切换
def base_swith_to_content_by_index(self, index):
"""
根据driver.contexts下标,切换到指定的 content
:param index: contents列表角标
:return:
"""
self.driver.switch_to.context(self.base_get_contexts[index])
def base_swtich_to_content_by_context(self, context):
"""
切换到指定的 context
:param context: str格式,self.driver.contexts[1]
:return:
"""
self.driver.switch_to.context(context)
H5元素定位及操作
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
def base_click_location(self, x, y):
"""
点击指定坐标位置
:param x: x坐标
:param y: y坐标
:return:
"""
TouchAction(self.driver).press(x=x, y=y).release().perform()
time.sleep(1)
def base_clicks(self, index, arg):
"""
指定角标,点击多个元素内的某一个
:param args: 元素定位方式, (By, XPATH)
:param index: 角标
:return:
"""
elements = self.base_find_elements(arg)
elements[index].click()
time.sleep(1)
def base_get_h5_view_title(self, full_title):
"""
判断页面标题是否完全一致
:param title: 页面标题
:return: True/False
"""
return self.base_find_element_expected(expected_conditions.title_is(title=full_title))
def base_get_h5_view_contain_title(self, division_title):
"""
判断页面标题是否包含输入的标题
:param division_title: 输入的标题
:return: True/False
"""
return self.base_find_element_expected(expected_conditions.title_contains(title=division_title))
def base_get_h5_view_selected_to_not(self, element):
"""
判断指定元素是否被选中
:param element: 元素定位方式
:return: True/False
"""
return self.base_find_element_expected(expected_conditions.element_to_be_selected(element))
def base_get_h5_view_alerted(self):
"""
判断页面元素有没有 alert
:return: alert 元素对象
"""
return self.base_find_element_expected(expected_conditions.alert_is_present())
def base_get_h5_view_text_contain(self, arg, text):
"""
判断元素中的 text 是否包含指定的 text
:param arg: 定位元素方式
:param text: 包含的文案
:return:
"""
return self.base_find_element_expected(expected_conditions.text_to_be_present_in_element(arg, text))
def base_get_h5_view_attribute_text_contain(self, arg, text):
"""
判断某个元素的某个属性是否包含了指定了的 text
:param arg: 元素定位方式
:param text: 指定属性的 text
:return:
"""
return self.base_find_element_expected(expected_conditions.text_to_be_present_in_element_value(arg, text))
多个 webview页面切换
实现方式:切换窗口 handler
APP 内点击打开多个webview页面时,需要根据切换到指定的页面才能进行操作;如果不切换的话,操作的还是之前的页面。
# 获取所有的webview的handler(窗口句柄)
driver.window_handles
# 获取当前可操作的webview的handler (窗口句柄)
driver.current_handler
# 切换到指定/最新的handle窗口
driver.switch_to.window(driver.window_handles[-1])