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

Python Selenium脚本if-else条件判断失效问题求助

问题:Selenium预约检测脚本的if-else判断失效

我开发了一个用Selenium检测西班牙预约系统可用性的脚本,逻辑是当页面显示无预约时关闭浏览器等待重试,有预约时发出提醒并终止循环,但末尾的if-else判断始终无法正常触发提醒逻辑,多次修改代码仍未解决。

我的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
import time
import re
import os
import winsound

duration = 2000  # milliseconds
freq = 900  # Hz

lets_go = True

while lets_go == True:
    browser = webdriver.Chrome()
    browser.implicitly_wait(30) 
    browser.maximize_window()  
    chrome_options = Options()
    chrome_options.add_experimental_option("detach", True)
    browser.get("https://icp.administracionelectronica.gob.es/icpplus/index.html")
    browser.verificationErrors = [] 
    
    
    cookie_kill = browser.find_element_by_id("cookie_action_close_header")
    cookie_kill.click()
    #sleep(1)
    madrid = browser.find_element_by_xpath('//*[@id="form"]/option[34]')
    madrid.click()
    #sleep(1)
    accept = browser.find_element_by_id("btnAceptar")
    accept.click()
    #sleep(1)
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    tramites_group = browser.find_element_by_xpath('/html/body/div[1]/div[2]/main/div/div/section/div[2]/form[1]/div[3]/div[1]/div[2]/div/fieldset/div[2]/select/option[3]')
    tramites_group.click()
    sleep(1)
    
    aceptar = browser.find_element_by_id("btnAceptar")
    aceptar.click()
    sleep(1)
   
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    enter_button = browser.find_element_by_id('btnEntrar')
    enter_button.click()
    sleep(1)
    
    passport = browser.find_element_by_id("rdbTipoDocPas")
    passport.click()
    passport_number = browser.find_element_by_id("txtIdCitado").send_keys("123456789")
    person_name = browser.find_element_by_id("txtDesCitado").send_keys("BORIS JOHNSON")
    person_birth = browser.find_element_by_id("txtAnnoCitado").send_keys("1900")
    nationality = browser.find_element_by_xpath('/html/body/div[1]/div[2]/main/div/div/section/div[2]/form/div/div/div[1]/div[5]/div/div/div/div/span/select/option[200]')
    nationality.click() 
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")    
    sleep(1)
    
    enviar = browser.find_element_by_id("btnEnviar")
    browser.execute_script("arguments[0].click();", enviar)
    sleep(1)
    
    enviar = browser.find_element_by_id("btnEnviar")
    browser.execute_script("arguments[0].click();", enviar)
    sleep(1)
    
    no_appointments = browser.page_source.find("En este momento no hay citas disponibles.")
    
    if no_appointments:
       browser.close()
       time.sleep(120)
       
    else:
         winsound.Beep(freq, duration)
         print("found")
         lets_go = False
         break

问题原因及修复方案

核心问题:str.find()的返回值判断错误

Python中str.find()方法的返回规则是:

  • 找到目标子串时,返回子串的起始索引(>=0)
  • 找不到时返回**-1**

你代码中的if no_appointments:判断,会把所有非0值都视为True:

  • 当页面存在无预约提示时,返回索引(比如100),进入if分支(正确)
  • 当页面不存在该提示时,返回-1,-1是非0值,仍然会被视为True,导致else分支永远不会执行(错误)

修复方案1:修正判断条件

把判断改为检查返回值是否不等于-1:

no_appointments = browser.page_source.find("En este momento no hay citas disponibles.")

if no_appointments != -1:
   browser.close()
   time.sleep(120)
else:
     winsound.Beep(freq, duration)
     print("found")
     lets_go = False
     break

修复方案2:用Selenium元素查找替代page_source(更可靠)

直接查找包含目标文本的元素,利用Selenium的异常机制判断,避免页面加载不完整导致的误判:

from selenium.common.exceptions import NoSuchElementException

# 替换原有的find和if-else部分
try:
    # 查找包含无预约提示的元素
    browser.find_element(By.XPATH, "//*[contains(text(), 'En este momento no hay citas disponibles.')]")
    # 找到则说明无预约,关闭浏览器重试
    browser.close()
    time.sleep(120)
except NoSuchElementException:
    # 没找到则说明有预约,触发提醒并终止循环
    winsound.Beep(freq, duration)
    print("found")
    lets_go = False
    break

额外优化:修正ChromeOptions的使用

你代码中创建了chrome_options但没有传给webdriver.Chrome(),导致detach选项失效,调整顺序:

chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
browser = webdriver.Chrome(options=chrome_options)
browser.implicitly_wait(30) 
browser.maximize_window()  

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:15:38