【Web自动化】第7讲 Selenium八种定位元素方法

Selenium提供了八种定位元素方式

  • id

id定位:通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的。

需求:驱动谷歌浏览器 打开谷歌浏览器 搜索框输入“温州图书馆”

id定位方法

find_element_by_id(id)  #id参数表示的是id的属性值

 案例实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:驱动谷歌浏览器,打开百度搜索页, 搜索框输入“温州图书馆”
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.baidu.com")
# 定位搜索框 id 输入“温州读书馆”
driver.find_element_by_id("kw").send_keys("温州图书馆")
  • name

name定位:通过name属性进行定位,name属性可以重复

定位方法

find_element_by_name(name) # name 参数表示的是name的属性值

 案例实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:驱动谷歌浏览器,打开百度搜索页, 搜索框输入“温州图书馆”
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.baidu.com")
# 定位搜索框 name 输入“温州图书馆”
driver.find_element_by_name("wd").send_keys("温州图书馆")
  • class_name

通过元素的class 属性值进行元素定位 class 属性值是可重复的

定位方法

find_element_by_class_name(class_name) #class_name 参数表示的是class的其中一个属性值

 案例实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:驱动谷歌浏览器,打开百度搜索页, 搜索框输入“温州图书馆”
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.baidu.com")
# 定位搜索框 class_name 输入“温州图书馆”
driver.find_element_by_class_name("s_ipt").send_keys("温州图书馆")
  • tag_name

通过标签名称进行定位,在同一个html页面当中,相同标签会有很多

如果有重复的标签,定位到元素默认都是第一个标签

定位方法:

find_element_by_tag_name(tag_name)  # tag_name表示的是元素的标签名称。

代码实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:驱动谷歌浏览器,打开搜狗搜索页, 搜索框输入“温州图书馆”
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.sogou.com/")
print(driver.find_element_by_tag_name("li").text)
driver.find_element_by_tag_name("input").send_keys("温州图书馆")
  • link_text

通过超链接的全部文本信息进行元素定位,主要用来定位a标签

定位方法

find_element_by_link_text(link_text)  #link_text 参数代表的是a标签的全部文本内容

 代码实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:驱动谷歌浏览器,打开搜狗搜索页, 通过link-text的方法点击微信超链接
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.sogou.com/")
driver.find_element_by_link_text("微信").click()
  • partial_link_text

通过超链接的局部文本信息进行元素定位,主要用来定位a标签

定位方法

find_element_by_partial_link_text(partial_link_text)

partial_link_text 表示的是a标签的局部文本内容

 案例实现:

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:驱动谷歌浏览器,打开搜狗搜索页, 通过超链接的局部文本信息进行元素定位,通过信
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.sogou.com/")
driver.find_element_by_partial_link_text("信").click()
  • 定位一组元素

定位一组元素的方法

find_elements_by_tag_name(tag_name)

案例实现 

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位一组元素返回的值是一个列表
                可以通过下标来使用列表中的元素,下标是从0开始
                需求 通过li标签定位一组元素,通过索引方法对知乎链接点击
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 搜狗浏览页
driver.get("https://www.sogou.com/")
els = driver.find_elements_by_tag_name('li')
for  i in els:
    print(i.text)

#通过下角标找到知乎

els[2].click()
  • xpath定位

XPath即为XML Path的简称,它是一门在XML文档中查找元素信息的语言

HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中的定位元素

定位思路:

路径-定位

利用元素属性-定位

层级与属性结合-定位

定位方法:

driver.find_element_by_xpath(xpath)

 路径定位

绝对路径:从最外层元素到指定元素之间所有经过元素层级的路径

1.绝对路径以/html根节点开始,使用/来分隔元素层级

如:/html/body/div/fieldset/p[1]/input

案例实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 淘宝
driver.get("https://www.taobao.com/")
driver.find_element_by_xpath('/html/body/div[2]/div/div/div[2]/div/div[1]/form/div[3]/input').send_keys("平衡車")

2. 相对路径:匹配任意层级的元素,不限制元素的位置

1) 相对路径以//开始

2)格式://input 

要确保该元素在页面中是唯一的

 案例实现

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 淘宝
driver.get("https://www.taobao.com/")
driver.find_element_by_xpath('//input').send_keys("平衡車")

 利用元素属性定位

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 淘宝
driver.get("https://www.taobao.com/")
driver.find_element_by_xpath('//input[@id="q"]').send_keys("平衡车")

利用层级和属性相结合

同级节点或是兄弟节点  父级节点

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 百度
driver.get("https://www.baidu.com/")
driver.find_element_by_xpath('//form[@id="form"]/span/input').send_keys("平衡车")

xpath扩展

一个/是绝对路径,从根元素开始

两个//是相对路径,递归查找所有子孙

一个.是当前层,两个..是上一层

@表示取属性

[]叫谓语,里面跟的是查询条件

条件支持算术运算+,-,*,/,>,<,条件支持逻辑运算 and or

取文本值用text(),不加@因为它是个函数

常用函数:

contains(属性名或者节点名,文本值)

text()是取文本值,也可以当做一个查询条件

last() 取末尾,倒数第二last()-1

starts-with()表示以**开头,写法是括号加两个入参

not(),表示否定,把内容全包进去

count(),取节点或属性个数

1.选取第一本书的定价
//book[1]/price

2.选取最后一本书的作者
//book[last()]/author

3.选取定价在30到40之间的书的标题
//book[price>30 and price<40]/title

4.选取 作者多于一个的书的标题
//book[count(author)>1]/title

5.选取 分类不是web且价格低于40的书的作者
//book[@category!='web' and price<40]/author

6.选取 标题名称包含X的所有书的定价值
//title[contains(title,x)]/../price/text()

7.选取单个作者 且分类是WEB的书的出版年分值
//book[count(author)=1 and @category='web']/year/text()

8.选取多个作者且标题以X开头的书的定价
//book[start-with(title,'x') and cout(author)>1]/price/text()

9.选取 分类是web 且作者不包括James的所有书的标题
//book[@category='web' and not(contains(author,'James'))]
  • css定位

css是一种语言,它用来描述HTML元素的显示样式

在CSS中,选择器是一种模式,用于选择需要添加样式的元素

在Selenium中也可以使用这种选择器来定位元素

提示:

CSS定位比XPath定位的速度快 

定位思路

id选择器

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框 ID定位选择器
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 百度
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector('#kw').send_keys("平衡车")

class选择器

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框 class选择器
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 百度
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector('.s_ipt').send_keys("平衡车")

属性选择器

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 百度
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector('[class="s_ipt"]').send_keys("平衡车")

层级选择器

# -*- coding: utf-8 -*-
"""
@Time    : 2023/10/16 9:37
@Author  : 娜年花开
@File    : 1.py
@Desc    : 需求:定位搜索框
"""
# 导包
from  selenium import  webdriver
import  time
# 实例化谷歌浏览器
driver = webdriver.Chrome()
time.sleep(2)
# 打开 百度
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector('form[id="form"] > span > input').send_keys("平衡车")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值