Macbook prom1+android虚拟机+pycharm+pytest+appium 实现微信登录
前言
Macbook prom1 android虚拟机 pycharm pytest appium 实现微信登录
1. 第三方库
- appium-python-client
- pyyaml
- pytest
- selenium
app.py
-
from appium import webdriver
-
from Page.basepage import BasePage
-
from Page.main import Main
-
-
class App(BasePage):
-
-
# 启动app
-
def start(self):
-
_package = "com.tencent.mm"
-
_activity = "com.tencent.mm.ui.LauncherUI"
-
if self._driver is None:
-
desir_cap = {
-
"appPackage": "com.tencent.mm",
-
"appActivity": "com.tencent.mm.ui.LauncherUI",
-
"platformName": "Android",
-
"platformVersion": "12",
-
"dontStopAppOnReset": "true",
-
"noReset": "true",
-
"deviceName": "emulator-5554"
-
}
-
self._driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desir_cap)
-
self._driver.implicitly_wait(5) # 隐式等待5s
-
else:
-
self._driver.start_activity(_package, _activity)
-
return self
-
-
def main(self):
-
return Main(self._driver)
basepage.py
-
from appium.webdriver.webdriver import WebDriver
-
from appium.webdriver.common.touch_action import TouchAction
-
import yaml
-
import pytest
-
from time import sleep
-
-
'''创建一个基础页面类,用于封装公共模块的处理方法
-
和根据yaml配置文件进行案例的测试步骤'''
-
-
-
class BasePage:
-
_blackList = [] # 黑名单列表,用于处理再case运行过程中可能出现的未知弹窗
-
_errorCount = 0 # 定位元素的错误次数,元素定位中可能出现一次定位不到
-
_errorMax = 5 # 允许进行元素定位的最大错误次数
-
-
def __init__(self, driver: WebDriver = None): # 初始化driver
-
self._driver = driver
-
-
def find(self, by, locator): # $by>定位元素的方法,$locator>定位元素对应的所需value
-
try:
-
if isinstance(by, tuple): # 如果传入的定位是个元组形式,包括方法和locator,就进行解包的方式定位
-
element = self._driver.find_element(*by)
-
else:
-
element = self._driver.find_element(by, locator)
-
self._errorCount = 0 # 找到元素,错误次数为0
-
return element
-
except Exception as e:
-
self._errorCount = 1 # 未找到该元素,错误次数加1
-
if self._errorCount >= self._errorMax:
-
raise e # 错误次数大于设置的最大次数抛出异常
-
for black in self._blackList:
-
elements = self._driver.find_elements(*black) # 找到黑名单列表里的所有元素,[(by, locator),]的形式设置
-
if len(elements) > 0: # 出现弹框匹配黑名单列表大于0,即出现未知弹框
-
elements[0].click() # 点击过后就找不到该元素了,所以永远点击第一个找到的就可以了
-
return self.find(by, locator) # 点击后返回原方法,轮询去让定位可以继续执行
-
raise e # 没有找到,抛出异常
-
-
def send(self, by, locator, value): # 数据输入的方法
-
try:
-
self._driver.find(by, locator).send_keys(value) # 定位到输入的位置,输入值
-
self._errorCount = 0
-
except Exception as e:
-
self._errorCount = 1
-
if self._errorCount >= self._errorMax:
-
raise e # 大于错误次数,抛出异常
-
for black in self._blackList:
-
elements = self._driver.find_element(*black)
-
if len(elements) > 0:
-
elements[0].click()
-
return self.find(by, locator)
-
raise e
-
-
def steps(self, path): # 定义操作步骤的方法,用于通过编写配置文件,执行相关用例
-
with open(path, 'r', encoding='utf-8') as f:
-
steps: list[dict] = yaml.safe_load(f) # 操作步骤的数据类型为:[{},{}]
-
# 遍历操作步骤
-
for step in steps:
-
if 'by' in step.keys():
-
element = self.find(step['by'], step['locator']) # 定位到元素
-
# 要进行的动作操作
-
if 'action' in step.keys():
-
if 'click' == step['action']: # 点击操作
-
element.click()
-
if 'send' == step['action']:
-
element.send_keys(step['value'])
-
if 'TouchAction' in step['action']: # 滑动操作
-
action = TouchAction(self._driver)
-
action.press(x=step['value'][0]['x_start'], y=step['value'][0]['y_start']).wait(300) \
-
.move_to(x=step['value'][1]['x_end'], y=step['value'][1]['y_end']).release().perform()
-
# 断言
-
if 'assertion' in step.keys():
-
if "sleep" in step['assertion'].keys():
-
sleep(step['assertion']['sleep'])
-
element = self.find(step['assertion']['by'], step['assertion']['locator'])
-
attribute = element.get_attribute(step['assertion']['attribute'])
-
pytest.assume(attribute == step['assertion']['assert_info'])
-
if 'back' in step.keys():
-
self._driver.back()
-
login.py
-
from Page.basepage import BasePage
-
-
-
# 登录page
-
class Login(BasePage):
-
-
def daily_recommendation(self):
-
self.steps('../TestData/login.yml') #进入登录页
-
-
main.py
-
from Page.basepage import BasePage
-
from Page.login import Login
-
-
-
-
class Main(BasePage):
-
-
def quit(self):
-
self._driver.quit()
-
-
def go_login(self): # 进入微信首页
-
self.steps("../TestData/main.yml")
-
return Login(self._driver) #这里应该是类的名子
-
-
def go_password(self):
-
self.steps("../TestData/main.yml")
-
return Passoword(self._driver)
-
-
-
-
-
-
test_login.py
-
from Page.app import App
-
import pytest
-
-
class TestLogin:
-
-
def setup_class(self):
-
self.testDriver = App().start().main()
-
-
def teardown_class(self):
-
self.testDriver.quit()
-
-
def test_daily_recommendation(self):
-
self.testDriver.go_login().daily_recommendation()
-
-
-
login.yml
-
-
-
by: id
-
locator: com.tencent.mm:id/cd6
-
action: send
-
value: 134522622
-
-
-
by: id
-
locator: com.tencent.mm:id/hfl
-
action: click
main.yml
-
-
-
by: id
-
locator: com.tencent.mm:id/j_i
-
action: click
参考:
总结
有时候不是代码的锅,是环境的问题。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcecik
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13