Selenium系列(5)- 三种等待方式详解

设置元素等待的原因

  • 加载网页时,元素的加载速度受到网络波动影响较大,在圆度定位时,有可能网页加载出来了但是页面元素未加载出来,这时会导致元素定位失败,进而报错

  • 加入元素等待的目的:等元素加载出来之后再去进行定位操作,可以避免报错

强制等待

python自带的等待方法,time.sleep(5)强制等待,线程休眠一定时间

缺点:若指定时间较长,即使元素加载出来了,也需要等待指定时间(造成大量时间浪费)

隐式等待

原理:设置一个等待的时间,轮询(默认0.5秒)查找元素是否出现,如果没出现就抛出异常

# 在30秒内轮询查找元素,30秒后元素未出现跑异常
self.driver.implicity_wait(30)

缺点:隐式等待是全局的(作用于所有的find_element方法),需要等待整个页面加载完成,才会执行下一步,会增加不必要的等待时间,不够灵活

显式等待

原理:定义等待条件,当条件发生时(例如某个元素出现或某个元素可点击)继续执行操作,否则继续等待轮询查找(默认0.5s),直到超过设定的最长等待时间后抛异常(简单来说,就是直到元素出现才去操作,若超时则抛异常)

WebDriverWait配合until()until_not()方法,根据判断条件进行等待

举个栗子,自定义等待条件,如果条件满足,则执行操作,若不满足则继续等待

# 以https://ceshiren.com/为栗
#先定义一个函数,判断元素是否存在,如果存在,则点击测试答疑
def wait(x):
    # 判断元素是否存在
    return len(self.driver.find_element_by_xpath("//*[@title='过去一年、一个月、一周或一天中最活跃的话题']"))>=1
    # python将函数作为参数传参时,不要带(),带()是调用函数
    WebDriverWait(self.driver, 10).until(wait)

🕊ATTENTION:

  • python将函数作为参数传参时,不要带(),带()是调用函数
  • until()until_not()使用条件相反,一个是条件满足则执行操作,一个是条件不满足则执行操作

expected_conditions

selenium中的一个模块,提供各种判断的条件类,使用时直接导入即可

from selenium.webdriver.support import expected_conditions

element_to_be_clickable为例,上面给的例子中wait()的写法可以等同于以下写法:

WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable((By.XPATH,"//*[@title='过去一年、一个月、一周或一天中最活跃的话题']")))
self.driver.find_element_by_xpath("//*[@title='测试答疑']").click()

🕊ATTENTION:

  • element_to_be_clickable的传参locator为一个元组,格式如(By.XPATH,"元素xpath")
  • 元组中第一个参数为定位元素的方式(同8种定位方式,这里需要引入By模块)
  • 元组中第二个参数和之前元素定位方法一样传参
posted @ 2021-10-13 23:33  莫伊101  阅读(75)  评论(0编辑  收藏  举报