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

