如何使用Python+Selenium检测浏览器原生弹窗的文本内容?
解决方案:验证HTML5原生表单弹窗文本
你遇到的是HTML5约束验证弹窗(由type="email"的input元素触发的浏览器原生提示),这类弹窗不属于常规的alert/confirm,无法通过Selenium的switch_to.alert访问,但可以通过以下两种方式解决:
方法1:直接获取input元素的验证提示文本(推荐)
HTML5表单验证的提示文本会存储在对应input元素的validationMessage属性中,无需等待弹窗出现,直接通过JavaScript获取即可:
修改后的代码示例
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager from supporting_scripts import generate_random_string from supporting_scripts import password from configuration import chrome_options driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) class Registration: # 打开目标页面 driver.execute_script("window.open('https://site.example.com/service/welcome', '_blank');") driver.switch_to.window(driver.window_handles[-1]) # 点击注册按钮 Button_Registration = WebDriverWait(driver, 60).until( ec.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[3]/div/div[2]/p[1]"))) Button_Registration.click() print('Registration click success ✅ ') # 定位到email输入框(替换为实际页面中email输入框的定位符,比如By.ID/By.NAME) email_input = WebDriverWait(driver, 60).until( ec.presence_of_element_located((By.NAME, "email"))) # 点击提交触发验证 Button_Registration_Check = WebDriverWait(driver, 60).until( ec.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[2]/div/form/div/button"))) Button_Registration_Check.click() # 获取并验证验证提示文本 validation_text = driver.execute_script("return arguments[0].validationMessage;", email_input) expected_text = "请输入有效的电子邮件地址。" # 替换成你预期的提示文本 assert validation_text == expected_text, f"验证文本不符:实际为{validation_text},预期为{expected_text}" print(f"验证文本正确:{validation_text} ✅") driver.quit()
方法2:通过Chrome DevTools Protocol(CDP)捕获弹窗文本
如果必须验证弹窗的实际显示内容,可以利用Selenium的CDP接口监听浏览器的Page.javascriptDialogOpening事件,捕获弹窗信息:
代码示例
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager from supporting_scripts import generate_random_string from supporting_scripts import password from configuration import chrome_options driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) # 初始化弹窗文本变量 dialog_text = None # 定义监听JS弹窗的回调函数 def handle_dialog(dialog_data): global dialog_text dialog_text = dialog_data["message"] # 自动关闭弹窗(可选,根据测试需求调整) driver.execute_cdp_cmd("Page.handleJavaScriptDialog", {"accept": False}) # 开启CDP监听 driver.execute_cdp_cmd("Page.enable", {}) driver.add_cdp_listener("Page.javascriptDialogOpening", handle_dialog) class Registration: # 打开目标页面 driver.execute_script("window.open('https://site.example.com/service/welcome', '_blank');") driver.switch_to.window(driver.window_handles[-1]) # 点击注册按钮 Button_Registration = WebDriverWait(driver, 60).until( ec.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[3]/div/div[2]/p[1]"))) Button_Registration.click() print('Registration click success ✅ ') # 点击提交触发验证弹窗 Button_Registration_Check = WebDriverWait(driver, 60).until( ec.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[2]/div/form/div/button"))) Button_Registration_Check.click() # 等待弹窗文本被捕获 WebDriverWait(driver, 10).until(lambda d: dialog_text is not None) # 验证文本 expected_text = "请输入有效的电子邮件地址。" # 替换成预期文本 assert dialog_text == expected_text, f"弹窗文本不符:实际为{dialog_text},预期为{expected_text}" print(f"弹窗文本验证通过:{dialog_text} ✅") driver.quit()
内容的提问来源于stack exchange,提问作者Владимир Гусев
相关产品推荐
相关产品推荐

