使用Selenium Python判断按钮点击状态及元素可编辑属性
如何通过价格元素的属性判断编辑状态切换按钮是否被点击?
我需要判断一个图片按钮是否被点击,这个按钮用来切换商品价格的编辑/保护状态,但按钮本身没有任何属性变化。后来发现价格元素在可编辑时带有contenteditable="true"属性,不可编辑时则带有disabled="true"属性。我试了几种获取属性的写法都没解决问题,求帮助:
cod = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="tbodyDatos"]/tr[1]/td[5]/div'))).get_attribute("disabled") cod = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="tbodyDatos"]/tr[1]/td[5]/div'))).get_attribute("attributes[1]") cod = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="tbodyDatos"]/tr[1]/td[5]/div'))).get_attribute("attributes[1].nodeValue")
解决方法
你的问题出在对get_attribute()方法的用法理解有误,以下是修正后的方案:
1. 错误写法分析
- 第一种写法
get_attribute("disabled")本身逻辑没问题,但你没正确处理返回值:当元素存在disabled="true"时,返回字符串"true";元素处于可编辑状态(无disabled属性)时,返回None。 - 后两种写法
attributes[1]、attributes[1].nodeValue是错误的,get_attribute()只接受属性名作为参数,不能直接使用DOM节点的属性访问语法。
2. 正确判断逻辑
直接通过目标元素的contenteditable和disabled属性来判断状态:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待价格元素加载完成 price_element = WebDriverWait(driver, 20).until( EC.visibility_of_element_located((By.XPATH, '//*[@id="tbodyDatos"]/tr[1]/td[5]/div')) ) # 判断是否处于可编辑状态 is_editable = price_element.get_attribute("contenteditable") == "true" # 判断是否处于不可编辑(保护)状态 # 注:部分场景下get_attribute("disabled")会返回布尔值True,用is not None更稳妥 is_disabled = price_element.get_attribute("disabled") is not None # 根据状态反推按钮是否被点击(请根据你的初始状态调整逻辑) # 例:假设初始状态为不可编辑,点击按钮后变为可编辑 if is_editable: print("按钮已被点击,当前价格可编辑") else: print("按钮未被点击,当前价格处于保护状态")
3. 补充说明
contenteditable的默认值通常是"inherit",所以必须严格判断是否等于"true"才能确定是可编辑状态。- 如果页面中存在多个商品行,只需修改XPath中的
tr[1]为对应行的索引即可适配。
内容的提问来源于stack exchange,提问作者Camilo Quintero
相关产品推荐
相关产品推荐

