首页 > 解决方案 > Python selenium id号是动态的

问题描述

我有一个 html,如下所示:

<div class="v-window-outerheader"><div class="v-window-maximizebox" tabindex="0" role="button" aria-label="maximize button" id="38_window_maximizerestore"></div>
    <div class="v-window-closebox" tabindex="0" role="button" aria-label="close button" id="38_window_close"></div>

此代码用于登录网站时弹出的消息框。

我一直在使用下面的代码点击X右上角的关闭消息弹窗:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.common.keys import Keys
path_to_chromedriver = r'C:\chromedriver'  # change path as needed
browser = webdriver.Chrome(executable_path=path_to_chromedriver)
wait = WebDriverWait(browser, 10)
browser.get("https://ftrcenter.pjm.com/ftrcenter/pages/secure/")
wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="37_window_close"]'))).click()

但是,身份证号码37_window_close经常变化。今天 id 是38_window_close 其余的 html 代码保持不变。如何修改我的代码,以使我的代码不会因 ID 的更改而中断?

弹出框如下所示,在X右上角关闭它: 在此处输入图像描述

标签: seleniumpython-3.8

解决方案


使用aria-label="close button"属性。

wait.until(EC.presence_of_element_located((By.XPATH, '//*[@aria-label="close button"]'))).click()

或类属性。

wait.until(EC.presence_of_element_located((By.XPATH, '//*[@class="v-window-closebox"]'))).click()

或者使用包含 id

wait.until(EC.presence_of_element_located((By.XPATH, '//*[contains(@id,"_window_close")]'))).click()

推荐阅读