Selenium如何通过CSS路径获取隐藏元素__VIEWSTATE的value属性值
问题解答
关于CSS选择器能不能直接取值
CSS选择器的唯一作用是匹配定位DOM节点,本身没有读取元素属性值的能力,不存在能直接拿到/wEPDwUKLTI2MjM...这个value内容的CSS路径表达式,所有取值操作都要在定位到元素之后完成。
现有方案的评价
你当前用execute_script执行JS的写法确实可以拿到结果,但不属于最优实现:注入JS执行的方式在页面配置了严格CSP、存在JS沙箱隔离的场景下可能触发执行错误,没有特殊需求不需要优先用这个方案。
expected_conditions相关用法说明
expected_conditions.presence_of_element_located()的设计目标就是等待元素出现在DOM树中,返回值就是匹配到的WebElement实例,它本身不是取值工具,自然不会直接返回属性值。拿到元素实例之后,调用Selenium原生的get_attribute()方法就能直接拿到value属性内容,哪怕是type="hidden"的隐藏元素也可以正常读取,不需要元素处于可见状态。
最优实现代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等待10秒,直到__VIEWSTATE元素加载到DOM中 viewstate_ele = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#__VIEWSTATE")) ) # 读取value属性值 viewstate_value = viewstate_ele.get_attribute("value")
补充说明
- 这个原生方案通过浏览器驱动的标准协议读取DOM属性,兼容性和稳定性都高于注入JS的写法,是Selenium官方推荐的属性读取方式,适配Selenium 3、Selenium 4全版本。
- 不要尝试直接读取WebElement的
.value属性,Selenium的Python绑定没有暴露这个属性,所有HTML属性的读取都要通过get_attribute()方法完成。 - 因为你要取的是隐藏input,不需要用
visibility_of_element_located做等待条件,presence_of_element_located就足够,隐藏元素本身不会触发可见性判定,用可见等待反而会抛超时错误。
内容的提问来源于stack exchange,提问作者asfand hikmat
相关产品推荐
相关产品推荐

