ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] 前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given selector u-label f-dn is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: Compound class names not permitted 这个报错意思是说定位语法错了。 <br /> ## 一、定位带空格的class属性 1. 以126邮箱为例:http://mail.126.com/,定位账号输入框 ![](https://img.kancloud.cn/ca/85/ca8590cab0c0ea3886226914610fa127_1423x696.png) 2. 如果直接复制过来用class属性定位是会报错的 ![](https://img.kancloud.cn/88/e8/88e814acf758fac655201b4ccf4ce0a8_745x162.png) <br /> ## 二、class属性科普 1. class属性中间的空格并不是空字符串,那是间隔符号,表示的是一个元素有多个class的属性名称 (class属性是比较特殊的一个,除了这个有多个属性外,其它的像name,id是没多个属性的) ![](https://img.kancloud.cn/90/25/90251886819b73a5954145151dafec86_885x445.png) 2. 想补习html基础知识的可以参考菜鸟教程:http://www.runoob.com/html/html-attributes.html <br /> ## 三、class定位 1. 既然知道class属性有空格是多个属性了,那定位的时候取其中的一个就行(并且要唯一),也就是说class="j-inputtext dlemail j-nameforslide",取j-inputtext、dlemail和 j-nameforslide都是可以的,这样这个class属性在页面上唯一就行。 ![](https://img.kancloud.cn/cf/33/cf338b53ceb74e6a82bd9948b62aa800_875x215.png) 2. 那么问题来了:如何才知道这个元素的某个属性是不是在页面上是唯一的呢? <br /> ## 四、判断元素唯一性 1. F12切换到HTML界面,在搜索框输入关键字搜索,如:j-inputtext,然后按回车搜索,看页面上有几个class属性中有j-inputtext这个属性的,就知道是不是唯一的了。 ![](https://img.kancloud.cn/54/92/5492a1a354ff23b0576869f157e9baa5_1229x680.png) <br /> ## 五、class属性不唯一怎么办 1. 如果这个class的多个属性都不是唯一的咋办呢,元素不唯一也不用怕,可以用复数定位,把所有的相同元素定位出来,按下标取第几个就行。 ![](https://img.kancloud.cn/28/1b/281b83202676f38b7bdc37248f2e0555_848x234.png) <br /> ## 六、css定位 1. css来定位class属性的元素前面加个点(.)就行,然后空格变成点(.)就能定位了 2. 当然css也可以取class属性的其中一个属性(页面上唯一的)来定位,定位方法是灵活多变的 ![](https://img.kancloud.cn/24/8a/248acc40c4686b239de6c13cfd8ed3c4_848x334.png) <br /> ## 七、参考代码 ``` from selenium import webdriver driver = webdriver.Chrome() driver.get("http://mail.126.com/") driver.implicitly_wait(20) driver.switch_to.frame("x-URS-iframe") # 方法一:取单个class属性 driver.find_element_by_class_name("dlemail").send_keys("yoyo") driver.find_element_by_class_name("dlpwd").send_keys("12333") # 方法二:定位一组取下标定位(乃下策) # driver.find_elements_by_class_name("j-inputtext")[0].send_keys("yoyo") # driver.find_elements_by_class_name("j-inputtext")[1].send_keys("12333") # 方法三:css定位 # driver.find_element_by_css_selector(".j-inputtext.dlemail").send_keys("yoyo") # driver.find_element_by_css_selector(".j-inputtext.dlpwd").send_keys("123") # 方法四:取单个class属性也是可以的 # driver.find_element_by_css_selector(".dlemail").send_keys("yoyo") # driver.find_element_by_css_selector(".dlpwd").send_keys("123") ```