Appium+pyhton截图,可以使用driver.get_screenshot_as_file("存储路径")。
(之前使用平板+uiautomator框架测试截图,报错没权限,大概要root)
关于移动控件,一开始不知道,使用了TouchAction, emmmmm后来发现可以这样:
self.driver.drag_and_drop(源控件,目的控件) 一句就完事~\(≧▽≦)/~啦,就是当熟悉一下TouchAction了
双指缩放pinch 和 zoom,这个查了一下,似乎是driver.pinch()直接调用?但用的时候,执行时直接报错没这个方法。
呵,我只好先用MultiAction写一下,只写了放大,缩小只需要改一下数据;
实际测试还是遇到点问题,没有经验,在小细节上问题上,磨了半天,关键这应该不属于常见的,还好解决了。
平板上实际运行,感觉有点慢。
检查到WebdriverWait的注释写错了,参数设置的是共计6秒。
测试代码:
#coding=utf-8
import unittest
from appium import webdriver
from appium.webdriver.common.multi_action import MultiAction
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import CaptureScreenShot
class Test(unittest.TestCase):
def setUp(self):
desired_caps={}
desired_caps['platformVersion']='5.1.1'
desired_caps['platformName']='Android'
desired_caps['deviceName']='G0B0ME036482001L'
desired_caps['appPackage']='com.kugou.android'
desired_caps['appActivity']='.app.splash.SplashActivity'
desired_caps['noReset']='true'
self.driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
self.driver.implicitly_wait(3) #隐式等待,3秒内会持续寻找、等待控件出现
def tearDown(self):
self.driver.quit()
def test_capture(self):
'''
#显示等待
#以列表形式写好查询方法与条件,直接写在方法里当然也可以
loc=("xpath", "//android.view.View[@index='1']")
#通过webdriver获得webDriverWait对象,设置每隔一秒按条件查询一次,共计10秒
waitForElement=WebDriverWait(self.driver,6,1)
#通过WebDriverWait.Util()等待并返回右上角的“跳过”;动态等待条件expected_conditions.presence_of_element_located()
el=waitForElement.until(EC.presence_of_element_located(loc))
el.click()
#点击左上角“×”,不注册
el=waitForElement.until(EC.presence_of_element_located((By.ID,'com.kugou.android:id/uv')))
el.click()
'''
#隐式等待,可以直接通过find_element_by_ 方法获取控件
#点击“跳过”
el=self.driver.find_element_by_xpath("//android.view.View[@index='1']")
el.click()
#点击左上角“×”,不注册
el=self.driver.find_element_by_id("com.kugou.android:id/uv")
el.click()
#截图,保留原图
CaptureScreenShot.captureScreen(self,'test_find_Skip')
#获取“乐库”控件
musicBox=self.driver.find_element_by_id('com.kugou.android:anim/dr')
#设置TouchAction
touchAction=TouchAction(self.driver)
#长按“乐库”控件,让它可移动
touchAction.long_press(musicBox)
#获取“歌单”控件
musicList=self.driver.find_element_by_id('com.kugou.android:anim/ds')
#将“乐库”移动到“歌单”位置,相当于互换座位
touchAction.move_to(musicList).release().perform()
#emmmmm,后来才发现可以这样:self.driver.drag_and_drop(musicBox,musicList) 一句完事
#再次截图,这样可以比较原图、验证
CaptureScreenShot.captureScreen(self,'Test_Chang_Location')
def test_zoom(self):
#打开相机,浏览一张拍过的相片,并放大它
self.driver.start_activity('com.amazon.camera', '.AmazonCameraActivity')
#点击相片浏览区域
self.driver.find_element_by_id('com.amazon.camera:id/thumbnail').click()
#获取当前相片展示控件,使用的平板长、宽一样的
imageView=self.driver.find_element_by_id('com.amazon.photos:id/photo_view')
#获取屏幕高和宽
srcHeight=self.driver.get_window_size()['height']
srcWidth=self.driver.get_window_size()['width']
#设置MultiAction,可以多点触控
multiAction=MultiAction(self.driver)
#设置两个“单点”动作
t1=TouchAction(self.driver)
t2=TouchAction(self.driver)
#分成两点按住相片0.25秒(如果中间不等,可能是程序点太快什么的,会退出浏览模式或者不起放大的作用,就这么一小点一开始想不明白,浪费好些时间,实验用的平板有点坑,手机上就不会随便退出浏览模式);X轴固定,从屏幕中间向上下两边移动
t1.long_press(imageView,srcWidth/2,srcHeight/2 - 100).wait(250).move_to(imageView,srcWidth/2,srcHeight/2-130).release()
t2.long_press(imageView,srcWidth/2,srcHeight/2 + 100).wait(250).move_to(imageView,srcWidth/2,srcHeight/2+125).release()
#只能一个一个add()分别加上去,不像Java方法,可以multiAction.add(t1).add(t2)
multiAction.add(t1)
multiAction.add(t2)
multiAction.perform()
if __name__ == "__main__":
unittest.main()
截图文件:CaptureScreenShot.py
#coding=utf-8
'''
Created on 2019年8月30日
@author: derik
'''
import time
from appium import webdriver
#传递图片名称参数
def captureScreen(self,filename):
#获取系统时间并转换格式作为图片名,20190830161035
date=time.strftime("%Y%m%d%H%M%S",time.localtime())
#拼接存储路径,电脑路径+时间+图片名+.png
storeFile='/home/derik/图片/'+date+filename+'.png'
#关键的一句,get_screenshot_as_file
self.driver.get_screenshot_as_file(storeFile)
分开录得屏,效果记录1(居然要运行35秒):
放大图片(22秒):