使用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
相关产品推荐
相关产品推荐

