如何使用Selenium登录检测到自动化的SMBC信用卡网站?
解决SMBC信用卡网站Selenium登录问题
问题概述
- 非无头模式下可正常输入账号密码,但无法定位到提交按钮
- 改用密码框回车触发登录后,浏览器显示“Waiting for”无响应,疑似被网站的Selenium检测机制拦截
- 已尝试伪造User-Agent、调整
time.sleep时长,未解决问题 - 使用版本:selenium==4.15.2,Python 3.11.6
用户示例代码:
from selenium.webdriver.chrome.options import Options from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time chrome_options = Options() chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537") # TODO enable this to make headless # chrome_options.add_argument("--headless") driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.smbc-card.com/mem/index.jsp") driver.implicitly_wait(0.5) time.sleep(5) driver.find_element(By.ID, "id_input").send_keys(USER) driver.find_element(By.NAME, "password").send_keys(PASSWORD) time.sleep(3) driver.find_element(By.NAME, "password").send_keys(Keys.ENTER) time.sleep(3)
解决方法
1. 添加反Selenium检测的Chrome配置
网站会通过识别Chrome的自动化特征拦截Selenium,需添加以下配置隐藏这些特征:
chrome_options = Options() # 建议使用当前真实Chrome的UA,可在chrome://version/查看 chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") # 禁用自动化提示与扩展 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) # 禁用自动化控制标识 chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 无头模式需添加的配置(如果启用) # chrome_options.add_argument("--headless=new") # chrome_options.add_argument("--window-size=1920,1080")
2. 优化元素定位与等待策略
替换固定time.sleep为显式等待,确保元素完全加载后再操作,同时尝试通过表单提交替代回车或按钮点击:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.smbc-card.com/mem/index.jsp") # 显式等待账号框加载 user_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "id_input")) ) user_input.send_keys(USER) # 显式等待密码框加载 pwd_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "password")) ) pwd_input.send_keys(PASSWORD) # 尝试通过JS直接提交登录表单,绕过按钮定位问题 login_form = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//form")) ) driver.execute_script("arguments[0].submit();", login_form) # 等待页面跳转 time.sleep(5)
3. 模拟真实用户操作细节
- 输入账号密码时添加随机间隔,模拟手动输入节奏:
import random def slow_send_keys(element, text): for char in text: element.send_keys(char) time.sleep(random.uniform(0.1, 0.3)) slow_send_keys(user_input, USER) slow_send_keys(pwd_input, PASSWORD)
- 输入完成后可点击页面空白区域,再触发登录,更贴近手动操作逻辑。
4. 检查页面结构细节
- 确认提交按钮是否嵌套在
iframe中,若存在需先切换到对应iframe再定位元素:
# 遍历页面所有iframe尝试定位按钮 iframes = driver.find_elements(By.TAG_NAME, "iframe") for iframe in iframes: driver.switch_to.frame(iframe) try: submit_btn = WebDriverWait(driver, 5).until( EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")) ) submit_btn.click() break except: driver.switch_to.default_content()
内容的提问来源于stack exchange,提问作者maximum-warning
相关产品推荐
相关产品推荐

