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

Selenium:修复无法定位联系人搜索页面的路径选择器问题

问题:Selenium脚本登录后无法进入联系人搜索页面,原XPATH定位失效

问题描述

此前正常运行的Selenium脚本,近期登录成功后无法定位联系人搜索按钮,抛出TimeoutException。推测是网站布局变更导致原有XPATH失效。

出错代码片段

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
import re

# Username and Password
username = "XXXX"
password = "yyyyy"

### Web Driver Setting
### 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(service=chrome_service)
driver.maximize_window()
driver.implicitly_wait(30)
# driver.get(('https://www.editorialmanager.com/ijrm/default1.aspx'))
driver.get(("https://www.editorialmanager.com/ijrm/default2.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"]'))
).click()
sleep(3)

报错信息

Traceback (most recent call last):
  File "C:\Users\owner\Documents\Python\webscrape.py", line 52, in <module>
    wait.until(
  File "C:\Users\owner\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\support\wait.py", line 95, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 
Stacktrace:
    GetHandleVerifier [0x00007FF7A8D01502+60802]
    (No symbol) [0x00007FF7A8C7AC02]
    (No symbol) [0x00007FF7A8B37CE4]
    (No symbol) [0x00007FF7A8B86D4D]
    (No symbol) [0x00007FF7A8B86E1C]
    (No symbol) [0x00007FF7A8BCCE37]
    (No symbol) [0x00007FF7A8BAABBF]
    (No symbol) [0x00007FF7A8BCA224]
    (No symbol) [0x00007FF7A8BAA923]
    (No symbol) [0x00007FF7A8B78FEC]
    (No symbol) [0x00007FF7A8B79C21]
    GetHandleVerifier [0x00007FF7A900411D+3217821]
    GetHandleVerifier [0x00007FF7A90460B7+3488055]
    GetHandleVerifier [0x00007FF7A903F03F+3459263]
    GetHandleVerifier [0x00007FF7A8DBB846+823494]
    (No symbol) [0x00007FF7A8C85F9F]
    (No symbol) [0x00007FF7A8C80EC4]
    (No symbol) [0x00007FF7A8C81052]
    (No symbol) [0x00007FF7A8C718A4]
    BaseThreadInitThunk [0x00007FFF23DC257D+29]
    RtlUserThreadStart [0x00007FFF247EAA48+40]

解决方案

1. 重新获取元素的有效定位器

  • 打开浏览器开发者工具(F12),登录目标网站后找到联系人搜索按钮:
    • 优先复制元素的ID(如果存在),比XPATH更稳定;
    • 若没有ID,复制包含按钮文本的XPATH(如//*[contains(text(), 'Search People')]),或基于元素的class、data属性生成定位器;
    • 确认元素是否在iframe内:在Elements面板中查看元素的层级,若被嵌套在iframe中,需先切换到对应iframe再定位。

2. 修复iframe切换逻辑

原代码的iframe切换可能因页面结构变更失效,修改为显式等待iframe加载:

driver.switch_to.default_content()
# 显式等待content frame加载完成,改用ID定位更可靠
content_frame = wait.until(EC.presence_of_element_located((By.ID, "content")))
driver.switch_to.frame(content_frame)

3. 优化等待策略,避免等待冲突

  • 删除所有driver.implicitly_wait()调用,避免与WebDriverWait(显式等待)冲突;
  • 替换所有sleep()为显式等待,根据元素状态设置等待条件,提升脚本稳定性。

4. 替换失效的按钮定位代码

假设新的按钮可用文本定位,修改后的代码示例:

# ### Going to the Search People Page
driver.switch_to.default_content()
wait = WebDriverWait(driver, 60)
# 等待content frame加载并切换
content_frame = wait.until(EC.presence_of_element_located((By.ID, "content")))
driver.switch_to.frame(content_frame)
# 用新的定位器等待按钮可点击后点击
search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Search People')]")))
search_btn.click()

5. 调试技巧

  • 在报错前添加截图:driver.save_screenshot("post_login_page.png"),查看登录后页面的实际状态;
  • 打印当前页面源码:print(driver.page_source),搜索按钮的文本或属性,验证元素是否存在于当前DOM中。

内容的提问来源于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.25 01:02:22