使用Selenium如何点击所有文本为'08/28'的span元素?
问题核心原因
你代码的核心问题是调用了错误的元素查找方法:
find_element_by_xpath仅返回匹配XPath规则的第一个元素,本身不是可迭代对象,遍历会直接抛出类型错误。要获取所有匹配的元素,必须使用find_elements_by_xpath方法,该方法返回所有符合条件的元素列表,支持遍历操作。- 你的代码缺失
time模块导入,执行到time.sleep时会抛出未定义错误。
修改后的完整代码
import scrapy import time from selenium import webdriver class CenturyasiaxinbeiSpider(scrapy.Spider): name = 'CenturyasiaXinbei' allowed_domains = ['www.centuryasia.com.tw', '211.21.63.217:81'] start_urls = ['http://211.21.63.217:81/ticket_online.aspx'] def __init__(self): print('__init__') self.driver = webdriver.Chrome('/Users/motogod19/chromedriver') self.driver.get('http://211.21.63.217:81/ticket_online.aspx') def parse(self, response): # 使用find_elements获取所有文本为08/28的span元素 allSpanDate = self.driver.find_elements_by_xpath("//span[text()='08/28']") for spanDate in allSpanDate: # 可选:如果元素不在可视区域,先滚动到元素位置再点击避免报错 self.driver.execute_script("arguments[0].scrollIntoView();", spanDate) spanDate.click() time.sleep(10)
特殊场景适配
如果点击部分元素后页面发生DOM刷新、元素重绘,之前获取的allSpanDate列表会失效,抛出StaleElementReferenceException错误,这种情况可以改成按索引循环重新获取元素:
def parse(self, response): # 先获取匹配元素总数量 span_count = len(self.driver.find_elements_by_xpath("//span[text()='08/28']")) for i in range(span_count): # 每次点击前重新获取最新的元素列表 spanDate = self.driver.find_elements_by_xpath("//span[text()='08/28']")[i] self.driver.execute_script("arguments[0].scrollIntoView();", spanDate) spanDate.click() time.sleep(10)
Selenium 4.0+ 版本适配
如果你的Selenium版本为4.0及以上,find_elements_by_xpath方法已被官方废弃,需要改用以下写法:
- 先导入By类:
from selenium.webdriver.common.by import By
- 替换元素查找代码:
allSpanDate = self.driver.find_elements(By.XPATH, "//span[text()='08/28']")
内容的提问来源于stack exchange,提问作者Morton
相关产品推荐
相关产品推荐

