在测试用例执行的时候,我们可能出现元素时而能点击,时而无法点击,这可能就是因为没有加载出来,我们就执行了。那么我们应该怎么做呢,
那么我们应该如何处理呢,我们可以在代码中增加等待,
那么我们来看下在appium中我们有哪些等待呢
1.强制等待
2.硬性等待
3显性等待
我们看下在python中是如何实现的呢。
1.强制等待
在我们的演示的代码中,已经都实现了。
代码语言:javascript复制from time import sleep
#导入time中的sleep,在代码中使用。
sleep(10)
2.隐性等待
代码语言:javascript复制driver.implicitly_wait(10)。等待10s中
示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。
3.显性等待
代码语言:javascript复制from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
代码语言:javascript复制#方法1
wait = WebDriverWait(driver, 10, 0.5)
wait.until(EC.presence_of_element_located((By.ID, 'KW')))
#用法例2:
loc = ("xpath", "//*[@text='允许']")
e = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located(loc))
e.click()
那么我们可以在我们的现有的代码中演示
代码语言:javascript复制from time import sleep
from ddt import ddt,file_data
from appium import webdriver
from common.pyyaml import getyaml
from common.parame import Parmer
from config import apk_path,login_element
from common.pertools import caijicpu,getnencun
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
element=getyaml(login_element)
from common.isintsallapp import isinstallapp
@ddt
class testCase(Parmer):
def setUp(self) -> None:
is_first_install=isinstallapp(devicesName=self.parme['deviceName'],apk_path=apk_path,
apppackage=self.parme['appPackage'])
desired_caps=self.parme['desired_caps']
self.driver = webdriver.Remote('http://0.0.0.0:%s/wd/hub'%str(self.parme['port']), desired_caps)
self.driver.implicitly_wait(10)
# 启动同意用户协议
agree=element['agreeelement']
self.driver.find_element_by_id(agree).click()
if is_first_install:
# 首次安装需要加载文件
sleep(50)
sleep(50)
self.driver.find_element_by_id(element['opearelement']).click()
sleep(10)
WebDriverWait(self.driver, 10, 0.5).until(
EC.presence_of_element_located((By.ID,element['logintextclik']))).click()
def tearDown(self) -> None:
self.driver.quit()
sleep(20)
@file_data("../data/casedata/logincase.yaml")
def testlogin(self,user,user_password,msg,casename):
cpu=caijicpu(packagename=self.parme['appPackage'],devices=self.parme['deviceName'])
memory=getnencun(packagename=self.parme['appPackage'],devices=self.parme['deviceName'])
print("用例:%s 执行前:cpu:%s 内存:%s"%(casename,cpu,memory))
sleep(10)
loc = ("id", element['usernameedit'])
username = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located(loc))
username.clear()
username.send_keys(user)
password=WebDriverWait(self.driver,10,0.5).until(EC.presence_of_element_located((By.ID,element['usernameedit'])))
# password = self.driver.find_element_by_id(element['passwordedit'])
password.clear()
password.send_keys(user_password)
sleep(2)
login = self.driver.find_element_by_id(element['loginbtn'])
login.click()
sleep(10)
try:
self.driver.find_element_by_id(element['assertelement'])
self.assertTrue(False,msg=msg)
cpuend = caijicpu(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
memoryend = getnencun(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
changecpu = float(cpuend) - float(cpu)
memorychange = float(memoryend) - float(memory)
print("用例:%s 执行过程变化:cpu:%s M 内存:%s M" % (casename, changecpu, memorychange))
except:
self.assertTrue(True,msg=msg)
cpuend = caijicpu(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
memoryend = getnencun(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
changecpu=float(cpuend)-float(cpu)
memorychange=float(memoryend)-float(memory)
print("用例:%s 执行过程变化:cpu:%s M 内存:%s M" % (casename, changecpu, memorychange))
修改后的代码已经提交到远程仓库。
代码语言:javascript复制最新代码已经提交
https://gitee.com/liwanlei/appiumdemo
后记
发现问题,解决问题。遇到问题,慢慢解决问题即可。
欢迎关注雷子说测试开发,后续将会持续为大家分享更多的技术知识