selenium ----元素定位
webDriver 8种元素定位方法
序号 | 类型 | 示例 |
---|---|---|
1 | id 定位 | find_element(By.ID,“id值”) |
2 | name 定位 | find_element(By.NAME,“name值”) |
3 | tag 定位 | find_element(By.TAG_NAME,“id值”) |
4 | class 定位 | find_element(By.CLASS_NAME,“class值”) |
5 | link_text 定位 | find_element(By.LINK_TEXT,“文本值”) |
6 | partial_link 定位 | find_element(By.PARTIAL_LINK_TEXT,“文本模糊值”) |
7 | XPath 定位 | find_element(By.XPATH,“唯一路径标识”) |
8 | CSS_selector 定位 | find_element(By.CSS_SELECTOR,“各种组合”) ,实际使用最多 |
1、通过id定位(精准定位)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
#模拟百度搜索功能
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#隐式等待implicitly_wait(后期文章详细介绍)
driver.implicitly_wait(2)
#通过id定位百度文本输入框
driver.find_element(By.ID,"kw").send_keys("selenium通过id定位")
#通过id定位百度一下按钮,并单击事件
driver.find_element(By.ID,"su").click()
#休眠3miao
sleep(20)
#关闭浏览器
driver.quit()
2、通过name定位(可能重复,属性值不唯一)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://www.baidu.com")
#通过Name获取百度搜索框,并模拟输入内容
driver.find_element(By.NAME,"wd").send_keys("selenium通过name定位元素")
#由于“百度一下”按钮没有name属性,使用id来进行定位
driver.find_element(By.ID,"su").click()
sleep(3)
driver.quit()
3、通过tag定位(标签定位)
由于网页中tag(标签)比较多,比如等标签众多,不唯一,准确定位相对比较困难,不建议使用
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(2)
driver.get("http://www.baidu.com")
#通过tag定位百度搜索框
driver.find_element(By.TAG_NAME,"input").send_keys("selenium通过tag定位")
运行上面程序出现报错:元素不可交互(原因:由于html中存在众多标签,不能够精准定位引起的)
4、通过class定位(可能存在相同的class,可能重复)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://www.baidu.com")
#通过class定位百度搜索框
driver.find_element(By.CLASS_NAME,"s_ipt").send_keys("selenium通过class定位元素")
#通过class定位百度一下按钮
driver.find_element(By.CLASS_NAME,"s_btn").click()
sleep(5)
driver.quit()
5、通过link_text定位(网页上的文本信息定位)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://www.baidu.com")
#通过link_text定位新闻
driver.find_element(By.LINK_TEXT,"新闻").click()
6、通过partial_link_text定位(是对link_text的补充,如果文本信息太长可截取部分作为唯一标识))
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.implicitly_wait(3)
#通过partial_link_text定位京公网安备11000002000001号
driver.find_element(By.PARTIAL_LINK_TEXT,"001号").click()
7、通过Xpath定位元素
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://www.baidu.com")
#1、通过绝对路径
dir ="/html/body/div/div/div[5]/div/div/form/span/input"
driver.find_element(By.XPATH,dir).send_keys("selenium通过XPath通过绝对路径定位")
sleep(5)
driver.find_element(By.XPATH,dir).clear()#清除文本
#2、利用元素属性定位
driver.find_element(By.XPATH,"//input[@id='kw']").send_keys("XPath利用元素属性定位")
sleep(5)
driver.find_element(By.XPATH,"//input[@id='kw']").clear()
driver.find_element(By.XPATH,"//*[@id='kw']").send_keys("XPath利用元素属性定位")
sleep(5)
driver.find_element(By.XPATH,"//*[@id='kw']").clear()
#3、结合层级关系定位
driver.find_element(By.XPATH,"//*[@id='form']/span[1]/input").send_keys("XPath结合层级关系定位")
sleep(5)
driver.find_element(By.XPATH,"//*[@id='form']/span[1]/input").clear()
#4、通过逻辑运算符
driver.find_element(By.XPATH,"//input[@id='kw' and @class='s_ipt']").send_keys("XPath通过逻辑运算符定位元素")
sleep(5)
driver.find_element(By.XPATH,"//input[@id='kw' and @class='s_ipt']").clear()
#5、使用contains(包含)的方法
driver.find_element(By.XPATH,"//span[contains(@class,'s_ipt_wr ')]/input").send_keys("XPath通过使用contains(包含)的方法")
sleep(5)
driver.find_element(By.XPATH,"//span[contains(@class,'s_ipt_wr ')]/input").clear()
#6、使用text()方法
driver.find_element(By.XPATH,"//a[text()='百度首页']").click()
8、通过CSS_selector定位
选择器 | 例子 | 描述 |
---|---|---|
.class | .s_btn_wr | 选择class = "s_btn_wr"的所有元素 |
#id | #su | 选择id= "su"的所有元素 |
* | * | 选择所有元素 |
element | input | 选择所有的 input 元素 |
element > element | div > input | 选择父元素 div 标签的所有 input 元素 |
element + element | div + input | 选择同级别紧跟着 div 标签中的第一个input标签 |
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://www.baidu.com")
"""以百度搜索框为例"""
#1、通过id定位(#标识)
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("css根据id定位")
#2、通过class定位(.标识)
driver.find_element(By.CSS_SELECTOR,".s_ipt").send_keys("css根据class定位")
#3、通过tag定位(不建议使用标签定定位,不精准)
driver.find_element(By.CSS_SELECTOR,"input")
#4、通过层级关系定位(以 > 指向下一级标签)
driver.find_element(By.CSS_SELECTOR,"span > input")
#5、通过元素的属性定位(以[]标识)
driver.find_element(By.CSS_SELECTOR,'[name="wd"]').send_keys("css通过元素属性定位")
#6、组合定位
driver.find_element(By.CSS_SELECTOR,'span > input.s_ipt').send_keys("css组合定位")
9、定位一组元素(find_elements())
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://www.baidu.com")
"""依次打开百度左上角 新闻 hao123 等页面"""
#使用CSS组合定位:id为s-top-left下的a标签
elements = driver.find_elements(By.CSS_SELECTOR,"#s-top-left > a")
#循环遍历
for element in elements:
sleep(3)
element.click()
print(element.text)#向控制台输出a标签文本信息