Selenium元素等待

一、为什么要使用元素等待?

原因:由于电脑配置或者网络原因,在查找元素时,元素代码未在第一时间内被加载出来,而抛出未能找到元素的异常。

二、什么是元素等待?

元素在第一次未找到时,元素等待设置的时长被激活,如果在设置的有效时长内找到元素,继续执行代码,如果超出设置的时长未找到元素,抛出未找到元素异常。

三、元素等待分类

  • 隐式等待:全局元素有效
  • 显示等待:单个元素有效

四、隐式等待

1、概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException。

2、方法:(timeout:为等待最大时长,单位:秒)

driver.implicitly_wait(timeout) 

 说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)

3、案例:定位微博登录用户名输入框(因为打开页面需要加载,常常出现元素找不到异常) 

D:\Anaconda3\python.exe E:/Id/test_implicit_waiting.py
Traceback (most recent call last):
  File "E:/Id/test_implicit_waiting.py", line 12, in <module>
    driver.find_element_by_css_selector("#loginname").send_keys("微博")
  File "D:\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 598, in find_element_by_css_selector
    return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
  File "D:\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "D:\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "D:\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: #loginname


Process finished with exit code 1
from selenium import webdriver
from time import sleep
#获取浏览器对象
driver=webdriver.Firefox()
#页面需要加载,因此使用隐式等待10秒
driver.implicitly_wait(10)
#获取网络链接
url="https://weibo.com/"
driver.get(url)

#定位登录用户名,输入微博
driver.find_element_by_css_selector("#loginname").send_keys("微博")
sleep(3)
driver.quit()

运行效果:

五、显示等待

1、概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException。

在Selenium中把显式等待的相关方法封装在WebDriverWait类中

2、实现方法

(1)导包,等待类:from selenium.webdriver.support.wait import WebDriverWait

(2)WebDriverWait(driver,timeout,poll_frequency=0.5)

       ①driver:浏览器驱动对象

       ②timeout:超时的时长,单位秒

       ③poll_frequency:检测间隔时间,默认为0.5秒

(3)调用方法until(method):直到....时

        ①method:函数名称,该函数用来实现对元素的定位

        ②一般使用匿名函数来实现:lambda x: x.find_element_by_xxx("xxx")

(4)如:element=WebDriverWait(driver,10,1).until(lambda x: x.find_element_by_xxx("xxx")

3、案例:定位微博登录用户名输入框,输入“百度一下一下一下”

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
#获取浏览器对象
driver=webdriver.Firefox()

#获取网络链接
url="https://weibo.com/"
driver.get(url)

#定位登录用户名,输入微博,使用显式等待加载页面
#实例化WebDriverWait()并调用until方法(返回的是一个元素)
WebDriverWait(driver,timeout=30,poll_frequency=0.5).until(lambda x:x.find_element_by_css_selector("#loginname")).send_keys("百度一下一下")
sleep(3)
driver.quit()

实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值