Appium+python笔记(2)截图,移动控件,双指放大图片

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秒):

你可能感兴趣的:(Appium笔记)