You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium脚本登录后无法定位可点击链接,如何修复?

解决Selenium定位链接超时问题

我编写了一个从网站爬取联系人并导出至CSV文件的Python脚本,问题在于登录网站后,尽管已指定链接ID,仍无法找到需要点击的链接,在定位链接的代码行出现超时错误。以下是登录及查找按钮的脚本片段:

### Download new version of ChromeDriver into same folder
driver_path = "C:/Users/owner/Downloads/chromedriver-win64/chromedriver-win64/chromedriver.exe"
chrome_service = ChromeService(executable_path=driver_path)
#options=webdriver.ChromeOptions()
#driver = webdriver.Chrome(service=chrome_service, options=options)
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(30)
# driver.get(('https://www.editorialmanager.com/ijrm/default1.aspx'))
driver.get(("https://www.editorialmanager.com/ijrm/default1.aspx"))

sleep(10)
driver.switch_to.default_content()
# FINDING an input:
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="content"]'))
driver.switch_to.frame(
    driver.find_element(By.XPATH, "/html/body/table[2]/tbody/tr/td[2]/iframe")
)
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(username)
driver.find_element(By.XPATH, '//input[@id="passwordTextbox"]').send_keys(password)

driver.implicitly_wait(10)
driver.find_element(By.XPATH, '//*[@id="emLoginButtonsDiv"]/input[3]').click()
driver.implicitly_wait(10)
sleep(5)

# ### Going to the Search People Page
driver.switch_to.default_content()
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="content"]'))
wait = WebDriverWait(driver, 60)
##wait.until(
##    EC.element_to_be_clickable((By.XPATH, '//*[@id="ctl00_Folders_SearchPeople"]'))
wait.until(EC.visibility_of_element_located((By.ID, 'lnkSearchPeople')))
wait.until(EC.element_to_be_clickable((By.ID, 'lnkSearchPeople'))).click()
sleep(3)

目标按钮的HTML结构截图:
HTML中目标按钮的结构


修复方案:

  • 确保iframe切换正确:登录后页面可能重新加载iframe结构,不要直接切换到之前的content frame,改用显式等待确认iframe存在后再切换,避免页面未加载完成导致定位失败:
    driver.switch_to.default_content()
    # 显式等待content frame出现
    content_frame = wait.until(EC.presence_of_element_located((By.ID, 'content')))
    driver.switch_to.frame(content_frame)
    
  • 禁止混合隐式与显式等待:脚本中同时使用driver.implicitly_wait()和WebDriverWait会互相干扰,删除所有implicitly_wait调用,统一用显式等待。
  • 优化元素定位符:从截图看元素ID确实是lnkSearchPeople,可尝试结合文本的XPATH提升稳定性,降低动态元素定位风险:
    wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@id="lnkSearchPeople" and contains(text(), "Search People")]'))).click()
    
  • 指定正确ChromeDriver路径:脚本中注释了driver_path的调用,直接用webdriver.Chrome()可能出现版本不兼容,恢复指定路径的代码:
    driver = webdriver.Chrome(service=chrome_service, options=options)
    
  • 替换硬等待为显式等待:删除sleep(),改用等待页面标题变化或元素出现的方式,提升脚本稳定性。

修改后的关键代码片段:

# 初始化driver,指定ChromeDriver路径
driver_path = "C:/Users/owner/Downloads/chromedriver-win64/chromedriver-win64/chromedriver.exe"
chrome_service = ChromeService(executable_path=driver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=chrome_service, options=options)
driver.maximize_window()
wait = WebDriverWait(driver, 60)

# 打开登录页
driver.get("https://www.editorialmanager.com/ijrm/default1.aspx")

# 切换到登录所需的iframe
driver.switch_to.default_content()
content_frame = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="content"]')))
driver.switch_to.frame(content_frame)
login_frame = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/table[2]/tbody/tr/td[2]/iframe")))
driver.switch_to.frame(login_frame)

# 输入账号密码并登录
wait.until(EC.visibility_of_element_located((By.ID, 'username'))).send_keys(username)
wait.until(EC.visibility_of_element_located((By.ID, 'passwordTextbox'))).send_keys(password)
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="emLoginButtonsDiv"]/input[3]'))).click()

# 登录后回到默认上下文,切换到目标iframe
driver.switch_to.default_content()
content_frame_after_login = wait.until(EC.presence_of_element_located((By.ID, 'content')))
driver.switch_to.frame(content_frame_after_login)

# 等待并点击Search People按钮
wait.until(EC.element_to_be_clickable((By.ID, 'lnkSearchPeople'))).click()

内容的提问来源于stack exchange,提问作者Omer Rudnick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:25:21