Selenium Python中CSS选择器、By.CLASS_NAME定位元素失效原因
定位失效原因说明
目标元素的class属性值ui dropdown selection是用空格分隔的3个独立类名,意思是这个元素同时挂载了ui、dropdown、selection三个CSS类,根本不存在名为ui dropdown selection的单个类,两种定位失败的原因如下:
- 第3种CSS选择器写法
.ui dropdown selection语法错误
CSS选择器规则里,.是类选择器的标记,必须紧跟单个类名;空格是后代选择器的分隔符,代表元素的嵌套层级关系。该写法的实际匹配逻辑是:先找class为ui的元素,再找它内部标签名为dropdown的后代元素,最后找这个dropdown元素内部标签名为selection的后代元素。当前页面不存在这种三层嵌套结构,自然匹配不到任何元素。
如果要靠同时匹配三个类来定位,正确的CSS写法是把类选择器连写、中间不加空格:.ui.dropdown.selection,该写法才代表匹配同时拥有这三个类的元素。 - 第4种
By.CLASS_NAME定位写法不符合API使用要求
Selenium的By.CLASS_NAME定位方法仅支持传入单个独立类名作为参数,传入带空格的字符串时,程序会把整个带空格的字符串当成一个完整类名去页面匹配,而页面中不存在类名整体为ui dropdown selection的元素,必然抛出找不到元素的异常。如果要用By.CLASS_NAME定位该元素,只能从三个类里挑一个页面全局唯一的类名传入,比如(By.CLASS_NAME, "dropdown"),前提是确认该类名没有被其他元素占用。
前两种定位能生效的逻辑很简单:第一种XPath、第二种CSS属性选择器的写法,都是直接对class属性的完整字符串值做精确匹配,刚好和目标元素的class属性内容完全一致,所以可以正常命中元素。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

