现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待
隐式等待:
调用driver.implicitly_wait(),那么在获取不可用的元素之前,会先等待一段时间再进行访问
1 2 3 4 5 6 7 8 9 |
from selenium import webdriver driver_path = r"E:\chromedriver\chromedriver.exe" driver = webdriver.Chrome(driver_path) driver.get("https://www.douban.com") driver.implicitly_wait(5) #让程序先等待5秒再进行获取操作 driver.find_element_by_id("aaaaaaaaaaaa") |
这个代码执行之后会发现在浏览器起来之后要等待5秒钟之后才会报出找不到元素的异常
显式等待:
显式等待是表明某个条件成立后才执行获取元素行为,也可以在等待的时候指定一个最大的时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.common.by import By driver_path = r"E:\chromedriver\chromedriver.exe" driver = webdriver.Chrome(driver_path) driver.get("https://www.douban.com") WebDriverWait(driver,5).until( #5秒之内获取到元素就不再等待了,如果没有最多等待5秒 ec.presence_of_element_located((By.ID,"aaaaa")) #这个函数的意思是某一个元素已经被加载进来,通过ID的查找方式 ) |

ID不存在就会在10s等待只有报错
ec.presence_of_element_located((By.ID,”anony-nav”))
如果获取的元素存在就不会等待时间了
常用显示等待中的条件:
1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值
2.title_contains:判断当前页面的title是否包含预期字符串,返回布尔值
3.presence_of_element_located:判断某个元素是否被加到dom树下,不代表该元素一定可见
4.visibility_of_element_located:判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不为0
5.visibility_of:跟上面的方法是一样的,只是上面需要传入locator,这个方法直接传定位到的element就好
6.presence_of_all_elements_located:判断是否至少一个元素存在于dom树中,举个例子,如果页面上有n个元素的class都是’coumn-md-3’,name只要有一个元素存在,这个方法就返回True
7.text_to_be_present_in_element:判断某个元素中的text文本是否包含预期字符串
8.text_to_be_present_in_element_value:判断某个元素中的value属性值是否包含了预期字符串
9.frame_to_be_availabe_and_switch_to_it:判断该frame是否可以switch进去,如果可以,则返回True并且switch进去,否则返回False
10.invisibility_of_element_located:判断某个元素是否不存在于dom树或不可见
11.element_to_be_clickable:判断某个元素是见并且是enable(有效)的,这样的话才叫clickable
12.staleness_of:等某个元素从dom树下移除,返回True或False
13.element_to_be_selected:判断某个元素是否被选中,一般用于select下拉表
14.element_selection_state_to_be:判断某个元素的选中状态是否符合预期
15.element_located_selection_state_to_be:跟上面的方法一样,只是上面的方法传入定位到的element,这个方法传入locator
16.alert_is_present:判断页面上是会否存在alert