Appium native hybrid webview混合操作及元素定位(14)

来源:互联网 发布:论文写作的意义 知乎 编辑:程序博客网 时间:2024/06/06 12:57

大家都知道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种也会有这样的概念,希望对大家有帮忙。