使用Selenium开发LinkedIn自动投递机器人时元素定位失败
问题:Selenium定位LinkedIn「Jobs」元素失败,报错NoSuchElementException
我正在使用Python的Selenium库开发LinkedIn自动投递机器人,登录后无法定位页面上的「Jobs」元素,已尝试增加等待时长但问题仍未解决。
相关代码
类初始化与登录代码
from unicodedata import name from selenium import webdriver from selenium.webdriver.common.keys import Keys import json from selenium.webdriver.common.by import By from time import sleep from sympy import Id class EasyApplyLinkedIn (): def __init__(self,data): """param initialization""" self.email =data ["email"] self.password = data["password"] self.keywords = data["keywords"] self.location = data["location"] self.driver = webdriver.Chrome(r'ApplicationBot\\driver_path\\chromedriver.exe') def loginLinkedIn (self): self.driver.get("""https://www.linkedin.com/loginsession_redirect=https%3A%2F%2Fwww%2Elinkedin%2Ecom%2Fcompany%2Flogin&fromSignIn=true&trk=organization_guest_nav-header-signin""") ## Introduce email and password and hit enter login_email =self.driver.find_element(By.NAME,'session_key') login_email.clear () # basically use the sendkeys fxn to send our info to the page login_email.send_keys(self.email) login_password =self.driver.find_element(By.NAME,'session_password') login_password.clear () # basically use the sendkeys fxn to send our info to the page login_password.send_keys(self.password) login_password.send_keys(Keys.RETURN)
出现问题的job_search方法代码段
def job_search (self): ## clicking on the job button self.driver.implicitly_wait(5) searchDriver = self.driver.find_element() jobs_link =searchDriver(By.LINK_TEXT,'Jobs') clicl_jobs_link= searchDriver.click sleep (1) job_box = searchDriver(By.XPATH,"//*[@id='global-nav']/div/nav/ul/li[7]/button/div/div/li-icon/svg/path") searchDriver.clear() send_keyword = searchDriver.send_keys(self.keywords) sleep (1) ## specify location location_box = searchDriver(By.XPATH,"//input[starts-with(@id,'jobs-search-box-location']") #find via xml path expression searchDriver.clear() send_location = searchDriver.send_keys(self.location) sleep (1) ## hitting enter searchDriver.send_keys(Keys.RETURN)
报错信息
[9080:29296:0720/161241.697:ERROR:device_event_log_impl.cc(214)] [16:12:41.697] USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F) [9080:29296:0720/161241.716:ERROR:device_event_log_impl.cc(214)] [16:12:41.716] USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F) Traceback (most recent call last): File "e:\Job\ApplicationBot\main.py", line 79, in bot.job_search() File "e:\Job\ApplicationBot\main.py", line 44, in job_search searchDriver = self.driver.find_element() File "C:\Users\lihua\AppData\Roaming\Python\Python39\site- packages\selenium\webdriver\remote\webdriver.py", line 857, in find_element return self.execute(Command.FIND_ELEMENT, { File "C:\Users\lihua\AppData\Roaming\Python\Python39\site- packages\selenium\webdriver\remote\webdriver.py", line 435, in execute self.error_handler.check_response(response) File "C:\Users\lihua\AppData\Roaming\Python\Python39\site- packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="None"]"} (Session info: chrome=103.0.5060.114) Stacktrace: Backtrace: Ordinal0 [0x005756B3+2184883] Ordinal0 [0x0050E5F1+1762801] Ordinal0 [0x00423DA8+802216] Ordinal0 [0x00451B40+990016] Ordinal0 [0x00451DDB+990683] Ordinal0 [0x0047EC32+1174578] Ordinal0 [0x0046CB54+1100628] Ordinal0 [0x0047CF52+1167186] Ordinal0 [0x0046C926+1100070] Ordinal0 [0x00446EA0+945824] Ordinal0 [0x00447D96+949654] GetHandleVerifier [0x00814192+2704034] GetHandleVerifier [0x0080687D+2648461] GetHandleVerifier [0x0060119A+529066] GetHandleVerifier [0x00600006+524566] Ordinal0 [0x00514F2B+1789739] Ordinal0 [0x00519978+1808760] Ordinal0 [0x00519A65+1808997] Ordinal0 [0x00522A01+1845761] BaseThreadInitThunk [0x76CAFA29+25] RtlGetAppContainerNamedObjectPath [0x77A87A9E+286] RtlGetAppContainerNamedObjectPath [0x77A87A6E+238]
问题排查与修复方案
核心错误分析
- 无效的元素定位调用:
searchDriver = self.driver.find_element()这行代码未传入任何定位参数,Selenium默认使用CSS selector查找id="None"的元素,直接触发NoSuchElementException,这是报错的直接原因。 - 错误的API使用方式:后续代码将
searchDriver(本应是WebElement对象)当成定位方法调用(如searchDriver(By.LINK_TEXT,'Jobs')),完全不符合Selenium调用规范。 - 定位器语法错误:
- 位置搜索框的XPATH缺少闭合括号:
//input[starts-with(@id,'jobs-search-box-location']应改为//input[starts-with(@id,'jobs-search-box-location')] - 使用固定索引
li[7]定位Jobs元素不可靠,页面布局变化会导致定位失效。
- 位置搜索框的XPATH缺少闭合括号:
- 等待策略不够可靠:仅用隐式等待和
sleep,无法确保元素完全加载并可交互。
修复后的job_search方法
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def job_search(self): # 使用显式等待替代隐式等待,更可靠 wait = WebDriverWait(self.driver, 10) # 等待并定位Jobs导航链接 jobs_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Jobs'))) jobs_link.click() sleep(1) # 等待并定位职位关键词搜索框 job_box = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@id='jobs-search-box-keyword-id']"))) job_box.clear() job_box.send_keys(self.keywords) sleep(1) # 等待并定位位置搜索框,修复XPATH语法错误 location_box = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[starts-with(@id,'jobs-search-box-location')]"))) location_box.clear() location_box.send_keys(self.location) sleep(1) # 提交搜索 location_box.send_keys(Keys.RETURN)
额外优化建议
- 替换
By.LINK_TEXT为更稳定的定位器,比如By.XPATH, "//a[@data-link-to='jobs']",避免因语言/页面文本变化导致定位失败。 - 减少
sleep的使用,尽量用显式等待覆盖所有元素交互场景,提升代码稳定性。 - 注意LinkedIn的反爬机制,避免操作过于频繁,可适当增加随机等待时长。
内容的提问来源于stack exchange,提问作者lliu56
相关产品推荐
相关产品推荐

