Appium android 如何模拟手工打开屏幕和关闭屏幕

sincool · November 24, 2015 · Last by 陈恒捷 replied at November 26, 2015 · 2542 hits

android如何模拟手工打开屏幕和关闭屏幕

有一个app应用,要测试的点是安装应用后关闭掉屏幕,然后再打开屏幕,再向左或向右滑动解锁屏幕
问题是:安装-访问-操作应用都可以,一串的操作
这个不知道如何关闭屏幕和打开屏幕

先谢谢!

共收到 31 条回复 时间 点赞

如果你是用UIAutomator的话 直接就是

uiDevice.pressKeyCode(26); //KEYCODE_POWER=26;

appium 的话

driver.keyevent(26)

#1楼 @zsx10110 我是appium的,但是报错selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: com.youqian.activity/.guide.SplashActivity never started. Current: com.youqian.activity/.guide.GuideActivity)

配置server的时候,代码增加启动activity和等待activity

desired_caps['appActivity'] = appActivity
desired_caps[ 'appWaitActivity'] = appWaitActivity

#3楼 @eurekasaber 有加的
现在报错:
AttributeError: 'WebDriver' object has no attribute 'keyevent'
这个keyevent事件是要import哪个类的?

#4楼 @sincool 贴代码会比较好点。

#5楼 @zsx10110
from appium import webdriver
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException
#success = True
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = 'SM-N9100'
desired_caps['app'] = 'C:\Users\liujuan\Desktop\apk\youqianhua1.apk'
desired_caps['appPackage'] = 'com.youqian.activity'
desired_caps['appActivity'] = 'com.youqian.activity.guide.SplashActivity'
desired_caps[ 'appWaitActivity'] = 'com.youqian.activity.guide.SplashActivity'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
sleep(3)

driver.keyevent(26)

driver.quit()

我把好多包都导了,但是也不知道有啥用。还是报AttributeError: 'WebDriver' object has no attribute 'keyevent'

#6楼 @sincool 其实你已经知道问题的大概了,你导入的包导太多 结果你又不知道有什么用,你再检查下你就会发现你导入了两个webdriver

from appium import webdriver
from selenium import webdriver

你把selenium那个webdriver去掉再试试看。

#7楼 @zsx10110
我那一段代码,又回到第一个问题了,加上keyevent(26)后报错:
selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: com.youqian.activity/.guide.SplashActivity never started. Current: com.youqian.activity/.guide.GuideActivity)

#7楼 @zsx10110 我排除了的,这句获取的session为null。不是不执行。

#9楼 @sincool 其实这个问题解决方法就是看提示信息了

Original error: com.youqian.activity/.guide.SplashActivity never started. Current: com.youqian.activity/.guide.GuideActivity

所以说你就直接将

desired_caps['appActivity'] = 'com.youqian.activity.guide.SplashActivity'
desired_caps[ 'appWaitActivity'] = 'com.youqian.activity.guide.SplashActivity'

改成

desired_caps['appActivity'] = 'com.youqian.activity.guide.GuideActivity'
desired_caps[ 'appWaitActivity'] = 'com.youqian.activity.guide.GuideActivity'

因为它告诉你说当前的Activity是 GuideActivity 虽然我还不太清楚 waitActivity是什么作用。

#10楼 @sincool 直接执行就报错,进行不下去,因为我用命令查看这个apk包出来的activity是com.youqian.activity.guide.SplashActivity 这个,如果我改成com.youqian.activity.guide.GuideActivity 这个,就会报错。直接连不到appium

#12楼 @sincool 有apk吗 给个链接之类的我去试试看?

#10楼 @zsx10110 我发现,滋要是下面还有别的任何操作,都会报selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: com.youqian.activity/.guide.SplashActivity never started. Current: com.youqian.activity/.guide.GuideActivity)

不管是不是keyevent。。。。。我要下面直接不加任何东西,然后直接只是安装打开就没有任何问题

#15楼 @sincool 我不知道你为什么不行

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = 'SM-N9100'
desired_caps['app'] = 'C:\\Users\\cvtpc\\Downloads\\youqianhua.apk'
desired_caps['appPackage'] = 'com.youqian.activity'
desired_caps['appActivity'] = 'com.youqian.activity.guide.GuideActivity'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
sleep(3)

driver.keyevent(26)

driver.quit()

这段代码在我那都是ok的 我就改了一个app跟一个appAcitivity

#16楼 @zsx10110 我想知道你在appium设置中activity选择的是guideactivity还是SplashActivity

#17楼 @sincool 你看我的代码就知道了 我填写的是GuideActivity

#18楼 @zsx10110 那真是太诡异了。我的appium设置下拉框中选择的是guideactivity,代码里也是一样的。然后就是报selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: Permission to start activity denied.)

#19楼 @sincool 你有去掉appWaitActivity 我没加这个,接着你重新把你的软件卸载了。重新运行看看。

#20楼 @zsx10110
from appium import webdriver
from time import sleep

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = 'SM-N9100'
desired_caps['app'] = 'C:\Users\liujuan\Desktop\apk\youqianhua_v2011.apk'
desired_caps['appPackage'] = 'com.youqian.activity'
desired_caps['appActivity'] = 'com.youqian.activity.guide.GuideActivity'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
sleep(3)

driver.keyevent(26)

driver.quit()

appium中设置的也是GuideActivity。然后就报的是:selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: Permission to start activity denied.)

#20楼 @zsx10110
这个apk包的acvitity确实是。。。

@chenhengjie123 帮忙看看为啥?
@sincool 我帮你呼叫下大神。

#20楼 @zsx10110 我其实很怀疑apk打包的时候是不是把activity名打错了。然后对应代码里的功能又是另一个activity的

我觉得你是一个应用程序中包含了多个apk,换句话说,你用错apk了,问问开发是否还有其他的apk

27Floor has been deleted

#26楼 @bree这个不可能是多个apk吧,不就只有一个测试的apk包吗?我怀疑是activity,我问了开发,它是有2个java文件可以打包的,我看到它的打包方式有2种
好像是2种都可以,从报错的信息来看,应该是要guideactivity这种。所以我觉得是这个问题。

逻辑上通过SurfaceFlinger判定界面显示状态,未锁屏则发键值26锁屏;锁屏壁纸界面则滑屏就是打开,挺好实现的逻辑。
设备端shell脚本我是这么写的,逻辑上是这样的,写成java脚本也可以。

#锁屏函数$1:0--lock;1--unlock
#屏幕物理分辨率
export wm_size_x=`wm size|busybox awk -F" |x" '{print $(NF-1)}'`
export wm_size_y=`wm size|busybox awk -F" |x" '{print $NF}'`
lock(){
while true;do
case `dumpsys SurfaceFlinger|grep "|....|"|busybox awk 'BEGIN{r="o"}{if($NF=="com.android.systemui.ImageWallpaper")r="l"}END{print NR-1 r}'` in
"1o")
local state=0
;;
"3l")
local state=1
;;
*)
local state=2
;;
esac
case $1 in
0)
if [ $state -ne 0 ];then
input keyevent 26
else
break
fi
sleep 1
;;
1)
if [ $state -eq 0 ];then
#我这是上滑屏解锁,其他的改下参数就好了
input keyevent 26&&sleep 1&&input swipe $((wm_size_x/2)) $((4*wm_size_y/5)) $((wm_size_x/2)) $((wm_size_y/5))
elif [ $state -eq 1 ];then
input swipe $((wm_size_x/2)) $((4*wm_size_y/5)) $((wm_size_x/2)) $((wm_size_y/5))
else
break
fi
sleep 1
;;
esac
done
}

我这个问题得改一下内容了,没看见有修改帖子的,我得重新开个新帖

多谢各位,这个问题已解决,与我的猜测一样。换了个apk的activity就可以了

#31楼 @sincool 你可以修改帖子,在标题前面加上【已解决】,正文底部附上解决方法。修改按钮就是正文右下角的铅笔图案。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up