大家都知道Appium 是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生的应用是指用android或ios的sdk编写的应用,移动网页应用是指网页应用,类似于ios中safari应用或者Chrome应用或者类浏览器的应用。混合应用是指一种包裹webview的应用,原生应用于网页内容交互性的应用。重要的是Appium是跨平台的,何为跨平台,意思就是可以针对不同的平台用一套api来编写测试用例
比如说在andorid app中有native hybrid webview的app,但是我们怎么做到在这些混合性的app中来定位元素呢?有些人肯定认为直接定位就可以,干嘛那边麻烦,好,我们先来试试看是否可以定位,我有个案例一起来验证下
我通过uiautomatorviewer.bat来定位元素可以看到
这个app是典型的hybrid (混合的app)
App主要的功能在这里解释下,里面包含java代码和js代码,如果没有这方面的基础的同学,不看也没有关系,当然能看懂尽量看懂,代码的含义我会解释
主要是实现在
1 native中输入参数,发送数据到webapp中,在发送到HTML按钮上的输入框中输入值,然后点击发送到HTML按钮,会在传到javaz中的值后面输入框中显示刚才输入的值。
2 逻辑恰恰相反,在webapp中输入值,传到nativeapp中。
但是实现该过程需要元素定位和控制才可以实现。
下面来看下python代码
我们先来实现第一步,native中的数据到 ---> webapp中
desired_caps = {}
desired_caps['platformName'] ='Android'
desired_caps['platformVersion'] ='4.4.2'
desired_caps['deviceName'] ='192.168.169.101:5555'
desired_caps['appPackage'] ='com.example.dengfengbo.android_webview'
desired_caps['appActivity'] ='.MainActivity'
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
#在native app中获取控件,然后发送数据给 webapp
driver.find_element_by_id("com.example.dengfengbo.android_webview:id/send_html_et").send_keys("a")
time.sleep(1)
driver.find_element_by_name("发送到htmL").click()
time.sleep(1)
driver.quit()
这个步骤是没有问题
接下来我们实现第二个步骤
webapp中的数据到 ---> native中
代码如下
desired_caps = {}
desired_caps['platformName'] ='Android'
desired_caps['platformVersion'] ='4.4.2'
desired_caps['deviceName'] ='192.168.169.101:5555'
desired_caps['appPackage'] ='com.example.dengfengbo.android_webview'
desired_caps['appActivity'] ='.MainActivity'
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
#在native app中获取控件,然后发送数据给 webapp
driver.find_element_by_id("com.example.dengfengbo.android_webview:id/send_html_et").send_keys("a")
time.sleep(1)
driver.find_element_by_name("发送到htmL").click()
time.sleep(1)
#在webapp 获取控件,然后发送数据给nativeapp
driver.find_element_by_id("demo").send_keys("b")
time.sleep(1)
driver.find_element_by_css_selector("body > input[type='button']:nth-child(3)").click()
time.sleep(1)
driver.quit()
然后我们来执行.py文件结果是
大致含义是没有找到定位元素,有些人认为可以找到,但事实说明不可以,这个是什么原因导致的呢?在appium中有个上下文操作的操作那么什么是上下文英文context,:
上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境。在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步、事务、实时激活、安全性等等。
又比如计算机技术中,相对于进程而言,上下文就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。
简单理解是环境,以上native,webapp是2个不同的环境,在当前环境才可以获取当前的元素,反之不行。
下面我们看在appium中提供哪些有关context 的操作
获取当前上下文
driver.current_context
获取当前所有的可用的上下文
driver.contexts
切换上下文
driver.switch_to.context()
要有该上下文才可以切换,不然会报错,所以一般用driver.contexts 获取
实现以上2个步骤,完整的代码如下:
desired_caps = {}
desired_caps['platformName'] ='Android'
desired_caps['platformVersion'] ='4.4.2'
desired_caps['deviceName'] ='192.168.169.101:5555'
desired_caps['appPackage'] ='com.example.dengfengbo.android_webview'
desired_caps['appActivity'] ='.MainActivity'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
#在native app中获取控件,然后发送数据给 webapp
driver.find_element_by_id("com.example.dengfengbo.android_webview:id/send_html_et").send_keys("a")
time.sleep(1)
driver.find_element_by_name("发送到htmL").click()
time.sleep(1)
print("当前环境",driver.current_context)
print(driver.contexts)
#切换环境
driver.switch_to.context('WEBVIEW_com.example.dengfengbo.android_webview')
#在webapp 获取控件,然后发送数据给nativeapp
driver.find_element_by_id("demo").send_keys("b")
time.sleep(1)
driver.find_element_by_css_selector("body > input[type='button']:nth-child(3)").click()
time.sleep(1)
driver.quit()
以上是我对上下文的理解,当然在javaweb种也会有这样的概念,希望对大家有帮忙。