一. 获取webview的html页面

方法一:

1. 获取webview中对应的html页面

谷歌浏览器中输入地址:chrome://inspect(第一次使用要FQ)

前提:手机开启USB调试模式,并且用命令adb devices能够识别设备,app要打开webview页面

2. appium的日志中会显示当前系统的webdriver版本

3. 根据安卓系统的webview版本,去下载对应的chromedriver.exe

chromedriver下载地址:http://npm.taobao.org/mirrors/chromedriver

寻找webview版本39去对应的chromedriver.exe(上述网址中每个版本下都有一个notes.txt,这个文件列出了每个驱动对应的chrome版本),用下载好的chromedriver.exe取替换appium自带的chromedriver,路径是C:\Program Files (x86)\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win下的chromedriver.exe

4. 点击inpect

方法二:获取网页源码:driver.page_source 存成一个html页面再在浏览器里访问定位

方法二使用的前提也是要替换appium中的chromedriver.exe

思路一:保存后利用批处理调用chrome浏览器自动打开html

在D:\python_workshop\python6_appium\Common下新建一个get_pageSource_1.py,写入下列代码

from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy
import time, os

#由你主动来告诉appium server,我要操作哪个设备上的哪个app
#Desired Capabilities  键值对。键名已经定义好,不能随意更改
#操作对象 的信息准备
desires_caps = {}
#操作系统  -目标机
desires_caps["platformName"] = "Android"
#系统版本
desires_caps["platformVersion"] = "5.1.1"
#设备名字
desires_caps["deviceName"] = "Android Emulator"
#app信息
desires_caps["appPackage"] = "com.lemon.lemonban"
#首页
desires_caps["appActivity"] = "com.lemon.lemonban.WelcomeActivity"
#连接appium server,并告诉其要操作的对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desires_caps)

WebDriverWait(driver, 30, 1).until(EC.visibility_of_element_located((MobileBy.ID, "com.lemon.lemonban:id/tv_cancel")))
driver.find_element_by_id("com.lemon.lemonban:id/tv_cancel").click()

WebDriverWait(driver, 30, 1).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("全程班")')))
driver.find_element_by_android_uiautomator('new UiSelector().text("全程班")').click()

WebDriverWait(driver, 60, 0.1).until(EC.visibility_of_element_located((MobileBy.CLASS_NAME, "android.webkit.WebView")))

contexts = driver.contexts
driver.switch_to.context(contexts[-1])

html = driver.page_source
with open(os.path.split(os.path.abspath(__file__))[0] + "/source.html", "w+", encoding="utf-8") as fs:
    fs.write(html)

time.sleep(5)

在桌面新建一个批处理文件get_pageSource_1.bat,写入如下内容

python D:\python_workshop\python6_appium\Common\get_pageSource_1.py
start chrome.exe D:\python_workshop\python6_appium\Common\source.html
cmd /k

双击bat文件,立即运行,运行后的效果

补充:

1. get_pageSource_1.py和创建的html文件是同级目录

2. bat文件的作用是自动执行get_pageSource_1.py,并且调用chrome浏览器自动打开保存的source.html

3. bat文件中python后面跟的是get_pageSource_1.py的全路径,start chrome.exe后面跟的是source.html的全路径,cmd /k的作用是让cmd窗口一直保持打开状态

思路二:保存后利用chromedriver驱动浏览器自动打开html

在D:\python_workshop\python6_appium\Common下新建一个get_pageSource_2.py

import appium
import selenium
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy
import time, os

#由你主动来告诉appium server,我要操作哪个设备上的哪个app
#Desired Capabilities  键值对。键名已经定义好,不能随意更改
#操作对象 的信息准备
desires_caps = {}
#操作系统  -目标机
desires_caps["platformName"] = "Android"
#系统版本
desires_caps["platformVersion"] = "5.1.1"
#设备名字
desires_caps["deviceName"] = "Android Emulator"
#app信息
desires_caps["appPackage"] = "com.lemon.lemonban"
#首页
desires_caps["appActivity"] = "com.lemon.lemonban.WelcomeActivity"
#连接appium server,并告诉其要操作的对象
driver_a = appium.webdriver.Remote('http://127.0.0.1:4723/wd/hub',desires_caps)

WebDriverWait(driver_a, 30, 1).until(EC.visibility_of_element_located((MobileBy.ID, "com.lemon.lemonban:id/tv_cancel")))
driver_a.find_element_by_id("com.lemon.lemonban:id/tv_cancel").click()

WebDriverWait(driver_a, 30, 1).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("全程班")')))
driver_a.find_element_by_android_uiautomator('new UiSelector().text("全程班")').click()

WebDriverWait(driver_a, 60, 0.1).until(EC.visibility_of_element_located((MobileBy.CLASS_NAME, "android.webkit.WebView")))

contexts = driver_a.contexts
driver_a.switch_to.context(contexts[-1])

html = driver_a.page_source
with open(os.path.split(os.path.abspath(__file__))[0] + "/source.html", "w+", encoding="utf-8") as fs:
    fs.write(html)

time.sleep(5)

driver_s = selenium.webdriver.Chrome()
driver_s.maximize_window()
driver_s.get(os.path.split(os.path.abspath(__file__))[0] + "/source.html")

在桌面新建一个批处理文件get_pageSource_2.bat,写入如下内容

python D:\python_workshop\python6_appium\Common\get_pageSource_2.py
cmd /k

双击bat文件,立即运行,运行后的效果

个人更倾向于第一种方法,其实两种方法在打开html文件耗时方面差不多

方法三:找开发人员获取网页

二. 定位webview内的元素

三. 实例

打开app,点击webview内的收藏

from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy
import time, os

#由你主动来告诉appium server,我要操作哪个设备上的哪个app
#Desired Capabilities  键值对。键名已经定义好,不能随意更改
#操作对象 的信息准备
desires_caps = {}
#操作系统  -目标机
desires_caps["platformName"] = "Android"
#系统版本
desires_caps["platformVersion"] = "5.1.1"
#设备名字
desires_caps["deviceName"] = "Android Emulator"
#app信息
desires_caps["appPackage"] = "com.lemon.lemonban"
#首页
desires_caps["appActivity"] = "com.lemon.lemonban.WelcomeActivity"
#连接appium server,并告诉其要操作的对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desires_caps)

WebDriverWait(driver, 30, 1).until(EC.visibility_of_element_located((MobileBy.ID, "com.lemon.lemonban:id/tv_cancel")))
driver.find_element_by_id("com.lemon.lemonban:id/tv_cancel").click()

WebDriverWait(driver, 30, 1).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("全程班")')))
driver.find_element_by_android_uiautomator('new UiSelector().text("全程班")').click()

WebDriverWait(driver, 60, 0.1).until(EC.visibility_of_element_located((MobileBy.CLASS_NAME, "android.webkit.WebView")))

#获取所有的上下文并打印
contexts = driver.contexts
print(contexts)

#切换到webview
driver.switch_to.context(contexts[-1])

#收藏的定位表达式
collection_id = "js-bottom-fav"

#等待元素可见
WebDriverWait(driver, 30, 1).until(EC.visibility_of_element_located((MobileBy.ID, collection_id)))
#点击收藏(未登录会跳转到登录界面)
driver.find_element_by_id(collection_id).click()

#切换原生控件
driver.switch_to.context(None)

运行结果

D:\Program\python34\python.exe D:/python_workshop/python6_appium/Common/lemon_class.py
['NATIVE_APP', 'WEBVIEW_com.lemon.lemonban']

四. toast提示信息获取

要获取toast信息要满足以下两个要求:

1. appium版本1.6.3+才支持toast获取

而appium server 1.6.3没有可视化界面,解决方案:下载appium-desktop-Setup-1.4.1-ia32.exe

2. 代码中必须指定automationName为:UIAutomator2

3. UIAutomator2只支持安卓版本5.0+

夜神模拟器默认的安卓版本是4.4.2,可以在夜神多开器中创建并启动一个5.1.1的版本

4. 实例

注意:

1. desired_caps["automationName"] = "UiAutomator2"

2. 要求安装jdk 1.8 64位及以上,配置其环境变量JAVA_HOME和path

3. Android系统5.0以上

4. appium server版本1.6.3以上,由app server向设备上安装两个apk,会遇到超时等问题,如果一次运行失败,请关闭掉appium server重新再运行

5. 实际在运行时,发现判断元素可见的方法不能成功(0/3),而判断元素存在的方法是可以的(3/3)

from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy
from PageObjects.welcome_page import WelcomePage
from PageObjects.index_page import IndexPage
from PageObjects.login_page import LoginPage

#设备信息
desired_caps = {}
desired_caps["automationName"] = "UIAutomator2"
desired_caps["deviceName"] = "Android Emulator"
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "5.1.1"
desired_caps["appPackage"] = "com.xxzb.fenwoo"
desired_caps["appActivity"] = ".activity.addition.WelcomeActivity"
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

#滑屏
WelcomePage(driver).swipe_page()
#点击登录
IndexPage(driver).click_login()
#输入手机号
LoginPage(driver).input_phoneNumber(")

part_str = '验证码已经发送到手机'
xpath_locator = "//*[contains(@text, \'%s\')]" %part_str

try:
    WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located((MobileBy.XPATH, xpath_locator)))
except:
    #如果没找到,则打印
    print("toast错过了!")
else:
    text = driver.find_element_by_xpath(xpath_locator).text
    print(text)

运行结果:

验证码已经发送到手机号为138****1232,注意查收,验证码有效时间为60秒,验证码为7201

appium自动化测试(四)的更多相关文章

  1. Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)

    1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...

  2. Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)

    1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录. 2.业务模块封装 因为现在各种APP的层出不群 ...

  3. Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)

    1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...

  4. 你的第一个自动化测试:Appium 自动化测试

    前言: 这是让你掌握 App 自动化的文章 一.前期准备 本文版权归作者和博客园共有,原创作者:http://www.cnblogs.com/BenLam,未经作者同意必须在文章页面给出原文连接. 1 ...

  5. 全网最新方法:Win10下如何安装和搭建appium自动化测试环境

    为了方便大家,下面是本人安装和搭建appium所需要的软件,自取. 链接:https://pan.baidu.com/s/1wl5Xnos4BmnSZsBRd6B5YA#list/path=%2F  ...

  6. 全网最全最细的appium自动化测试环境搭建教程以及appium工作原理

    一.前言 ​ 对于appium自动化测试环境的搭建我相信90%的自学者都是在痛苦中挣扎,在挣扎中放弃,在放弃后又重新开始,只有10%的人,人品比较好,能够很快并顺利的搭建成功.appium 自动化测试 ...

  7. Appium自动化测试(1)-安装&环境

    需要链接appium自动化测试教程 http://www.cnblogs.com/fnng/p/4540731.htmlappium中文文档:https://github.com/appium/app ...

  8. C#_自动化测试 (四) 自动卸载软件

    在平常的测试工作中,经常要安装软件,卸载软件,  即繁琐又累.  安装和卸载完全可以做成自动化. 安装软件我们可以通过自动化框架,自动点击Next,来自动安装.  卸载软件我们可以通过msiexec命 ...

  9. Appium自动化测试3之获取apk包名和launcherActivity后续

    接着“Appium自动化测试3之获取apk包名和launcherActivity”章节介绍 测试脚本 1.测试脚本如下: # -*- coding:utf-8 -*- import os, time, ...

随机推荐

  1. CentOS7使用httpd apache 和firewalld打开关闭防火墙与端口

    Centos7 使用systemctl 工具操作命令 systemctl 是Centos7的服务管理工具中的主要工具 ,它融合之前service和chkconfig的功能于一体 一.httpd的设置 ...

  2. ZooKeeper分布式过程协同技术详解1——ZooKeeper的概念和基础

    简介 分布式系统和应用,不仅能提供更强的计算能力,还能为我们提供更好的容灾性和扩展性. ZooKeeper是Google的Chubby项目的开源实现,它曾经作为Hadoop的子项目,在大数据领域得到广 ...

  3. powerdesigner反转数据库的设计图

    PowerDesigner导入sql文件 1:点击 2:弹出该页面,点击确定 3:弹出一下页面,点击下面按钮选择文件 4:点击确定完成 二 .表转换为中文的执行脚本及步骤 执行脚本为:Option E ...

  4. HDU 3401 Trade(斜率优化dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 题意:有一个股市,现在有T天让你炒股,在第i天,买进股票的价格为APi,卖出股票的价格为BPi,同时最多买 ...

  5. github删除某个库repository

    1.登陆gihub网站,在该选中需要删除的repository,点击进去 2.删除repository 点击进去以后进入新的页面,拉到页面尾部,如图 然后弹出确认框,再输入需要删除的repositor ...

  6. 什么是 MIME TYPE?

    文章来源: http://baike.baidu.com/item/MIME https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_H ...

  7. django数据库的增、删、改、查

    1.增加 第一种:save 通过创建模型类对象,执行对象的save()方法保存到数据库中. 第二种:create 2.修改 3.查询 get 查询单一结果,如果不存在会抛出模型类.DoesNotExi ...

  8. Codeforces 961E - Tufurama

    961E - Tufurama 思路: 线段树或者分块 遍历 1 - n - 1,求 区间[i + 1, min(a[i], n)]大于等于 i 的个数,累加起来 线段树: #include<b ...

  9. Codeforces 934D - A Determined Cleanup

    934D - A Determined Cleanup 思路: 找规律,和k进制的求法差不多,答案的奇数位是p%k,偶数位如果p%k!=0,那么答案是k-p%k,否则为0. 代码: #include& ...

  10. 在linux中,我为什么不能安装VMware Tools?

    在linux中,我为什么不能安装VMware Tools? 应该是操作不正确导致,以下为linux安装VMware Tools的方法. 1.在安装Linux的虚拟机中,单击“虚拟机”菜单下的“安装Vm ...