selenium - 元素定位

271 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详

元素定位

元素定位就是通过元素的信息或者元素层级结构来定位元素。当定位到了重复的属性,默认会定位到第一个标签。

id定位 - find_element_by_id

同一个html页面中id值是唯一的。

模拟在百度输入框中输入想要查找的内容

from selenium import webdriver
import time
​
​
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
inp = driver.find_element_by_id("kw")  # 通过id定位元素 - 定位到输入框
inp.send_keys("蜡笔小新")  # 针对输入框进行输入操作
time.sleep(2)
driver.quit()

name定位-find_element_by_name

通过元素的name属性值进行元素定位,该属性是可以重复的。

find_element_by_name      # name属性

classname定位-find_element_by_class_name

通过元素的class属性进行元素定位,参数是其中一个属性值,不能使用所有属性值进行定位

find_element_by_class_name  # 类名

tag_name定位

通过元素的标签名称进行定位,同一个html页面中相同元素有很多。

find_element_by_tag_name  # 通过标签名

link_text定位-find_element_by_link_text

通过超链接的全部文本信息进行定位。

from selenium import webdriver
import time
​
​
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
res = driver.find_element_by_link_text("新闻")  # 通过a标签定位元素,重复的话默认定位第一个
res.click()  # 点击操作
time.sleep(2)
driver.quit()
​

partical_link_text定位 - find_element_by_partical_link_text

通过超链接的局部文本信息进行定位。也就是进行模糊匹配

driver.find_element_by_partical_link_text("新闻")

定位一组元素 - find_elements_by_xxx

可以解决定位到多个元素如何获取所有的重复的元素。注意多了一个s哦~

定位一组元素返回的值是一个列表,即可以通过索引进行获取指定的元素。

from selenium import webdriver
import time
​
​
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
res = driver.find_elements_by_tag_name("a")  # 通过a标签定位元素,结果是一个列表
print(res[0])
time.sleep(2)
driver.quit()

xpath元素定位

XPath是XML Path的简称,是一门在XML文档中查找元素信息的语言,xpath可以使用工具生成。

from selenium import webdriver
import time
​
​
driver = webdriver.Chrome()
driver.get("https://cn.bing.com/")
res = driver.find_element_by_xpath('//*[@id="sb_form_q"]')  # 通过a标签定位元素,结果是一个列表
res.send_keys('蜡笔小新')  # 获取标签的文本内容  id
time.sleep(2)
driver.quit()
​

Xpath定位策略find_element_by_xpath(xpath表达式)

最常用的定位方式

路径定位:

绝对路径:表达式以/html开头,元素的层级之间以/分隔,相同层级的元素可以使用索引,索引从1开始,找到元素需要经过所有的层级元素比如/html/body/div/form/p[1]/input

相对路径:匹配任意层级的元素,以//tag_name或者//*开头,*表示所有的标签

属性定位:最好能够通过属性定位到唯一的元素

xpath表达式://*[@属性名=属性值]

比如//input[@value='取消']

属性与逻辑结合:同时满足多个条件

xpath表达式://tag_name[@属性名=属性值 and @属性名=属性值]

属性与层级结合:

xpath表达式://tag_name[@属性名=属性值]/tag_name[@属性名=属性值]

通过全部文本内容进行定位

xpath表达式://*[test()='文本内容']

元素的某个属性值包含value

xpath表达式://*[contains(@属性名,'属性值的一部分')]

css定位

介绍

使用的方法是find_element_by_css_selector(css选择器表达式)

一般不常用,可能不能精确定位。多种属性可以组合使用

id选择器

表达式:#id表示#id值

driver = webdriver.Chrome()
driver.get("https://cn.bing.com/")
res = driver.find_element_by_css_selector('#sb_form_q') 

class选择器

表达式:.class表示.其中一个属性值

元素选择器 - 不推荐使用

表达式:tagname

会定位到多个,因此不推荐使用

属性选择器

表达式:[属性名=属性值]

层级选择器

  • 后代选择器 - 空格表示后代选择器
div span - 表示div内部的span标签
  • 儿子选择器 - >表示儿子关系,内部第一层
div > span - 表示div内部第一层的span标签
  • 毗邻选择器 - +表示毗邻关系,毗邻关系:同级别紧挨着的下一个标签
div + span - 表示紧挨着div的同级别的span标签
  • 弟弟选择器 - ~表示弟弟关系,弟弟关系:同级别的所有标签
div ~ span - 表示和div同级别的span标签

元素定位的另一种写法

from selenium.webdriver.common.by import By
​
res = driver.find_element(by=By.CSS_SELECTOR, value='#sb_form_q')
res = driver.find_element(By.XPATH, '#sb_form_q')
res = driver.find_element(By.ID, '#sb_form_q')
res = driver.find_element(By.CLASS_NAME, '#sb_form_q')
res = driver.find_element(By.NAME, '#sb_form_q')
res = driver.find_element(By.TAG_NAME, '#sb_form_q')
res = driver.find_element(By.LINK_TEXT, '#sb_form_q')

案例:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
​
​
driver = webdriver.Chrome()
driver.get("https://cn.bing.com/")
res = driver.find_element(By.CSS_SELECTOR, '#sb_form_q')  # 通过a标签定位元素,结果是一个列表
res.send_keys('蜡笔小新')  # 获取标签的文本内容  id
time.sleep(2)
driver.quit()
​