英国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
相关产品推荐
相关产品推荐

