# 1.去登录考研帮系统
import time
from time import sleep
from appium import webdriver
# 用python代码去做app自动化 先要获取 app程序的手机信息
# 手机配置信息 我们统一写在info中
from class45.config.config_read import yaml_load
data2 = yaml_load.read_yaml()#3.调用yaml文件的数据
info = {
#操作平台
'platformName':'Android',
#版本号
'platformVersion':'7.1.2',
#设备信息 可自由编写 不能为空 不能为中文
'deviceName':'127.0.0.1:62001',
# 包名
'appPackage':'com.tal.kaoyan',
#界面名/入口名
#界面名 在这里要注意填写的界面名并不是app打开的第一页的字符码
#当前包名和界面名获取的方式:cmd - adb shell dumpsys window | findstr mCurrentFocus
# 获取入口名
# 1.有apk的情况下获取包名和入口名 cmd - aapt dump badging 文件拖拽
# 2.apk的包不见了,又想获取入口名,那我们可以通过monkey命令来获取
# 1. adb shell pm list packages -3
# 2. adb shell monkey -p 包名 -v-v-v 1
# 其中onent的后面就是入口名 末尾的end不要带
#有apk的
'appActivity':'com.tal.kaoyan.ui.activity.SplashActivity',
#重置
'noReset':False
}
platformName: Android,
platformVersion: 7.1.2,
deviceName: 127.0.0.1:62001,
appPackage: com.tal.kaoyan,
appActivity: com.tal.kaoyan.ui.activity.SplashActivity,
noReset: False
ip: 127.0.0.1
port: 4723
# 专门读取yaml文件数据
# 第一步获取yaml文件中的参数
import yaml
class yaml_load:
def read_yaml(self): #2.封装
with open('../data/cs_caps.yaml','r',encoding='utf-8') as f: #6.导入yaml的文件绝对路径
data = yaml.load(f,yaml.FullLoader)
print(data)
return data #2.返回
data2 = yaml_load().read_yaml()
print(data2)
# 5.专门放路径
import os
class Config:
config_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)),'data')
#5.5拿到yaml文件的绝对路径
yaml_path = config_dir+'\cs_caps.yaml'
print(yaml_path)
#7.我们配置信息的组成是一个字典,原来的字段我们无法进行传递参数 所以我们先创建一个空字段 然后给字典赋值
from appium import webdriver
from class45.config.config_read import yaml_load
def desired_caps():
data = yaml_load().read_yaml() #7.获取文件的值
print(data)
info = {}
info['platformName'] = data['platformName']
info['platformVersion'] = data['platformVersion']
info['deviceName'] = data['deviceName']
info['appPackage'] = data['appPackage']
info['appActivity'] = data['appActivity']
info['noReset'] = data['noReset']
driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',info)
driver.implicitly_wait(3)
return driver
if __name__ == '__main__':
desired_caps()
# 完成配置信息的优化后我们就可以直接在yaml文件去修改参数
# 9.专门封装取消跳过滑动
from selenium.webdriver.common.by import By
from class45.base.base_page import Base
class Common(Base):
#10.3 Base中*loc所以我们元组
cancel = (By.ID,'android:id/button2') #10.4点击取消 元素获取用的ID
skip = (By.ID,'com.tal.kaoyan:id/tv_skip')
#10.封装点击取消
def check_cancel(self):
# 10.1 调用点击的方法,需要去继承Base的方法
try: #10.5因为不确定有没有取消点击,所以使用
self.click(self) #10.8把点击跳过的元素传入到click
except Exception as e:
print('没有取消元素')
# 10.6封装跳过
def check_skip(self):
try:
self.click(self)
except Exception as e:
print('没有跳过的元素')
#11.封装滑动 需要拆分两步,1.获取手机大小 2.设置的时候设置xy计算百分比
#11.1封装屏幕大小
def size(self):
x = self.driver.get_window_size()['width']
y = self.driver.get_window_size()['height']
return x,y
#11.2向左封装滑动
def swipeLeft(self,n,t):
size2 = self.size()
x1 = size2[0]*0.8
y1 = size2[0]*0.9
x2 = size2[0]*0.2
for i in range(n):
self.driver.swipe(x1,y1.x2,y1,t)
#9.1先找到取消、跳过的元素才能点击 所有我们提前封装好base 也就是基类或项目中经常要用的操作,封装在里面
#10. 在这封装经常要使用的动作
from selenium.webdriver.support.wait import WebDriverWait
class Base:
def __init__(self,driver):
self.driver = driver
# 10.找到元素并且设置显示等待
def locator(self,loc,timeout=10,poll=0.5): #loc要找的元素 timeout:总等待时长 poll:查看间隔
WebDriverWait(self.driver,timeout,poll).until(lambda x:x.find_element(*loc))
#10 输入的方法
def input_(self,loc,text):
self.locator(loc).send_keys(text)
#10.点击的方法
def click(self,loc):
self.locator(loc).click()
#12.实现登录 输入用户名 输入密码 点击登录
#12.1 其实还有取消 跳过的业务 继承就可以了
from selenium.webdriver.common.by import By
from class45.common.common_fun import Common
from class45.desired.desired_cap import desired_caps
class LoginView(Common): #在登录操作中有点击跳过的操作 所以我们继承common -Base
#12.2 账号的输入框 元素
global username_type = (By.ID,'com.tal.kaoyan:id/login_email_edittext')
#12.2 密码的输入框 元素
global password_type = (By.ID,'com.tal.kaoyan:id/login_password_edittext')
#12.2 登录按钮 元素
global loginBtn = (By.ID,'com.tal.kaoyan:id/login_login_btn')
#12.3 封装登录流程
def login(self,username,password):
self.check_cancel() #点击取消
self.check_skip() #点击跳过
self.input_(self,username_type,username)
self.input_(self,password_type,password)
self.click(self,loginBtn)
# 13 扩展
# 13.1 我知道了
know = (By.ID, '')
# 13.1下线提醒
warning2 = (By.ID, '')
# 13 点击我知道
def check_alter(self):
print('检查弹窗知道了')
try:
self.click(self.know)
except Exception as e:
print('没有我知道')
def check_alter(self):
print('检查下线提醒')
try:
self.click(self.warning2)
except Exception as e:
print('没有下线提醒')
#12.4 查看登录有没有问题
if __name__ == '__main__':
driver = desired_caps()
lp = LoginView(driver)
lp.login('qwerty2664','qwerty123')