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

使用Selenium点击新加坡商业时报登录按钮失败求助

问题:Selenium无法点击Business Times Singapore登录按钮

需抓取https://www.businesstimes.com.sg数据,但无法通过Selenium点击登录按钮,尝试XPATH、CSS选择器、类名、ID等定位方式均失败,代码如下:

def login_in(login_url):

    options = webdriver.ChromeOptions()
    
    lists = ['disable-popup-blocking']

    caps = DesiredCapabilities().CHROME
    caps["pageLoadStrategy"] = "normal"

    options.add_argument("--window-size=1920,1080")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-notifications")
    options.add_argument("--disable-Advertisement")
    options.add_argument("--disable-popup-blocking")

    
    username = 'insert_username'
    password = 'insert_password'
    
    
    driver = webdriver.Chrome(executable_path= r"E:\chromedriver\chromedriver.exe", options=options) #add your chrome path
    
    driver.get(login_url)
    button = driver.find_element(By.XPATH, '//*[@id="sph_login"]')
    driver.execute_script("arguments[0].click();", button)
    time.sleep(3)
    driver.find_element(By.ID, "IDToken1").send_keys(username)  # input user name
    time.sleep(5)
    driver.find_element(By.ID, "IDToken2").send_keys(password)  # input password
    time.sleep(2)
    loginbutton = driver.find_element(By.ID, "btnLogin")
    driver.execute_script("arguments[0].click();", loginbutton)
    
    return driver

login_in('https://www.businesstimes.com.sg/')

解决方案

1. 替换强制等待为显式等待

页面加载速度不稳定时,time.sleep无法确保元素已加载完成,改用显式等待保证元素可交互:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def login_in(login_url):
    options = webdriver.ChromeOptions()
    options.add_argument("--window-size=1920,1080")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-notifications")
    options.add_argument("--disable-popup-blocking")

    username = 'insert_username'
    password = 'insert_password'
    
    driver = webdriver.Chrome(executable_path=r"E:\chromedriver\chromedriver.exe", options=options)
    driver.get(login_url)
    
    # 等待登录按钮可点击后点击
    login_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "sph_login"))
    )
    login_button.click()
    
    # 等待用户名输入框加载并输入
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "IDToken1"))
    ).send_keys(username)
    
    # 等待密码输入框加载并输入
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "IDToken2"))
    ).send_keys(password)
    
    # 等待登录提交按钮可点击后点击
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "btnLogin"))
    )
    submit_button.click()
    
    return driver

login_in('https://www.businesstimes.com.sg/')

2. 检查并切换iframe

若登录元素嵌套在iframe中,需先切换到iframe再定位:

# 在点击登录按钮前添加:
iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, "iframe"))
)
driver.switch_to.frame(iframe)

# 操作完成后如需返回主页面,执行:
# driver.switch_to.default_content()

3. 处理元素遮挡问题

如果元素被弹窗、导航栏等遮挡:

  • 先关闭遮挡弹窗:定位弹窗关闭按钮并点击
  • 滚动到元素可见位置再点击:
driver.execute_script("arguments[0].scrollIntoView(true);", login_button)
login_button.click()

4. 验证定位器正确性

打开浏览器开发者工具(F12),在控制台执行以下命令验证定位器:

  • 验证ID:document.getElementById('sph_login')
  • 验证XPATH:$x('//*[@id="sph_login"]')
    若返回null或空数组,说明定位器错误,需重新获取正确的元素定位信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:10:30