1、强制等待(sleep)
from time import sleep
sleep(3)#强制等待3秒
缺点∶由于Web加载的速度取决于测试的硬件、网速、服务器的响应时间等因素。如果等待时间太长,容易造成时间浪费,如果等待时间太短有可能会造成在web端还
没有加载完所需要定位的element,而出现报错,由于等待时间无法确定,使用太多的sleep会影响运行速度,大大地降低效率,所以建议测试中尽量少使用强制等待
2、隐式等待(implicitly_wait)
#隐式等待10s
driver.implicitly _wait(10)
简介:隐式等待是全局的是针对所有元素,设置等待时间如10秒,如果10秒内出现,则继续向下,否则抛异常。可以理解为在10秒以内,不停刷新看元素是否加载出来。
使用场景:隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。隐式等待存在一个问题,那就是程
序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js
之类的东西特别慢,仍得等到页面全部完成才能执行下一步。
3、显示等待(expected_conditions)
简介:显示等待是单独针对某个元素,设置一个等待时间如5秒,每隔0.5秒检查一次是否出现,如果在5秒之前任何时候出现,则继续向下,一般需要配合该类的untl()
和until_not)方法一起用,直到超过设置的最长时间,然后抛出超时错误TimeoutExceptior以下介绍几个最常用的方法:
1.判断element是否可见: visibility_of_element_located(locator)(可见代表element非隐藏,并且element宽和高都不等于0)
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
#示例
target = EC.visibility_of_element_located(By.ID,'user')
#配合until()使用(等待元素可见)
#5表示最长超时时间,默认以秒为单位;1表示检测的间隔步长,在等待期间,每隔一定时间(默认0.5秒),调用untl或until_not里的方法,直到它返回True
或Fase.WebDriverWait(driver,5,1).until(EC.visibility_of_element_located(By.ID,'user'))
#配合until_not()使用(等待元素不可见)
WebDriverWait(driver,5,1).until_not(EC.visibility_of_element_located(By.ID, 'user'))
#在类中封装为一个函数
def wait_eleLocated(self, loc, timeout=30, poll_frequency=0.5, model=None):e.m
:param loc:元素定位表达;元组类型,表达方式(元素定位类型,元素定位方法),示例:(By.lD, "kw "):param timeout:超时时间
:param poll_frequency:轮询频率
:param model:等待失败时,截图操作,图片文件中需要表达的功能标注:return:None
"1
self.logger.info(f等待"{model}"元素,定位方式:{loc})
try:
start = datetime.now()
WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located(loc))end = datetime.now()
self.logger.info(f等待"{model"时长:{end - start}')except TimeoutException:
self.logger.exception(f等待"{model}"元素失败,定位方式:{loc}')#截图
self.save_weblmgs(f”等待元素[{modell}]出现异常")raise
⒉.判断某个element是否被加载到dom树: presence_of_element_located(locator)(并不代表该element一定可见)
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
target = EC.presence_of_element_located(By.ID, 'user')
3.判断某个element中是否可见并且可点击: element_to_be_clickable(locator)
from selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By
target = EC.element_to_be_clickable(By.ID,'user')
4.判断某个element是否被选中: element_to_be_selected(element)(一般用在下拉列表)
from selenium.webdriver.support import expected_conditions as Ec
from selenium.webdriver.common.by import By
element = driver.find_element_by_class_name('selector')EC.element_to_be_selected(element)