Python爬虫之Selenium设置元素等待的方法

  • Post category:Python

Python爬虫之Selenium设置元素等待的方法

什么是Selenium?

Selenium是一个用于Web应用程序测试的工具,它支持各种浏览器,并且拥有强大的支持JS测试自动化的能力。

为什么需要设置元素等待?

Selenium模拟点击或输入等操作时,需要保证操作的元素已经在页面中完全加载出来,否则可能会出现异常。因此,需要在程序中设置元素等待,使程序等待元素出现在页面中。

设置元素等待的方法

Selenium提供了多种等待方法,常用的有如下几种:

1. 强制等待

强制等待是最为简单的等待方法,使用该方法需要知道需要等待的时间,如下所示:

import time
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')

time.sleep(5) # 强制等待5秒

input_box = driver.find_element_by_id("kw")
input_box.send_keys("Selenium")
search_btn = driver.find_element_by_id("su")
search_btn.click()

以上代码会等待5秒,再去寻找输入框和搜索按钮,这种方式简单粗暴,但不够智能。

2. 隐式等待

隐式等待是设置的全局等待,如果元素未在等待时间内出现,仍旧会抛出异常。相当于设置一个最长等待时间,例如:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")

input_box = driver.find_element_by_id("kw")
input_box.send_keys("Selenium")
search_btn = driver.find_element_by_id("su")
search_btn.click()

以上代码设置了全局隐式等待为10秒,如果5秒后仍未出现元素,则会抛出NoSuchElementException异常。

3. 显式等待

显式等待是针对特定元素的等待,只有特定元素触发了某种特定的事件才会执行下一步,如下所示:

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/")

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "kw"))
)
element.send_keys("Selenium")
search_btn = driver.find_element_by_id("su")
search_btn.click()

以上代码使用显式等待,等待最长时间为10秒,直到元素被定位,然后执行输入操作。

示例说明

示例1

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.taobao.com/")

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "q"))
)
element.send_keys("手机")
search_btn = driver.find_element_by_class_name("btn-search")
search_btn.click()

以上代码使用显式等待,等待最长时间为10秒,直到元素被定位,然后执行输入操作。

示例2

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.jd.com/")

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "key"))
)
element.send_keys("Python")
search_btn = driver.find_element_by_class_name("button")
search_btn.click()

以上代码使用显式等待,等待最长时间为10秒,直到元素被定位,然后执行输入操作。