Selenium设置元素等待的三种方式

一、强制等待

  • sleep()
from time import sleep()  # 导包
sleep(3)  #设置等待3秒钟

优点:代码简洁,简单明了。

缺点:如果设置sleep等待时间过短,元素还没加载出来,程序报错,sleep设置等待时间过长,元素早就加载出来了,程序还在等待,浪费是时间,影响代码整体的运行效率。

 

二、隐性等待

  • implicitly_wait()
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(20)    # 设置等待20秒钟
driver.get('https://www.baidu.com')

优点:

  1. 代码简洁,简单明了。
  2. 在代码前部分加implicitly_wait(10) ,整个的程序运行过程中都会有效(作用于全局,直接在初始化driver的后面加,后面的代码都会受影响),都会等待元素加载完成
  3. 在设置的时间内没有加载到整个页面,则会报NosuchElementError。如果元素在第10s被加载出来,自动执行下面的脚本,不会一直等待10s

缺点:非要加载到整个页面才执行代码,这样影响代码的执行效率,一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。

      当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。

 

三、显示等待

  • WebDriverWait()

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

  • driver:浏览器驱动
  • timeout:最长超时时间,默认以秒为单位
  • poll_frequency:检测的间隔步长,默认为0.5s
  • ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

与until()或者until_not()方法结合使用

  • WebDriverWait(driver,10).until(method,message="")  # 调用该方法提供的驱动程序作为参数,直到返回值为True
  • WebDriverWait(driver,10).until_not(method,message="")  # 调用该方法提供的驱动程序作为参数,直到返回值为False

 

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait  # WebDriverWait注意大小写
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
try:
  element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
  element.send_keys('123')
  driver.find_element_by_id('su').click()
except Exception as message:
  print('元素定位报错%s'%message)
finally:
  pass

方法说明:

    • title_is:判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
    • title_contains:判断当前页面的 title 是否包含预期字符串,返回布尔值
    • presence_of_element_located:判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
    • visibility_of_element_located:判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0)
    • visibility_of:同上一方法,只是上一方法参数为locator,这个方法参数是 定位后的元素
    • presence_of_all_elements_located:判断是否至少有 1 个元素存在于 dom 树中。举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 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:判断某个元素中是否可见并且可点击
    • 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

优点:代码执行效率快。无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行代码。是最智能的设置元素等待的方式。

缺点:

1.必须要导入以上3个包,导包路径相当的复杂,啰嗦而且麻烦

  • from selenium.webdriver.support import expected_conditions as EC
  • from selenium.webdriver.support.ui import WebDriverWait
  • from selenium.webdriver.common.by import By

2.写等待时间的代码也是复杂。步骤稍微有点多。

  • element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘kw’)))

 

posted @ 2023-08-20 21:18  清宵入梦  阅读(1178)  评论(0)    收藏  举报