怎么在vk网站上做推广,ztouchs网站查询,网络运维工程师面试题,网站首页代码模板一、基本操作 
1、点击操作 
示例#xff1a;element.click() 针对元素进行点击操作 
2、初始化#xff1a;输入中文的处理 
说明#xff1a;如果连接的是虚拟机#xff08;真机无需加这两个参数#xff0c;加上可能会影响手工输入#xff09;#xff0c;在初始化配置中…一、基本操作 
1、点击操作 
示例element.click() 针对元素进行点击操作 
2、初始化输入中文的处理 
说明如果连接的是虚拟机真机无需加这两个参数加上可能会影响手工输入在初始化配置中增加两个参数: 
resetKeyboard: True, # 重置设备的输入键盘unicodeKeyboard: True # 采用unicode编码输入 
resetKeyboard: True,        # 重置设备的输入键盘
unicodeKeyboard: True        # 采用unicode编码输入 
3、清空和输入操作 
element.clear()   针对元素进行清空操作element.send_keys(value)    针对元素进行输入操作 
输入的封装 
def input_text(element, text):# 清除元素中的文本内容为了保证代码的健壮性在输入内容之前需要做一次清除操作。element.clear()# 输入文本内容element.send_keys(text) 4、获取元素的信息 
获取元素的文本内容(获取的是元素text属性的内容) element.text获取元素的位置 element.location  返回的值是一个字典字典中包含x和y  x和y表示的是元素在手机屏幕左上角的点的坐标获取取元素的大小 element.size     返回值是一个字典字典中会包含 width和height width表示的宽度height表示的高度获取元素的属性值 element.get_attribute(attribute)  # attribute表示的是属性名称 获取ID值时  attribute  “resourceId” 获取的是class的值 ,   attributeclassName 如果attribute  name时获取的是text或者content-desctext优先找不到text值再去找content-desc的值 
代码示例 import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作resetKeyboard: True,  # 重置设备的输入键盘unicodeKeyboard: True  # 采用unicode编码输入}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return element# 定义一个输入的封装方法
def input_text(element, text):# 清除元素中的文本内容为了保证代码的健壮性在输入内容之前需要做一次清除操作。element.clear()# 输入文本内容element.send_keys(text)if __name__  __main__:# 本次启动的应用程序包名和活动名(作业帮)app_package_zyb  com.baidu.homeworkapp_activity_zyb  .activity.index.IndexActivity# 启动应用程序driver_zyb  start_app(app_package_zyb, app_activity_zyb)# 定位到首页顶部搜索框并点击element  (By.ID, com.baidu.homework:id/tv_homepage_search_item)search_element  get_element_new(driver_zyb, element)search_element.click()# 定位到输入框并输入英语学习element  (By.ID, com.baidu.homework:id/index_search_et_search_text)input_element  get_element_new(driver_zyb, element)input_text(input_element, 英语学习)# 获取元素的文本内容(获取的是元素text属性的内容)print(f输入框元素的文本信息是: {input_element.text})# 获取元素的位置(返回的值是一个字典字典中包含x和y  x和y表示的是元素在手机屏幕左上角的点的坐标)print(f输入框的元素的位置坐标是: {input_element.location})# 获取取元素的大小print(f输入框元素的文本信息是: {input_element.size})获取元素的属性值element.get_attribute(attribute)  # attribute表示的是属性名称获取ID值时  attribute   “resourceId”获取的是class的值, attribute  className如果attribute  name时获取的是text或者content - desctext优先找不到text值再去找content - desc的值print(f输入框元素的ID属性信息是: {input_element.get_attribute(resourceId)})print(f输入框元素的class属性信息是: {input_element.get_attribute(className)})print(f输入框元素的name属性信息是: {input_element.get_attribute(name)})# 关闭驱动time.sleep(3)print(代码执行完毕)driver_zyb.quit()二、获取手机操作 
1、获取手机分辨率 
目的保证脚本在不同机型上都能实现滑屏的操作。 
示例driver.get_window_size()     
说明 返回的值是字典类型 包含 height 和 width  高度和宽度的值 2、获取手机截图 
示例driver.get_screenshot_as_file(filename) 
说明filename1、路径必须手动创建  2、文件名称必须是以PNG结尾 3、设置/获取手机网络 
目的主要是为了实现视频类的app中视频播放过程中网络切换时会有提示信息的操作。 
示例 
driver.set_network_connection(connectionType)   #  connectionType   网络类型的值driver.network_connection 获取手机网络 
说明在 Appium 中网络类型通过driver.set_network_connection(connection type)方法进行设置。其中connection type参数表示需要被设置的网络类型常用的网络类型有以下几种 
飞行模式1WiFi 流量2数据流量4数据和 WiFi 全部打开6 4、模拟键盘操作 
示例driver.press_keycode(键值) 
说明常用的三个键值 3 HOME键 4 返回键 ,  66 回车键 5、手机通知栏操作 
示例driver.open_notifications() import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作resetKeyboard: True,  # 重置设备的输入键盘unicodeKeyboard: True  # 采用unicode编码输入}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return element# 定义一个输入的封装方法
def input_text(element, text):# 清除元素中的文本内容为了保证代码的健壮性在输入内容之前需要做一次清除操作。element.clear()# 输入文本内容element.send_keys(text)if __name__  __main__:# 本次启动的应用程序包名和活动名作业帮app_package_zyb  com.baidu.homeworkapp_activity_zyb  .activity.index.IndexActivity# 启动应用程序driver_zyb  start_app(app_package_zyb, app_activity_zyb)# 获取手机分辨率print(driver_zyb.get_window_size())# 获取手机截图 1、路径必须手动创建2、文件名称必须是以PNG结尾current_time_file  /errorstr(time.time())  # 通过文件名拼接当前时间戳的方式构造唯一文件名filename  /Users/work_related/image  current_time_file  .png # 需要设置正确的路径driver_zyb.get_screenshot_as_file(filename)# 设置手机网络为Wi-Fi然后获取当前手机的网络类型飞行模式1WiFi 流量2数据流量4数据和 WiFi 全部打开6driver_zyb.set_network_connection(2)   # 设置手机网络为Wi-Fiprint(f当前手机的网络类型是{driver_zyb.network_connection})  # 获取当前手机的网络类型# 模拟键盘操作常用的三个键值 3 HOME键 4 返回键 ,  66 回车键# 定位到首页顶部搜索框并点击element  (By.ID, com.baidu.homework:id/tv_homepage_search_item)search_element  get_element_new(driver_zyb, element)search_element.click()# 定位到输入框并输入英语学习element  (By.ID, com.baidu.homework:id/index_search_et_search_text)input_element  get_element_new(driver_zyb, element)input_text(input_element, 英语学习)# 返回到上一页driver_zyb.press_keycode(4)time.sleep(3)# home键返回driver_zyb.press_keycode(3)time.sleep(3)# 打开手机通知栏driver_zyb.open_notifications()# 关闭驱动time.sleep(3)print(代码执行完毕)driver_zyb.quit() 三、滑动和拖拽事件 
1、swipe滑动事件 
示例driver.swipe(startx, starty,  endx, endy, durationNone) 
说明duration用来降低滑屏的速度及惯性, 单位是ms 
2、swipe滑动事件封装 # 定义一个封装滑屏操作的方法
def slide_screen(driver, direction, count1):w  driver.get_window_size()[width]  # 获取手机屏幕的宽度h  driver.get_window_size()[height] # 获取手机屏幕的高度# w1080  h1920if direction  up:  # 往上滑zb  (w/2, h*0.9, w/2, h*0.1)elif direction  down:  # 往下滑zb  (w/2, h*0.1, w/2, h*0.9)elif direction  left:  # 往左滑zb  (w*0.9, h/2, w*0.1, h/2)elif direction  right:   # 往右滑zb  (w*0.1, h/2, w*0.9, h/2)else:print(无法识别滑动方向请重新输入)for i in range(count):driver.swipe(*zb, duration1200)time.sleep(1) 3、swipe边滑动边查找封装 
目的针对频道类的元素进行滑动选择对应的频道。 # 封装一个边滑动边查找的方法
def search_while_sliding(driver, element, element_info):ele_size  element.size  # 获取元素大小width  ele_size[width]  # 获取元素的宽度height  ele_size[height]  # 获取元素的高度# 获了element元素左上角点的坐标ele_position  element.locationx  ele_position[x]  # 获取左上角点的x坐标值y  ele_position[y]  # 获取左上角点的y坐标值start_x  x  width*0.9  # 获取的是起始点X的值y  y  height*0.5  # 获取的是起始及终止点的Y的值end_x  x  width*0.1   # 获取的是终止点X的值while True:page  driver.page_source  # 记录查找前的页面资源,通过对比页面资源来退出死循环try:driver.find_element(*element_info).click()  # 如果有找到对应的元素那么点击并返回return Trueexcept Exception as e:print(没有找到该元素)driver.swipe(start_x, y, end_x, y, duration1000)  # 没有找到元素那么滑屏后再对比并重新查找time.sleep(1)if page  driver.page_source:print(滑屏操作完成且没有找到元素信息)return False 
上述代码实现逻辑解释 
while True创建一个无限循环。page  driver.page_source记录查找前的页面资源用于后续对比以判断是否退出循环。driver.find_element(*element_info).click()尝试查找并点击指定元素如果找到则返回True。except Exception as e如果没有找到元素打印提示信息。driver.swipe(start_x, y, end_x, y, duration1000)没有找到元素时执行滑屏操作。time.sleep(1)等待一段时间。if page  driver.page_source如果滑屏操作完成后页面资源没有变化说明没有找到元素打印相关提示并返回False。 
4、scroll滑动事件 
示例driver.scroll(source_element,  target_element) 
说明scroll是通过元素来进行滑动的 
source_element表示原元素target_element表示目标元素滑动原理是由原元素拖动到目标元素的位置scroll无法设置滑动的持续时间带有一定惯性。 主要用于IOS中android高版本系统可以使用。 import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作resetKeyboard: True,  # 重置设备的输入键盘unicodeKeyboard: True  # 采用unicode编码输入}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return elementif __name__  __main__:# 本次启动的应用程序包名和活动名作业帮app_package_zyb  com.baidu.homeworkapp_activity_zyb  .activity.index.IndexActivity# 启动应用程序driver_zyb  start_app(app_package_zyb, app_activity_zyb)# 进入「我的」tabmy_tab  (By.XPATH, //android.widget.RelativeLayout[resource-idcom.baidu.homework:id/tab_my_layout])get_element_new(driver_zyb, my_tab).click()# 找到「我的活动」元素My_activities  (By.XPATH, //android.widget.TextView[resource-idcom.baidu.homework:id/user_item_title and text我的活动])my_activities  get_element_new(driver_zyb, My_activities)# 找到「我的订单」元素my_order  (By.ID, com.baidu.homework:id/user_item_title)my_order_element  get_element_new(driver_zyb, my_order)# 滑动driver_zyb.scroll(my_activities, my_order_element)# 关闭驱动time.sleep(3)print(代码执行完毕)driver_zyb.quit()5、drag_and_drop拖拽事件 
原理从一个元素滑动到另外一个元素的位置 同时也能实现将一个元素拖动另一个元素当中。 
示例driver.drag_and_drop(source_element,  target_element) 
说明 
source_element 表示的是被拖动的元素对象target_element 表示的是目标元素对象 import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作# resetKeyboard: True,  # 重置设备的输入键盘 连接虚拟机时使用# unicodeKeyboard: True  # 采用unicode编码输入连接虚拟机时使用}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return elementif __name__  __main__:# 本次启动的应用程序包名和活动名作业帮app_package_zyb  com.baidu.homeworkapp_activity_zyb  .activity.index.IndexActivity# 启动应用程序driver_zyb  start_app(app_package_zyb, app_activity_zyb)# 进入「我的」tabmy_tab  (By.XPATH, //android.widget.RelativeLayout[resource-idcom.baidu.homework:id/tab_my_layout])get_element_new(driver_zyb, my_tab).click()# 找到「我的活动」元素My_activities  (By.XPATH, //android.widget.TextView[resource-idcom.baidu.homework:id/user_item_title and text我的活动])my_activities  get_element_new(driver_zyb, My_activities)# 找到「我的订单」元素my_order  (By.ID, com.baidu.homework:id/user_item_title)my_order_element  get_element_new(driver_zyb, my_order)# 通过拖动来实现滑屏操作driver_zyb.drag_and_drop(my_activities,  my_order_element)# 关闭驱动time.sleep(3)print(代码执行完毕)driver_zyb.quit() 四、高级手势操作 
实现步骤 
1、创建TouchAction对象 
2、调用手势方法 
3、调用perform() 执行操作 
1、轻敲操作 
示例说明 
action  TouchAction(driver)  #  创建建手势对象action.tap(elementNone, xNone, yNone count1)  # 调用轻敲手势方法传入的是一个元素对象或者是一个坐标点 count表示的是轻敲的次数 默认值为1.action.perform() # 调用perform()执行轻敲操作 2、按下和抬起操作 
示例说明 
按下press(element, x, y)抬起release()TouchAction(driver).press(elementNone, xNone, yNone).release().perform() 
点击原理按下和抬起可以结合起来使用达到点击的效果 3、等待操作 
说明模拟手指等待。 wait(ms0)   ms表示的是毫秒数 
示例TouchAction(driver).press(elementNone, xNone, yNone).wait(3000).release().perform() 
长按原理通过等待及按下和抬起实现长按的操作 4、长按操作 
示例long_press(element, xNone, yNone,  duration1000) 
说明 
element表示的是元素对象x y表示的是坐标点duration表示的是长按的时长单位是毫秒 
实现 
TouchAction(driver).long_press(elementNone, xNone, yNone, duration1000).perform() 5、移动操作 
原理模拟手指在手机屏幕上移动的过程此种方式可以实现手势验证码的解锁把所有的点都连接起来 
示例 
TouchAction(driver).press(elementNone, xNone, yNone).wait(500).move_to(elementNone, xNone, yNone).wait(500)
.move_to(elementNone, xNone, yNone).release().perform() 
说明 
move_to(elementNone, xNone, yNone)  element表示的是元素对象 x和y表示的是坐标点。二选其一。移动的操作是需要结合press和release一起使用。 
6、代码示例 
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作# resetKeyboard: True,  # 重置设备的输入键盘 连接虚拟机时使用# unicodeKeyboard: True  # 采用unicode编码输入连接虚拟机时使用}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return elementif __name__  __main__:# 本次启动的应用程序包名和活动名本机设置页面app_package  com.android.settingsapp_activity  .HWSettings# 启动应用程序driver  start_app(app_package, app_activity)一、通过轻敲「WLAN」元素的方式进入WLAN设置页面action.tap(elementNone, xNone, yNone count1).perform()wlan  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and textWLAN])wlan_btn  get_element_new(driver, wlan)TouchAction(driver).tap(wlan_btn).perform()二、通过「按下和抬起」的方式点击「更多WLAN设置」TouchAction(driver).press(elementNone, xNone, yNone).release().perform()more_wlan  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and text更多 WLAN 设置])more_wlan_btn  get_element_new(driver, more_wlan)TouchAction(driver).press(more_wlan_btn).release().perform()# 返回上一页面time.sleep(1)driver.press_keycode(4)time.sleep(2)三、定位到Wi-Fi列表通过「等待及按下和抬起」实现长按展开删除网络/修改网络选项TouchAction(driver).press(elementNone, xNone, yNone).wait(3000).release().perform()wlan_list  (By.XPATH, //android.widget.FrameLayout[resource-idcom.android.settings:id/drop_down_refresh_container]/android.view.View)wlan_list_1  get_element_new(driver, wlan_list)TouchAction(driver).press(wlan_list_1).wait(3000).release().perform()# 返回time.sleep(1)driver.press_keycode(4)time.sleep(3)四、定位到Wi-Fi列表通过长按展开删除网络/修改网络选项TouchAction(driver).long_press(elementNone, xNone, yNone, duration1000).perform()wlan_list  (By.XPATH, //android.widget.FrameLayout[resource-idcom.android.settings:id/drop_down_refresh_container]/android.view.View)wlan_list_1  get_element_new(driver, wlan_list)TouchAction(driver).long_press(wlan_list_1, duration3000).perform()# 返回time.sleep(2)driver.press_keycode(4)五、通过move_to(element, xx, yy) 从一个元素移动到另一个元素此种方式可以实现手势验证码的解锁把所有的点都连接起来TouchAction(driver).press(elementNone, xNone, yNone).wait(500).move_to(elementNone, xNone, yNone).wait(500).move_to(elementNone, xNone, yNone).release().perform()下图示例只为演示效果# 返回到设置页面time.sleep(2)driver.press_keycode(4)# 找到「更多连接」元素信息more_connections  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and text更多连接])more_connections_btn  get_element_new(driver, more_connections)# 由「更多连接」元素移动到「WLAN」元素位置实际工作中可以通过此种方式实现点到点的连接完成手势验证码的解锁TouchAction(driver).press(more_connections_btn).wait(500).move_to(wlan_btn).release().perform()# 关闭驱动time.sleep(3)print(代码执行完毕)driver.quit() 
五、toast操作 
Toast是Android中用来显示显示信息的一种机制Toast的特点是没有焦点而且显示的时间有限过一定的时间就会自动消失。 
定位方法 
初始化配置中需要增加一个配置项automationName: UiAutomator2toast 通用的class属性获取通过xpath的方式//*[classandroid.widget.Toast]   
方法封装 
def get_toast(driver, timeout3, poll_frequency0.5):try:toast_loc  (xpath, //*[classandroid.widget.Toast])WebDriverWait(driver, timeout, poll_frequency).until(es.presence_of_element_located(toast_loc))toast_text  driver.find_element(By.XPATH, //*[classandroid.widget.Toast]).textreturn toast_textexcept:return None代码示例 
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as es# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作# resetKeyboard: True,  # 重置设备的输入键盘 连接虚拟机时使用# unicodeKeyboard: True  # 采用unicode编码输入连接虚拟机时使用automationName: UiAutomator2  # 获取toast信息需要使用}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(es.visibility_of_element_located(element))return element# 定义一个封装滑屏操作的方法
def slide_screen(driver, direction, count1):w  driver.get_window_size()[width]  # 获取手机屏幕的宽度h  driver.get_window_size()[height] # 获取手机屏幕的高度# w1080  h1920if direction  up:  # 往上滑zb  (w/2, h*0.9, w/2, h*0.1)elif direction  down:  # 往下滑zb  (w/2, h*0.1, w/2, h*0.9)elif direction  left:  # 往左滑zb  (w*0.9, h/2, w*0.1, h/2)elif direction  right:   # 往右滑zb  (w*0.1, h/2, w*0.9, h/2)else:print(无法识别滑动方向请重新输入)for i in range(count):driver.swipe(*zb, duration1200)time.sleep(1)# 定义一个获取toast的方法
def get_toast(driver, timeout3, poll_frequency0.5):try:toast_loc  (xpath, //*[classandroid.widget.Toast])WebDriverWait(driver, timeout, poll_frequency).until(es.presence_of_element_located(toast_loc))toast_text  driver.find_element(By.XPATH, //*[classandroid.widget.Toast]).textreturn toast_textexcept:return Noneif __name__  __main__:# 本次启动的应用程序包名和活动名本机设置页面app_package  com.android.settingsapp_activity  .HWSettings# 启动应用程序driver  start_app(app_package, app_activity)# 向上滑动页面两次到页面底部slide_screen(driver, up, 2)time.sleep(2)# 找到「关于本机」按钮并点击about_this_machine  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and text关于手机])get_element_new(driver, about_this_machine).click()# 获取版本号元素信息并点击for循环进行多次点击version  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and textHarmonyOS 版本])version_btn  get_element_new(driver, version)for i in range(1, 6):if i  6:version_btn.click()i  1# 获取toast提示信息并打印# toast_text  driver.find_element(By.XPATH, //*[class\android.widget.Toast\]).text# print(ftoast提示信息是{toast_text})toast_text  get_toast(driver)print(toast_text)# 关闭驱动time.sleep(3)print(代码执行完毕)driver.quit() 方法二如果上述方法无法实现获取toast信息可以通过截图记录toast信息 
代码示例如下 
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作# resetKeyboard: True,  # 重置设备的输入键盘 连接虚拟机时使用# unicodeKeyboard: True  # 采用unicode编码输入连接虚拟机时使用automationName: Uiautomator2}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return element# 定义一个封装滑屏操作的方法
def slide_screen(driver, direction, count1):w  driver.get_window_size()[width]  # 获取手机屏幕的宽度h  driver.get_window_size()[height] # 获取手机屏幕的高度# w1080  h1920if direction  up:  # 往上滑zb  (w/2, h*0.9, w/2, h*0.1)elif direction  down:  # 往下滑zb  (w/2, h*0.1, w/2, h*0.9)elif direction  left:  # 往左滑zb  (w*0.9, h/2, w*0.1, h/2)elif direction  right:   # 往右滑zb  (w*0.1, h/2, w*0.9, h/2)else:print(无法识别滑动方向请重新输入)for i in range(count):driver.swipe(*zb, duration1200)time.sleep(1)if __name__  __main__:# 本次启动的应用程序包名和活动名本机设置页面app_package  com.android.settingsapp_activity  .HWSettings# 启动应用程序driver  start_app(app_package, app_activity)# 向上滑动页面两次到页面底部slide_screen(driver, up, 2)time.sleep(2)# 找到「关于本机」按钮并点击about_this_machine  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and text关于手机])get_element_new(driver, about_this_machine).click()# 获取版本号元素信息并点击for循环进行多次点击version  (By.XPATH, //android.widget.TextView[resource-idandroid:id/title and textHarmonyOS 版本])version_btn  get_element_new(driver, version)for i in range(1, 6):if i  6:version_btn.click()i  1# 获取toast信息截图# 获取手机截图 1、路径必须手动创建2、文件名称必须是以PNG结尾current_time_file  /error  str(time.time())  # 通过文件名拼接当前时间戳的方式构造唯一文件名filename  /替换成自己正确的路径  current_time_file  .pngtime.sleep(0.5)driver.get_screenshot_as_file(filename) # 获取toast信息截图# 关闭驱动time.sleep(3)print(代码执行完毕)driver.quit() 六、webview操作(H5) 
说明Appium Inspector 可以对 H5 页面元素直接进行操作。在操作混合 App 或 Android App 的 H5 页面时常常需要定位 H5 页面中的元素传统方式需要使用Chrome://inspect 来定位元素环境准备相当繁琐需要Android 设备安装 Google 框架以及手机版 Chrome 浏览器以及相应的 chromedriver。而使用 Appium Inspector 即可实现 H5 页面元素的定位不需要额外安装任何软件。 
示例 
如下图包含原生和H5页面混合APP[NATIVE_APP, WEBVIEW_com.huawei.browser]可以通过Appium Inspector轻松实现定位操作 代码示例 
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法
def start_app(app_package, app_activity):# 定义desired_caps 字典初始化app的配置信息desired_caps  {platformName: android,  # 表示的是androidplatformVersion: 10,  # 表示的是设备系统的版本号deviceName: DWV6R19A10002101,  # 表示的是设备的ID名称标识测试设备appPackage: app_package,  # 表示的是app的包名appActivity: app_activity,  # 表示的是app的界面名newCommandTimeout: 100000,noReset: True,  # 用来记住app的session如果有登陆或做过初始化的操作为True时后面不需要再操作# resetKeyboard: True,  # 重置设备的输入键盘 连接虚拟机时使用# unicodeKeyboard: True  # 采用unicode编码输入连接虚拟机时使用}# 创建 Appium 驱动实例options  UiAutomator2Options().load_capabilities(desired_caps)driver  webdriver.Remote(http://localhost:4723/wd/hub, optionsoptions)# 启动应用程序driver.wait_activity(desired_caps, 5)return driver# 定义一个获取元素的方法
def get_element_new(driver, element):element  WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))return elementif __name__  __main__:# 本次启动的应用程序包名和活动名本机设置页面app_package  com.baidu.homeworkapp_activity  .activity.index.IndexActivity# 启动应用程序driver  start_app(app_package, app_activity)# 定位h5页面中的一个元素并点击h5_xpath  By.XPATH, (//android.widget.ImageView[resource-idcom.baidu.homework:id/image])[1]get_element_new(driver, h5_xpath).click()# 这里可以获取下上下文可以发现这里包含原生和H5页面混合APP[NATIVE_APP, WEBVIEW_com.huawei.browser]contexts  driver.contextsprint(contexts)# 定位h5页面中的另一个元素并点击h5_  By.XPATH, (//android.widget.Image[textzyb_e7dd291daa70ff318315b0b5dcc59989])[1]get_element_new(driver, h5_).click()# 关闭驱动time.sleep(3)print(代码执行完毕)driver.quit() 文章转载自: http://www.morning.qbrs.cn.gov.cn.qbrs.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.qqnp.cn.gov.cn.qqnp.cn http://www.morning.pwwjs.cn.gov.cn.pwwjs.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.rknjx.cn.gov.cn.rknjx.cn http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.snlxb.cn.gov.cn.snlxb.cn http://www.morning.gmgyt.cn.gov.cn.gmgyt.cn http://www.morning.kyytt.cn.gov.cn.kyytt.cn http://www.morning.xqgfy.cn.gov.cn.xqgfy.cn http://www.morning.lmpfk.cn.gov.cn.lmpfk.cn http://www.morning.nqrdx.cn.gov.cn.nqrdx.cn http://www.morning.lswgs.cn.gov.cn.lswgs.cn http://www.morning.nlryq.cn.gov.cn.nlryq.cn http://www.morning.zrdhd.cn.gov.cn.zrdhd.cn http://www.morning.lqlfj.cn.gov.cn.lqlfj.cn http://www.morning.fnlnp.cn.gov.cn.fnlnp.cn http://www.morning.nqmkr.cn.gov.cn.nqmkr.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.qpsdq.cn.gov.cn.qpsdq.cn http://www.morning.hhmfp.cn.gov.cn.hhmfp.cn http://www.morning.klyyd.cn.gov.cn.klyyd.cn http://www.morning.rwwdp.cn.gov.cn.rwwdp.cn http://www.morning.xjqhh.cn.gov.cn.xjqhh.cn http://www.morning.jhwqp.cn.gov.cn.jhwqp.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.hbywj.cn.gov.cn.hbywj.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.zcfmb.cn.gov.cn.zcfmb.cn http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn http://www.morning.qddtd.cn.gov.cn.qddtd.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.pyncm.cn.gov.cn.pyncm.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.srgbr.cn.gov.cn.srgbr.cn http://www.morning.fkmrj.cn.gov.cn.fkmrj.cn http://www.morning.lqjlg.cn.gov.cn.lqjlg.cn http://www.morning.dhqg.cn.gov.cn.dhqg.cn http://www.morning.rhkgz.cn.gov.cn.rhkgz.cn http://www.morning.ishoufeipin.cn.gov.cn.ishoufeipin.cn http://www.morning.yzktr.cn.gov.cn.yzktr.cn http://www.morning.ryztl.cn.gov.cn.ryztl.cn http://www.morning.mwzt.cn.gov.cn.mwzt.cn http://www.morning.nnwnl.cn.gov.cn.nnwnl.cn http://www.morning.gcjhh.cn.gov.cn.gcjhh.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.rbnp.cn.gov.cn.rbnp.cn http://www.morning.bnlkc.cn.gov.cn.bnlkc.cn http://www.morning.wpwyx.cn.gov.cn.wpwyx.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.wnhml.cn.gov.cn.wnhml.cn http://www.morning.qynnw.cn.gov.cn.qynnw.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.zgqysw.cn.gov.cn.zgqysw.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.lyrgp.cn.gov.cn.lyrgp.cn http://www.morning.rpljf.cn.gov.cn.rpljf.cn http://www.morning.kszkm.cn.gov.cn.kszkm.cn http://www.morning.wfqcs.cn.gov.cn.wfqcs.cn http://www.morning.ngcw.cn.gov.cn.ngcw.cn http://www.morning.nstml.cn.gov.cn.nstml.cn http://www.morning.qnhpq.cn.gov.cn.qnhpq.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.lwzgn.cn.gov.cn.lwzgn.cn http://www.morning.gsjzs.cn.gov.cn.gsjzs.cn http://www.morning.krhkb.cn.gov.cn.krhkb.cn http://www.morning.ccyns.cn.gov.cn.ccyns.cn http://www.morning.psxwc.cn.gov.cn.psxwc.cn http://www.morning.trrd.cn.gov.cn.trrd.cn http://www.morning.yrxcn.cn.gov.cn.yrxcn.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.jwdys.cn.gov.cn.jwdys.cn http://www.morning.hmmtx.cn.gov.cn.hmmtx.cn http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn http://www.morning.qnxzx.cn.gov.cn.qnxzx.cn http://www.morning.gybnk.cn.gov.cn.gybnk.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.nbrdx.cn.gov.cn.nbrdx.cn