结合项目说下三种等待:
第一、先建立一个概念代码有多快?
用例是登录环境,进入界面,点击上传。这一套在我们眼里看来还不得个5秒左右,但是代码0.05秒就已经跑到了点击上传了。然后代码在等页面加载。
第二,说下龟兔赛跑的故事,
龟是页面加载(页面有的地方有很多js脚本,加载起来很慢的,有的地方很快),兔是代码。预备跑:页面加载刚走了一步,代码已经到终点了。有的地方代码要想执行下一步:必须等页面加载出来才能继续。等太久,代码就抛了个异常。
1、隐性等待(代码等的是:你要点击元素所在的整个页面完全加载)
【项目里,只需要在我们封装的setup方法里写一次即可,作用是全局的】
# coding=utf-8
import unittest
from selenium import webdriver
from Common.function import config_url
# cls.driver.implicitly_wait(10):代码等整个页面加载完成,一加载出来就过,一加载出来就过。等10秒,还不出来,抛出异常
class UnitBase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.get(config_url())
cls.driver.maximize_window()
cls.driver.implicitly_wait(10)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
2、显性等待(代码等的是:你要点击的元素能被点击,title出来没、frame加载没,text出来了没等,)
直接看源码的翻译吧,紧接着就是经验之谈,后续慢慢补充吧
WebDriverWait(self.driver,20,0.5).until(EC.element_to_be_clickable(By.XPATH,'[]'))
# 代码每隔0.5秒查一次页面元素能不能被点击,如果能被点击,则继续,如果假,超过20秒,则抛出TimeoutException。
项目里关于显性等待都是直接封装到基础操作Base类里面,项目代码如下:
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Common.log import FrameLog
from Common.function import config_url
class Base():
"""这里封装了操作浏览器的基础操作"""
def __init__(self, driver, log):
self.driver = driver
self.log = FrameLog().log()
# 单星号参数代表此处接受任意多个非关键字参数
def findele(self, *args):
return self.driver.find_element(*args)
# 对元素click
def click(self, *args):
return self.findele(*args).click()
# 发送信息
def sendkey(self, args, value):
self.findele(*args).send_keys(value)
# 调用js方法
def js(self, str):
self.driver.execute_script(str)
def dddd(self, *args):
"""
检查元素是否存在于页面和可见。可见性意味着不仅显示元素,但其高度和宽度也大于0。定位器-用于查找元素,
一旦WebElement定位并可见,返回它
:param args:
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located())
def aaaaaaaa(self,*args):
"""
检查是否有弹窗出现
如果点击某个操作有弹框,用这个更快。
:param args:
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.alert_is_present())
# 调用不要输入元组。*args已经打包了
def dominance_clickable(self, *args):
"""
检查元素的期望是可见的并已启用,以便您可以单击它
点击元素之前带上这个,会更快。
:param args:
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.element_to_be_clickable(args))
def aaa1(self,*args):
"""
检查标题是否包含区分大小写的子字符串。title是期望的title片段,当标题匹配时返回True,否则返回False
切换浏览器界面的title时候带上这个,会更快。
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.title_contains(args))
def aaaa2(self, *args):
"""
期望检查给定帧是否可用于,切换到。 如果框架可用,则将给定的驱动程序切换到指定的帧。
切换框架时候,用它更快。
:param args:
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.frame_to_be_available_and_switch_to_it(args))
def aaaaa2(self,*args):
"""
期望检查给定文本是否存在于指定的元素。
如果你定位text的文本并点击它,使用它更快
:param args:
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.text_to_be_present_in_element)
def aaa(self, *args):
"""
检查DOM上是否存在元素的期望值。一页的长度。这并不一定意味着元素是可见的。
这个研究中
:return:
"""
return WebDriverWait(self.driver,20,0.5).until(EC.presence_of_element_located(args))
def bbb(self, *args):
"""
选择检查选择的期望。元素是WebElement对象
不是很明白
:param args:
:return:
"""
return WebDriverWait(self.driver, 20, 0.5).until(EC.element_to_be_selected(args))
3、强制等待
没啥说的,导入time模块,在你实在没法用显性等待解决,再用time.sleep(10),让它在这块强制等个10秒。