selenium显示等待和隐式等待

selenium显示等待和隐式等待

  1. selenium的显示等待

    原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
    (简而言之,就是直到元素出现才去操作,如果超时则报异常)

     from selenium import webdriver
     from selenium.webdriver.support import expected_conditions as EC
     from selenium.webdriver.support.wait import WebDriverWait
     from selenium.webdriver.common.by import By
     
     import time
     
     driver = webdriver.Chrome()
     driver.get('https://testerhome.com/')
     driver.implicitly_wait(10)
     
     driver.find_element_by_link_text('【活动】MTSC 2021 深圳站议题征集').click()
     
     locator = (By.XPATH, '//*[@id="main"]/div/div[1]/div[1]/div[2]/div/button')
     WebDriverWait(driver, 6).until(EC.element_to_be_clickable(locator))
     driver.find_element(*locator).click()
     
     locator = (By.XPATH, '//*[@class="list-container"]/ul/li[6]/a')
     WebDriverWait(driver, 6).until(EC.element_to_be_clickable(locator))
     driver.find_element(*locator).click()
     
     time.sleep(3)
     driver.quit()
    
    WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
    driver:浏览器驱动
    timeout:最长超过时间,默认以秒为单位
    poll_frequency:监测的时间间隔,默认为0.5秒
    ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
    WebDriverWait一般有until和until_not方法配合使用
    until(method,message)
    until_not(method ,message)
    

    expected_conditions类提供的预期条件判断的方法

    方法 说明
    title_is 判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
    title_contains 判断当前页面的 title 是否包含预期字符串,返回布尔值
    presence_of_element_located 判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
    visibility_of_element_located 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于 0
    visibility_of 跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了
    presence_of_all_elements_located 判断是否至少有 1 个元素存在于 dom 树中。举个例子,如果页面上有 n 个元素的 class 都是'column-md-3',那么只要有 1 个元素存在,这个方法就返回 True
    text_to_be_present_in_element 判断某个元素中的 text 是否 包含 了预期的字符串
    text_to_be_present_in_element_value 判断某个元素中的 value 属性是否包含 了预期的字符串
    frame_to_be_available_and_switch_to_it 判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
    invisibility_of_element_located 判断某个元素中是否不存在于dom树或不可见
    element_to_be_clickable 判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable
    staleness_of 等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
    element_to_be_selected 判断某个元素是否被选中了,一般用在下拉列表
    element_selection_state_to_be 判断某个元素的选中状态是否符合预期
    element_located_selection_state_to_be 跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
    alert_is_present 判断页面上是否存在 alert
  2. selenium的隐式等待

    原理:隐式等待,相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。

    隐式等待使得WebDriver在查找一个Element或者Element数组时,如果一直查找不到,每隔一段特定的时间就会轮询一次DOM。

    注:默认设置超时时间为0,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    # 隐式等待10秒
    driver.implicitly_wait(10)
    

implicity_wait()默认参数的单位为秒,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。

应用场景

  • 隐式等待 尽量默认都加上,时间限定在3-6s,不要太长,这是为了所有的findElement方法都有一个很好的缓冲;
  • 显式等待 用来处理隐式等待无法解决的一些问题,如:文件上传;
  • 死等 一般不推荐。
posted @ 2021-08-21 16:40  wangyha  阅读(2335)  评论(0)    收藏  举报