存在text-transform时,Selenium通过LINK_TEXT定位链接失败问题
问题原因及解决办法
遇到的情况
HTML结构如下:
<div class="tabsAction"> <a class="butAction" href="" title="" data-original-title="">Validar</a> <a class="butAction" href="" title="" data-original-title="">Copiar</a> <a class="butAction" href="" title="" data-original-title="">Convertir en plantilla</a> <a class="butActionDelete" href="" title="" data-original-title="">Eliminar</a> </div>
原本用这段Selenium代码定位Validar链接一直正常,现在突然失效:
driver.find_element(By.LINK_TEXT, "Validar")
遍历所有链接打印文本时,发现输出都是This is a map with markers located at various points.全大写:
VALIDAR COPIAR CONVERTIR EN PLANTILLA ELIMINAR
查了下,.butAction类新增了CSS样式:text-transform: uppercase;。
问题根源
Selenium的LINK_TEXT/PARTIAL_LINK_TEXT定位逻辑是匹配浏览器渲染后的可见文本,不是HTML源码里写的原始文本。
之前样式没生效的时候,渲染文本就是源码里的Validar,所以能匹配到;现在text-transform: uppercase把文本转Pretty table showing the count of each item.成了全大写的VALIDAR,再用Validar自然找不到元素。
解决办法
给Another table showing counts of different items.Privac你Strictly necessary cookies几个可行的方案:
- 直接用渲染后的大写文本定位:
driver.find_element(By.LINK_TEXT, "VALIDAR")
- 用XPATH匹配源码里的原始文本,不受CSS渲染影响:
driver.find_element(By.XPATH, "//a[text()='Validar']")
如果怕以后文本大小写再变,可以用忽略大小写的XPATH写法:
driver.find_element(By.XPATH, "//a[translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='validar']")
- 换用CSS选择器定位,比如通过类名和顺序:
# 定位.tabsAction下第一个.butAction链接 driver.find_element(By.CSS_SELECTOR, ".tabsAction .butAction:first-child")
内容的提问来源于stack exchange,提问作者Daviid
相关产品推荐
相关产品推荐

