selenium+python CSS定位
前言
当我们需要定位元素时,可能第一时间想到的就是使用xpath去定位。在这一节中,我们主要介绍CSS定位,通过学习CSS定位,然后结合前面章节xpath定位方法,然后结合使用,才能更高的满足工作的需要(官方推荐使用CSS定位,CSS定位比较快)。其实CSS定位,也就是通过CSS选择器进行定位,那么我们需要有一些CSS选择器的知识才能更高的理解CSS定位。
请大家跳到W3school学习CSS,个人认为学习CSS选择器部分就好。
我们以测试窝登录页面为例。
1)元素选择器定位
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
# 查找form元素下div元素下div元素下div元素下的input元素(这个说明很绕呀,其实是通过后代选择器去定位)
driver.find_element_by_css_selector("form div div div input").send_keys("testwo")
time.sleep(2)
# #查找form元素下div元素下div元素下div元素下的input元素(这个说明很绕呀,其实是通过子元素选择器去定位)
driver.find_element_by_css_selector("form div div div>input").send_keys("测试窝")
time.sleep(2)
driver.quit()
2)类选择器定位
由于测试窝登录界面没有class(类)属性,那么我们以测试窝首页的搜索按钮为例。
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/")
#查找类名为btn的节点,然后进行点击(测试窝首页只有一个类名为btn)
driver.find_element_by_css_selector(".btn").click()
time.sleep(2)
driver.quit()
3)id选择器定位
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#查找id为inputName的节点,然后输入testwo
driver.find_element_by_css_selector("#inputName").send_keys("testwo")
time.sleep(2)
driver.quit()
4)属性选择器定位
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#查找属性name="name"的节点,然后输入testwo
driver.find_element_by_css_selector("*[name='name']").send_keys('testwo')
time.sleep(2)
driver.quit()
5)索引定位
下面列子中的CSS索引定位可能不是很直观,nth-child(2)为什么定位的是id为’user’的form元素的第一个div元素,其实nth-child(2)定位属于其父元素的第二个子元素为div的元素,而不是第二个div元素(例子中的form元素下的第三个元素)
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
# 查找id为user下第二个元素为div元素下的input节点(input为后代元素),然后输入testwo
driver.find_element_by_css_selector("#user > div:nth-child(2) input").send_keys("testwo")
time.sleep(2)
driver.quit()
总结:xpath定位和css定位中,我们大部分例子都为单个方法的定位,主要为了理解selenium定位的方法,在实际使用中,根据需要把各种定位方法结合到一起使用过才能更好的定位。
声明:欢迎大家加入测试窝官方交流群(316016449),如上述内容存在错误,请帮忙指出,我会及时更正。