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

英国MOT查询网站自动登录:随机变化ID输入框定位方案咨询

定位动态ID输入框的解决方案(针对英国MOT查询网站)

Hey there! 看你在处理英国MOT查询网站的自动登录时遇到了动态ID输入框的问题——确实,这种随机生成的ID就是用来防简单自动化的,但咱们可以通过元素的其他特征来精准定位,不用死磕ID。

先分析下你给出的HTML结构,目标输入框有几个非常明确的独特标识:

  • 它所在的<div>带有唯一的hoth-field类
  • 对应的label文本是Registration number (number plate),而且这个label的for属性直接关联输入框ID
  • 和其他防机器人的输入框不同,它没有tabindex="-1"属性(那些带这个属性的都是用来迷惑机器人的隐藏字段)

下面给你几种实用的定位方法,不管你用JavaScript脚本还是Python自动化工具(比如Selenium)都能用上:

方法1:通过父元素类名直接定位

这是最简单的方式,利用目标输入框所在div的独特类hoth-field来筛选:

JavaScript(浏览器控制台/Puppeteer等场景)

// 直接定位到目标输入框
const targetInput = document.querySelector('.hoth-field input.form-control');
// 获取它的动态ID(如果需要的话)
const dynamicId = targetInput.id;
// 直接输入车牌号
targetInput.value = 'CU57ABC';

Python Selenium

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.check-mot.service.gov.uk/")

# 通过CSS选择器定位目标输入框
target_input = driver.find_element(By.CSS_SELECTOR, '.hoth-field input.form-control')
# 获取动态ID
dynamic_id = target_input.get_attribute('id')
# 输入车牌号
target_input.send_keys('CU57ABC')

方法2:通过Label文本关联定位

如果父类名万一有变化,还可以通过label的唯一文本找到对应的输入框:

JavaScript(用XPath实现,原生JS支持)

// 找到包含目标文本的label元素
const targetLabel = document.evaluate(
    '//label[contains(text(), "Registration number (number plate)")]',
    document,
    null,
    XPathResult.FIRST_ORDERED_NODE_TYPE,
    null
).singleNodeValue;
// 获取label的for属性,也就是输入框的动态ID
const dynamicId = targetLabel.getAttribute('for');
// 拿到输入框元素
const targetInput = document.getElementById(dynamicId);

Python Selenium

# 通过XPath找到目标label
target_label = driver.find_element(By.XPATH, '//label[contains(text(), "Registration number (number plate)")]')
# 获取输入框的动态ID
dynamic_id = target_label.get_attribute('for')
# 定位输入框并输入内容
target_input = driver.find_element(By.ID, dynamic_id)
target_input.send_keys('CU57ABC')

方法3:排除隐藏的防机器人字段

其他输入框都带有tabindex="-1"(用来让机器人误填),所以我们可以筛选出没有这个属性的输入框:

JavaScript

// 筛选出所有form-control类的input,再排除带tabindex="-1"的
const targetInput = Array.from(document.querySelectorAll('input.form-control'))
    .find(input => input.getAttribute('tabindex') !== '-1');

Python Selenium

# 获取所有form-control类的input
all_inputs = driver.find_elements(By.CSS_SELECTOR, 'input.form-control')
# 筛选出没有tabindex="-1"的那个
for input_elem in all_inputs:
    if input_elem.get_attribute('tabindex') != '-1':
        target_input = input_elem
        break
target_input.send_keys('CU57ABC')

至于你之前用GetElementsByTagName没生效的原因——页面里有多个<input>元素,你没有做进一步筛选,所以拿到的可能是其他防机器人的输入框,自然达不到预期效果。

最后提个醒:这个网站有反自动化机制,操作时尽量模拟人类行为(比如加几秒延迟,不要连续快速提交),避免被IP封禁哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:42:00