返回

循环获取 Selenium 元素值时遇到空列表怎么办?

python

Selenium 循环获取元素值:空列表的困境

问题

使用 Selenium 获取 Web 元素值时,在循环中得到空列表,让你抓狂不已。这可能归因于元素加载缓慢或异步加载,导致 Selenium 无法立即获取它们。

解决方案:显式等待

解决这个问题的最佳方法是使用 Selenium 的显式等待。显式等待显式等待元素加载,直到元素出现或等待超时。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

elements = driver.find_elements(By.CSS_SELECTOR, "selector")

for element in elements:
    WebDriverWait(element, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "selector")))

    # 获取元素值

为什么显式等待更好?

显式等待比 time.sleep() 更可靠,因为它专门针对等待 Web 元素而设计。它会不断检查元素是否存在,直到元素出现或超时,从而避免不必要的等待。

实践中的运用

让我们以循环获取表格中的所有行数据为例:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

rows = driver.find_elements(By.CSS_SELECTOR, "table tr")

for row in rows:
    WebDriverWait(row, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "td")))

    # 获取行中列的数据

常见问题解答

  • Q:显式等待的等待时间如何设置?
    A:等待时间应根据页面加载速度和元素的复杂性而定。通常 10-15 秒足以应付大多数情况。

  • Q:如果元素始终不存在怎么办?
    A:在这种情况下,显式等待将超时。你可以使用其他方法来处理不存在的元素,例如隐式等待或超时处理。

  • Q:显式等待是否会影响性能?
    A:是的,显式等待会引入一些延迟。但是,与得到空列表或不完整数据相比,等待可靠的数据更重要。

  • Q:显式等待与隐式等待有什么区别?
    A:显式等待为特定元素设置等待时间,而隐式等待为所有元素设置全局等待时间。显式等待更灵活且更适合需要等待特定元素的情况。

  • Q:除了显式等待,还有什么方法可以处理动态加载的元素?
    A:除了显式等待,还可以使用 JavaScriptExecutor、Ajax、AJAX 轮询或异步编程等技术来处理动态加载的元素。

结论

使用显式等待可以有效解决在循环中获取 Selenium 元素值时得到空列表的问题。通过显式等待特定元素加载,你可以确保获得完整可靠的数据,从而提高测试的准确性。