显式等待:
显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。简单的说就是在指定时间内,一直等待某个条件成立,条件成立后立即执行定位元素的操作;如果超过这个时间条件仍然没有成立,则会抛出异常!显式等待需要使用 selenium.webdriver.support.excepted_conditions 期望条件和 selenium.webdriver.support.ui.WebDriverWait 类来配合完成。
隐式等待:
隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。如果某些元素不是立即可用的,隐式等待是告诉 WebDriver 去等待一定的时间后去查找元素。默认等待时间是0秒,一旦设置该值,隐式等待是设置该 WebDriver 的实例的生命周期。这样的隐式等待会有个坑,有些页面的JS是放在body的最后进行加载,实际这是页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。
需要特别说明的是:隐性等待对整个 driver 的周期都起作用,所以只要设置一次即可(在最开始设置一次就可以了),切不要当作固定等待使用。 熟悉了什么是显式等待和隐式等待,下面就让我们来看看怎么使用这两种等待吧。
1、显式等待
显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。
1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 from selenium.webdriver.support.ui import WebDriverWait 4 from selenium.webdriver.support import expected_conditions 5 6 driver = webdriver.Chrome() 7 driver.get("url") 8 9 locator = (By.ID, "你的标签ID") 10 11 # 显式等待:条件成立,立即执行;超过指定时间则报错 12 WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located(locator)) 13 driver.find_element_by_id("你的标签ID").click() 14 # 或 15 element = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.ID, "你的标签ID"))) 16 element.click()
注意:传入的定位条件必须是元组形式。
代码说明:
WebDriverWait(driver, 10):设置了一个10秒上限的等待时间。在指定时间内,一直等待某个条件成立,条件成立后立即执行定位元素的操作;如果超过这个时间条件仍然没有成立,则会抛出 TimeoutException 异常!
expected_conditions:后面是自动化的Web浏览器中一些常用的预期条件。请参考 https://blog.csdn.net/kelanmomo/article/details/82886718
WebDriverWait参数:
- driver:传入WebDriver实例,即我们上例中的driver
- timeout:超时时间,等待的最长时间
- poll_frequency:调用until或until_not中的方法的间隔时间,默认是0.5秒
- ignored_exceptions:忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
这个模块中,一共只有两种方法 until 与 until_not:
- until:当某元素出现或什么条件成立则继续执行
- until_not:当某元素消失或什么条件不成立则继续执行
until 与 until_not 参数如下:
- method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
- message:如果超时,抛出TimeoutException,将message传入异常
2、隐式等待
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
1 from selenium import webdriver 2 3 driver = webdriver.Chrome() 4 # 隐式等待:最长等待10秒钟往下执行 5 driver.implicitly_wait(10) 6 driver.get("url") 7 # 执行定位元素操作 8 element = driver.find_element_by_id("标签ID")
注意:隐式等待和显示等待都存在时,超时时间取二者中较大的。
原文链接:https://blog.csdn.net/xhaimail/article/details/104891037
posted on
浙公网安备 33010602011771号