当使用selenium库对网页进行自动化测试时,由于网络环境、网页内容等因素,可能会出现代码执行速度与页面加载速度不同步的情况,为了解决这个问题,我们需要用到等待机制。
在selenium中,常用的等待方式有三种:隐式等待、显式等待和JavaScript等待。
一、隐式等待
隐式等待是在代码中进行全局设置,一旦设置后,对后续操作都有效。具体实现方式为在创建driver对象后,调用driver对象的implicitly_wait方法,设置等待时间,单位为秒。之后,在执行每个查找元素或者其他操作时,如果元素没有被找到,会等待若干秒再次查找,直到超过设置的等待时间后仍然没有找到元素,就会抛出NoSuchElementException异常。
隐式等待的优点是设置一次后对整个代码都有效,避免了不必要的代码重复,但是有时候效率不够高,因为代码执行速度与网页加载速度可能不一致。
示例1:
from selenium import webdriver
driver = webdriver.Chrome()
# 设置隐式等待时间为10秒
driver.implicitly_wait(10)
# 打开百度首页
driver.get("https://www.baidu.com")
# 查找输入框
search_input = driver.find_element_by_id("kw")
# 输入搜索内容
search_input.send_keys("Selenium")
# 查找搜索按钮
search_button = driver.find_element_by_id("su")
# 点击搜索按钮
search_button.click()
# 关闭浏览器
driver.quit()
示例2:
from selenium import webdriver
driver = webdriver.Chrome()
# 设置隐式等待时间为10秒
driver.implicitly_wait(10)
# 打开慕课网首页
driver.get("https://www.imooc.com")
# 查找所有课程元素
courses = driver.find_elements_by_css_selector(".course-card-container .course-card")
# 打印课程数量
print("共有{0}门课程".format(len(courses)))
# 关闭浏览器
driver.quit()
二、显式等待
显式等待是在代码中进行局部设置,就是在代码的特定位置等待某一条件出现。通过调用WebDriverWait对象的until或者until_not方法,指定需要等待的条件,如出现某个元素,然后设置最长等待时间,单位为秒。
具体实现方式为先定义一个WebDriverWait对象,然后调用expected_conditions模块中的一些预定义条件,比如element_to_be_clickable(查找元素并且该元素可被点击)等,此外,也可以自定义等待条件方法。然后通过调用这个对象的until或until_not方法来等待条件成立或者超时。
显式等待的优点是灵活性高,可以在特定的位置等待,而且可以手动设置等待条件,缺点是容易产生代码冗余。
示例1:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
# 打开慕课网登录页面
driver.get("https://www.imooc.com/user/newlogin")
# 定义WebDriverWait对象,最长等待时间为10秒
wait = WebDriverWait(driver, 10)
# 等待页面中的登录方式出现
login_type = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "js-loginTab-item.loginTab-item")))
# 点击切换登录方式按钮
login_type.click()
# 关闭浏览器
driver.quit()
示例2:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
# 打开百度搜索页面
driver.get("https://www.baidu.com/s?ie=utf-8&wd=selenium")
# 定义WebDriverWait对象,最长等待时间为10秒
wait = WebDriverWait(driver, 10)
# 等待搜索结果元素列表出现
results = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#content_left .result.c-container")))
# 打印搜索结果数量
print("共找到{0}个搜索结果".format(len(results)))
# 关闭浏览器
driver.quit()
三、JavaScript等待
JavaScript等待是通过执行一段JavaScript代码来等待某个条件的出现。具体实现方式为调用execute_script方法,然后在传入的JavaScript代码中实现等待条件,调用window.setTimeout方法实现等待,返回结果是一个jQuery对象。
JavaScript等待的优点是自由度高,可以通过自定义JavaScript实现各种等待条件,缺点是需要熟悉JavaScript语法。
示例1:
from selenium import webdriver
driver = webdriver.Chrome()
# 打开百度搜索页面
driver.get("https://www.baidu.com")
# 等待两秒钟
driver.execute_script("window.setTimeout(function() { return true; }, 2000);")
# 查找输入框
search_input = driver.find_element_by_id("kw")
# 输入搜索内容
search_input.send_keys("Selenium")
# 查找搜索按钮
search_button = driver.find_element_by_id("su")
# 点击搜索按钮
search_button.click()
# 关闭浏览器
driver.quit()
示例2:
from selenium import webdriver
driver = webdriver.Chrome()
# 打开慕课网首页
driver.get("https://www.imooc.com")
# 等待三秒钟
driver.execute_script("window.setTimeout(function() { return true; }, 3000);")
# 查找所有课程元素
courses = driver.find_elements_by_css_selector(".course-card-container .course-card")
# 打印课程数量
print("共有{0}门课程".format(len(courses)))
# 关闭浏览器
driver.quit()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python selenium 三种等待方式解读 - Python技术站