使用Selenium WebDriver填充表单时出现AttributeError报错求助
问题
我用Selenium 4.7.2写了一段登录LinkedIn的代码,用来追踪求职信息,同时维持技能水平。完整代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.service import Service #from webdriver_manager.chrome import ChromeDriverManager #driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Set up the webdriver driver = webdriver.Chrome() # Navigate to the login page driver.get('https://www.linkedin.com/uas/login') # Enter your login credentials driver.find_element_by_id('username').send_keys('elksie@gmail.com') driver.find_element_by_id('password').send_keys('g') # Click the "Sign in" button driver.find_element_by_css_selector('button[type="submit"]').click() # Wait for the page to load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'jobs-search-box'))) # Navigate to the job search page driver.get('https://www.linkedin.com/jobs/search/?currentJobId=3424225432&keywords=data%20analyst&refresh=true') # Wait for the page to load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'job-card-container'))) # Extract the job data job_cards = driver.find_elements_by_class_name('job-card-container') for job_card in job_cards: title = job_card.find_element_by_class_name('job-card-container__title').text company = job_card.find_element_by_class_name('job-card-container__subtitle').text location = job_card.find_element_by_class_name('job-card-container__bullet').text print(title, company, location) # Close the browser driver.close()
执行登录相关代码时:
driver.find_element_by_id('username').send_keys('elksie@gmail.com') driver.find_element_by_id('password').send_keys('g')
触发错误:
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'
解决方案
错误原因
Selenium 4.x 已经彻底弃用了find_element_by_id、find_element_by_class_name这类旧版元素定位API,统一要求使用find_element()配合By枚举类的方式来定位元素。你的代码里虽然导入了By,但还是用了旧方法,所以抛出属性不存在的错误。
修改方法
把所有旧的定位方法替换成Selenium 4.x的标准写法:
find_element_by_id("xxx")→find_element(By.ID, "xxx")find_element_by_class_name("xxx")→find_element(By.CLASS_NAME, "xxx")find_element_by_css_selector("xxx")→find_element(By.CSS_SELECTOR, "xxx")- 批量元素定位同理,
find_elements_by_xxx改成find_elements(By.XXX, "xxx")
修改后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 可选:自动管理ChromeDriver版本 # from webdriver_manager.chrome import ChromeDriverManager # 初始化浏览器,如果用webdriver-manager就注释下面一行,用注释的那行 driver = webdriver.Chrome() # driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) # 打开登录页 driver.get('https://www.linkedin.com/uas/login') # 输入账号密码 driver.find_element(By.ID, 'username').send_keys('elksie@gmail.com') driver.find_element(By.ID, 'password').send_keys('g') # 点击登录按钮 driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click() # 等待首页加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'jobs-search-box'))) # 跳转到职位搜索页 driver.get('https://www.linkedin.com/jobs/search/?currentJobId=3424225432&keywords=data%20analyst&refresh=true') # 等待职位卡片加载 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'job-card-container'))) # 提取职位信息 job_cards = driver.find_elements(By.CLASS_NAME, 'job-card-container') for job_card in job_cards: title = job_card.find_element(By.CLASS_NAME, 'job-card-container__title').text company = job_card.find_element(By.CLASS_NAME, 'job-card-container__subtitle').text location = job_card.find_element(By.CLASS_NAME, 'job-card-container__bullet').text print(title, company, location) # 关闭浏览器 driver.close()
额外提示
- 代码里重复导入了
webdriver和Service,已经帮你精简掉了 - 推荐启用
webdriver-manager,它会自动下载匹配当前Chrome版本的驱动,避免手动维护驱动版本的麻烦
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

