Python Selenium工业相机网页自动登录脚本故障排查求助
工业相机网页登录自动化脚本故障排查
我正在用Python结合Selenium编写脚本,自动打开工业相机的网页并完成登录查看内容。脚本能打开Chrome并导航到目标页面,但延迟后窗口直接关闭,始终无法完成登录。试过用HTML元素的ID、name作为定位器,都没解决问题。
我的Python代码
import time from selenium import webdriver # import yaml # conf = yaml.load(open('loginDetails.yml')) # myLogin = conf['camera_user']['username'] # myPassword = conf['camera_user']['password'] myLogin = "operator" myPassword = "" driver = webdriver.Chrome() def login(url,usernameId, username, passwordId, password, submit_buttonId): driver.get(url) driver.find_element(usernameId).send_keys(username) driver.find_element(passwordId).send_keys(password) driver.find_element(submit_buttonId).click() login("http://192.168.0.60/pages/hmi/", "dc608255-0d87-4f6e-9115-62d8621f104c", myLogin, "03b9beea-df2a-4738-a3a9-d2d4ec1c5517", myPassword, "75ec946e-6c5d-4e6c-8429-75161a1cc83b")
运行时的堆栈跟踪信息
(No symbol) [0x00007FF60309BA4C] (No symbol) [0x00007FF60307B983] (No symbol) [0x00007FF603047628] (No symbol) [0x00007FF603048791] GetHandleVerifier [0x00007FF6034EA00D+3161901] GetHandleVerifier [0x00007FF60353E060+3506048] GetHandleVerifier [0x00007FF60353400D+3465005] GetHandleVerifier [0x00007FF6032B0EEB+830987] (No symbol) [0x00007FF60316467F] (No symbol) [0x00007FF6031609D4] (No symbol) [0x00007FF603160B6D] (No symbol) [0x00007FF603150149] BaseThreadInitThunk [0x00007FFE53BB7374+20] RtlUserThreadStart [0x00007FFE5483CC91+33] PS C:\Users\pjw56q> & C:/Users/pjw56q/AppData/Local/Programs/Python/Python311/python.exe d:/cameralogin/WebsitesLoginAutomation.py DevTools listening on ws://127.0.0.1:49281/devtools/browser/5c9bc2ed-a98a-43e6-99fe-e2fb16d04ee9 Traceback (most recent call last): File "d:\cameralogin\WebsitesLoginAutomation.py", line 21, in <module> login("http://192.168.0.60/pages/hmi/", "UserTextBox", myLogin, "PasswordTextBox", myPassword, "LoginButton") File "d:\cameralogin\WebsitesLoginAutomation.py", line 17, in login driver.find_element(usernameId).send_keys(username) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\pjw56q\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 766, in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\pjw56q\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 380, in execute self.error_handler.check_response(response) File "C:\Users\pjw56q\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 229, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator (Session info: chrome=130.0.6723.70) Stacktrace: GetHandleVerifier [0x00007FF6034C38A5+3004357] (No symbol) [0x00007FF603159970] (No symbol) [0x00007FF60300582A] (No symbol) [0x00007FF603055945] (No symbol) [0x00007FF603055E7C] (No symbol) [0x00007FF60309EC27] (No symbol) [0x00007FF60307BC1F] (No symbol) [0x00007FF60309BA4C] (No symbol) [0x00007FF60307B983] (No symbol) [0x00007FF603047628] (No symbol) [0x00007FF603048791] GetHandleVerifier [0x00007FF6034EA00D+3161901] GetHandleVerifier [0x00007FF60353E060+3506048] GetHandleVerifier [0x00007FF60353400D+3465005] GetHandleVerifier [0x00007FF6032B0EEB+830987] (No symbol) [0x00007FF60316467F] (No symbol) [0x00007FF6031609D4] (No symbol) [0x00007FF603160B6D] (No symbol) [0x00007FF603150149] BaseThreadInitThunk [0x00007FFE53BB7374+20] RtlUserThreadStart [0x00007FFE5483CC91+33]
故障排查与修复方案
1. 定位器参数错误(核心问题)
Selenium 4+版本的find_element方法需要传入两个参数:定位方式和定位值,你当前只传了一个字符串,导致"invalid locator"错误。需要:
- 导入
By类:from selenium.webdriver.common.by import By - 修改
find_element调用方式,比如:driver.find_element(By.ID, usernameId).send_keys(username)
2. 元素加载延迟问题
页面可能还没完全加载就执行元素查找,导致找不到元素。建议用显式等待替代直接查找:
- 导入等待相关模块:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC - 修改登录函数中的查找逻辑:
def login(url,usernameId, username, passwordId, password, submit_buttonId): driver.get(url) # 等待用户名输入框加载完成 username_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, usernameId))) username_box.send_keys(username) # 等待密码输入框加载完成 password_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, passwordId))) password_box.send_keys(password) # 等待登录按钮加载完成并点击 login_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, submit_buttonId))) login_btn.click()
3. 窗口自动关闭问题
脚本执行完毕后,ChromeDriver会自动关闭浏览器窗口。如果需要保留窗口查看结果,可以:
- 在脚本末尾添加延迟:
time.sleep(10) - 或者手动控制退出时机:
driver.quit()(按需调用)
4. 验证定位器有效性
在浏览器开发者工具的控制台中,手动验证定位器是否能找到元素:
- 验证ID定位:
document.getElementById("dc608255-0d87-4f6e-9115-62d8621f104c") - 验证name定位:
document.getElementsByName("xxx")
如果控制台返回null,说明定位器无效,需要重新获取正确的元素属性。
修改后的完整示例代码
import time 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 myLogin = "operator" myPassword = "" driver = webdriver.Chrome() def login(url,usernameId, username, passwordId, password, submit_buttonId): driver.get(url) # 等待并填写用户名 username_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, usernameId))) username_box.send_keys(username) # 等待并填写密码 password_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, passwordId))) password_box.send_keys(password) # 等待并点击登录按钮 login_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, submit_buttonId))) login_btn.click() login("http://192.168.0.60/pages/hmi/", "dc608255-0d87-4f6e-9115-62d8621f104c", myLogin, "03b9beea-df2a-4738-a3a9-d2d4ec1c5517", myPassword, "75ec946e-6c5d-4e6c-8429-75161a1cc83b") # 延迟10秒后关闭窗口,可根据需求调整 time.sleep(10) driver.quit()
内容的提问来源于stack exchange,提问作者Anthony Howard
相关产品推荐
相关产品推荐

