Selenium Python如何使用find_elements_by_class_name点击目标元素
问题原因
你当前用find_elements_by_class_name('test-section-container')查找的是外层大容器元素,从给出的HTML结构来看,页面里只有1个test-section-container类的元素,所以返回的results列表长度只有1,调用results[1]自然会报数组越界错误。你之前点击results[0]能跳转到第一篇文章,是因为点击容器时触发了内部第一个可点击子元素的事件而已。
解决方法
你应该定位test-section-container内部的可点击子条目元素,代码修改如下:
driver.get("http://www.testwesbite.org/#/newsarticles") # 先拿到外层容器 section_container = driver.find_element_by_class_name('test-section-container') # 查找容器内所有可点击的新闻条目,这里用xpath匹配带cursor:pointer样式的子div,也可以根据实际结构调整定位规则 news_items = section_container.find_elements_by_xpath('./div[contains(@style,"cursor: pointer")]') # 点击第二篇直接取索引1即可 # 如果需要先点第一篇再点第二篇,记得加返回上一页和元素加载等待的逻辑 # news_items[0].click() # driver.back() # 等待页面加载完成后再点击第二篇 news_items[1].click()
补充说明
如果页面是动态加载的,建议在查找元素前增加显式等待,避免元素还没加载完成就查找导致返回空列表:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待外层容器加载完成 wait = WebDriverWait(driver, 10) section_container = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'test-section-container')))
如果子div的样式可能变动,也可以换其他定位规则,比如匹配包含新闻标题和日期的父div,只要能准确识别到每一条新闻的外层可点击元素即可。
内容的提问来源于stack exchange,提问作者Gee1983
相关产品推荐
相关产品推荐

