Selenium WebDriver无find_element_by_link_text属性报错解决方法
问题根因
报错和代码逻辑、Chrome/Chromedriver配置无关,是Selenium版本自动升级后旧API被移除导致的。
Selenium 4.3.0及以上版本正式删除了所有find_element_by_*系列简写定位方法,包括你用到的find_element_by_link_text、find_element_by_class_name、find_element_by_id等。Google Colab每次重置运行环境后,执行无版本号的pip install selenium会默认安装最新版Selenium,你首次运行时环境预装的是4.3.0以下的旧版本,次日重连环境后自动安装了新版,调用已删除的旧方法就会抛出AttributeError。
代码中driver.title能正常返回页面标题,已经说明浏览器驱动初始化、页面访问流程完全正常,故障点仅在元素定位的API调用环节。
修复方案
两种方案选其一即可:
方案1:固定Selenium版本(零代码修改快速修复)
将Selenium安装命令指定为兼容旧API的版本,原有业务代码不需要做任何改动即可运行:
!pip install selenium==4.2.0 !apt-get update !apt install chromium-chromedriver from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver',options=chrome_options) driver.get("https://petrowiki.spe.org/PetroWiki") driver.title peh = driver.find_element_by_link_text('Pet. Eng. Handbook') peh.click()
方案2:适配新版Selenium标准API(长期维护推荐)
不降级Selenium版本,改用官方后续长期维护的统一find_element接口,配合By类声明定位方式,避免后续版本迭代再出现API兼容问题。
修正后的完整代码:
!pip install selenium !apt-get update !apt install chromium-chromedriver from selenium import webdriver from selenium.webdriver.common.by import By chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver',options=chrome_options) driver.get("https://petrowiki.spe.org/PetroWiki") driver.title peh = driver.find_element(By.LINK_TEXT, 'Pet. Eng. Handbook') peh.click()
其余旧定位方法的替换规则统一如下:
find_element_by_id(val)→find_element(By.ID, val)find_element_by_class_name(val)→find_element(By.CLASS_NAME, val)find_element_by_xpath(val)→find_element(By.XPATH, val)find_element_by_css_selector(val)→find_element(By.CSS_SELECTOR, val)find_element_by_name(val)→find_element(By.NAME, val)find_element_by_tag_name(val)→find_element(By.TAG_NAME, val)find_element_by_partial_link_text(val)→find_element(By.PARTIAL_LINK_TEXT, val)
如果是定位多个元素的find_elements_by_*系列方法,替换逻辑完全一致,仅需将方法名替换为find_elements即可。
内容的提问来源于stack exchange,提问作者Mohammad Haris
相关产品推荐
相关产品推荐

