1.关于H5页面定位的问题?

混合(Hybrid)应用


通俗的讲:Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app

一部分是原生的界面和代码,而另一部分是内嵌网页 比如微信,支付宝 内嵌了一个浏览器内核,有浏览器内核实现的
安卓应用中的内嵌的展示网页内容的模板,我们称之为webview
如果要对WebView进行自动化,需要开发人员对App进行重新编译,修改下代码一下才能可以:


Webview 调试模式开启(开发搞)

对webview对象加入setWebContentsDebuggingEnabled的调用 ,每个WebView都要加,通常只有一个webview

protected void onCreate(Bund1e savedInstancestate){
super.onCreate(savedInstanceState);
Webview mywebview=(Webview)findViewById(R.id.jcywebview); #先获取到对象
myWebView.setWebContentsDebuggingEnabled(true);} #在调用对象的setWebContentsDebuggingEnabled方法

WebView和app之间的关系有两种:

  • 1.WebView的内容不依赖所在的app

特征:打开只是一个url,使用手机模式,直接用chrome浏览器对开对应的网页

appium中把所有的界面环境称之为context

native部分的context名字一般为NATIVE_APP

WebView部分的context则为WEBVIEW_XXXX (一般应用app packsge名)

我们怎么查看当前有哪些context呢?

appium中把所有的界面环境称之为context
native部分的context名字一般为NATIVE_APP
WebView部分的context则为WEBVIEW_XXXX (一般应用app packsge名)
我们怎么查看当前有哪些context呢?

driver.contexts #查看有几个context ,包含本地的,和WebView的

显示当前的context的:

driver.current_context

例子:

print(driver.contexts) # 返回是列表 ['NATIVE_APP','WEBVIEW_com.example.jcy.wvtest']

print(driver.current_context) # 当前在context是:NATIVE_APP

driver.switch_to.context('WEBVIEW_com.example.jcy.wvtest') # 进入到内嵌的WebView

driver.find_element_by_id('index-kw').send_keys('你好') # 操作

driver.find_element_by_id('index-bn').click()

driver.switch_to.context('NATIVE_APP') # 返回到本地的app

driver.find_element_by_id('com.example.jcy.wvtest:id/navigation_dashboard').click()

time.sleep(2)

driver.find_element_by_id('com.example.jcy.wvtest:id/navigation_notifications').click()

2.WebView的内容依赖所在的app(真的遇到这个问题,不建议继续搞下去了,浪费时间。)

特征:根本就不是网站的网址,嵌到应用里面去了。电脑上面根本就打不开

必须要科学上网 (如果已经上网成功)

首先要把应用打开,然后打开电脑上的chrome浏览器。输入:Chrome://inspect

电脑上会呈现出Remote Target 会显示连接的手机型号,和正在打开的webview

再点网页下面的inspect,就能看到webview里面的内容了

2.关于Toast框定位的问题?

Toast简介


Android中的Toast是一种简易的消息提示框。当视图显示给用户,在应用程序中显示为浮动。和Dialog不一
样的是,它永远不会获得焦点,无法被点击。
Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,一
般3秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到Toast元素的。


AppiumToast内容获取


Appium当前的版本就支持识别Toast内容,主要是基于UiAutomator2,因此需要在Capablity配置如下参数:


desired_caps['automationName']='uiautomator2'

测试场景

进入登录界面输入错误的用户名或者密码,获取Toast内容:

“用户名或密码错误,你还可以尝试4次”

代码实现

get_toast.py

#coding=utf-8
from selenium.webdriver.support.ui import WebDriverWait


driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('xuefei')
driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('88888887')
driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()


error_message="用户名或密码错误,你还可以尝试4次"

message='//*[@text=\'{}\']'.format(error_message)


toast_element=WebDriverWait(driver,5).until(lambdax:x.find_element_by_xpath(message))
print(toast_element.text)

注意:Toast内容为中文时,顶部必须注释#coding=utf-8否则会因为编解码导致文字识别失败。

3.多点触控的问题?

多点触控的问题多用在地图缩放,图片缩放场景。在appium中怎么去模拟这类操作?

滑动原理图解 :

appium中H5页面定位,Toast框定位,多点触控的问题_用户名

MultiAction

MultiAction 是多点触控的类,可以模拟用户多点操作。主要包含 add() 和 perform() 两个方法, MultiAction可以结合 ActionTouch可以模拟出用户的多个手指滑动的操作效果;

from appium.webdriver.common.multi_action import MultiAction

from appium.webdriver.common.touch_action import TouchAction

加载:

方法add(self, *touch_actions)将TouchAction对象添加到MultiAction中,稍后再执行。

参数:

touch_actions - 一个或多个TouchAction对象,描述一个手指要执行的动作链

用法:

a1 = TouchAction(driver)

a1.press(el1).move_to(el2).release()

a2 = TouchAction(driver)

a2.press(el2).move_to(el1).release()

MultiAction(driver).add(a1, a2)#将上面的动作组合起来

执行:

perform(self) 执行存储在对象中的操作。

连贯操作:

a1 = TouchAction(driver)



a1.press(el1).move_to(el2).release()

a2 = TouchAction(driver)

a2.press(el2).move_to(el1).release()

MultiAction(driver).add(a1, a2).perform()

有点类似Python里面的多线程和多进程的使用

测试场景

安装启动app,进入地图后分别进行放大缩小操作

代码实现

from appium import webdriver 

from time import sleep

from appium.webdriver.common.touch_action import TouchAction

from appium.webdriver.common.multi_action import MultiAction



x=driver.get_window_size()['width']

y=driver.get_window_size()['height']



def pinch():

action1=TouchAction(driver)

action2=TouchAction(driver)

zoom_action=MultiAction(driver)





action1.press(x=x*0.2,y=y*0.2).wait(1000).move_to(x=x*0.4,y=y*0.4).wait(1000).release()

action2.press(x=x*0.8,y=y*0.8).wait(1000).move_to(x=x*0.6,y=y*0.6).wait(1000).release()



print('start pinch...')

zoom_action.add(action1,action2)

zoom_action.perform()



def zoom():

action1=TouchAction(driver)

action2=TouchAction(driver)

zoom_action=MultiAction(driver)



action1.press(x=x*0.4,y=y*0.4).wait(1000).move_to(x=x*0.2,y=y*0.2).wait(1000).release()

action2.press(x=x*0.6,y=y*0.6).wait(1000).move_to(x=x*0.8,y=y*0.8).wait(1000).release()

print('start zoom...')

zoom_action.add(action1,action2)

zoom_action.perform()



if __name__ == '__main__':

for i in range(3):

pinch()

for i in range(3):

zoom()

上述所讲的内容,不太知道,不太会用没有关系。只是解决一些不多见的问题。就算遇到,也可以用其他方案替代或绕过。

appium自动化的重点在:元素定位,元素定位,元素定位