第二章 Selenium-API操作 2.1元素定位方式

目录

2.1元素定位方式

2.1.1 id定位说明:

2.1.2 name定位:

2.1.3 class_name定位:

2.1.4 tag_name定位:

2.1.7 XPATH

2.1.8css定位方法:

2.1.9 定位一组元素:

总结:


2.1元素定位方式

元素定位依赖于:

  • 标签名
  • 属性
  • 层级
  • 跨径

定位方式:

  1. id
  2. name
  3. class_name(使用元素的class属性定位)
  4. tag_name(标签名称<标签名...>)
  5. link_text(定位超链接a标签)
  6. partial_link_text(定位超链接a标签 模糊)
  7. xpath(基于元素路径)
  8. css(元素选择器)

汇总:

  1. 基于元素属性特有定位方式(id/name/class_name,selenium单独提供定位方法)
  2. 基于元素标签名称定位:tag_name(定位a标签(超链接:文本可点击跳转)
  3. 定位超链接文本(link_text,pattial_link_text)
  4. 基于元素路径定位(xpath)
  5. 基于选择器(css)

2.1.1 id定位说明:

说明:一般情况下唯一
方法:driver.find_element(By.ID, "userA").send_keys("admin")
前提:元素必须有id属性

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

# 获取 浏览器对象
diver=webdriver.Chrome()
# 打开 Url
diver.get(url=r"D:\test\资料\注册A.html")

# 查找 用户名元素
username = driver.find_element(By.ID, "userA")
# 查找 密码元素
password = driver.find_element(By.ID, "passwordA")
# 用户名输入 admin
username.send_keys("admin")
# 密码输入 123456
password.send_keys("123456")

sleep(3)
diver.quit()

注意:斜杠\是本地路径用的
反斜杠/是浏览器用的,这里直接用反斜杠会报错

可用:

  1. url = r"D:\test\资料\注册A.html" (r:修饰的字符串,如果字符串中有转义字符,不进行转义使用
  2. url = "D:\\test\\资料\\注册A.html" (使用双反斜杠,进行转义操作  
  3. url = "file:///D:/test/资料/注册A.html"

tips: 赋值浏览器路径,乱码但可执行,浏览器可自动识别

不可用:

  1. url = "D:/test/资料/注册A.html"

扩展:

可查找元素后直接输入

# 查找元素 用户名 并输入admin
driver.find_element(By.ID, "userA").send_keys("admin")
# 查找元素 密码框 并输入123456
driver.find_element(By.ID, "passwordA").send_keys("123456")

2.1.2 name定位:

说明:一般情况下有多个 ,可以重名
方法:driver.find_element(By.NAME, "userA").sent_keys("admin")
前提:元素必须有name属性

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

# 获取浏览器对象
driver = webdriver.Chrome()
# 打开url
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 查找元素 用户名 并输入admin
driver.find_element(By.NAME, "userA").send_keys("admin")
# 查找元素 密码框 并输入123456
driver.find_element(By.NAME, "passwordA").send_keys("123456")
# 等待三秒
sleep(3)
# 关闭浏览器驱动对象
driver.quit()

2.1.3 class_name定位:

方法:driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")
注意:标签名可以有多个

# 查找元素 用户名 并输入admin
driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")

以上为基于元素属性^


以下为基于标签属性v

2.1.4 tag_name定位:

通过标签名:
说明:当有多个标签名的时候,默认返回符合要求的第一个标签
方法:driver.find_element(By.TAG_NAME, "input").send_keys("admin")
注意:标签名可以有多个,存在多个标签,默认返回第一个

# 使用标签名tag_name input定位用户名并输入admin
# 注意:页面中如果存在多个相同的标签名,默认返回第一个
driver.find_element(By.TAG_NAME, "input").send_keys("admin")

说明:只能定位超链接标签,只能精准匹配
方法:driver.find_element(By.LINK_TEXT, "访问 新浪 网站").click()
注意:标签为大段文字时不适合

# link_text:只能定位a标签;定位的内容必须为全部匹配
driver.find_element(By.LINK_TEXT, "访问 新浪 网站").click()
# driver.find_element(By.LINK_TEXT, "访问").click() //这个情况下报错,必须为全部匹配

说明:定位超链接标签,可以使用精准和模糊匹配,模糊匹配最好使用具有唯一标志性的关键词
(需要唯一代表性,否则默认返回符合操作的第一个,也可以使用完全匹配)
方法:driver.find_element(By.PARTIAL_LINK_TEXT, "访问").click()
注意:无法代表唯一性时不准确

# partial_link_text:只能定位a标签;定位的内容可以模糊部分内容,但是必须能代表唯一性
driver.find_element(By.PARTIAL_LINK_TEXT, "访问").click()
# driver.find_element(By.PARTIAL_LINK_TEXT, "新浪").click() //默认返回匹配的第一个

2.1.7 XPATH

  • 为什么使用XPATH和css 定位:
  1. id,name,class依赖于这三个元素对应的属性,如果元素没有以上三个属性,定位方法不能使用
  2. link_text和partial_link_text只适合超链接
  3. tag_name:只能找页面唯一元素,或者多个相同元素中的第一个元素
  • XPath()基于元素的路径:(xml 和path 简称)XML主要是数据的存储和传递,HTML重点在数据的显示,CSS重点是元素的样式

XPATH定位策略:(是一种标记语言,后缀.xml)

方法:driver.find_element(By.XPATH, "//p[@id = 'p1']/input").send_keys("admin")

  1. 路径定位:

    • 绝对路径:以单斜杠开头逐级开始,不能跳级如:/html/body/form/div/fieldset/p[2]/input

      #单斜杠开头
      driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[2]/input").send_keys("12345")
    • 相对路径:以双斜杠开头,双斜杠后面跟元素名称,不知元素名称可以使用*代替
      如://p[@id = 'login-T2']/input 与 //*[@id = 'login-T2']/input 效果相同。
      注意:使用*时检索速度慢

  2. 路径结合属性:
    语法:在Xpath中,所有属性必须使用@符合修饰 如://*input[@id=id值]
    注意:在XPATH终所有属性都要加上@

  3. 路径结合逻辑(多个属性):
    语法://*[@id="id值" and @属性值="属性值"]

  4. 路径结合层级:
    语法://*[@id='父级id属性值'] / input
    driver.find_element(By.XPATH, "//p[@id = 'p1']/input").send_keys("admin")

提示:

  1. 一般见识使用指定标签名称,不使用*代替,效率比较慢
  2. 无论是绝对路径和相对路径,/后面必须为元素的名称或者*
  3. 扩展:在工作中,如果能使用相对路径绝对不使用绝对路径

语法:
driver.find_element_by_xpath(xpath).send_keys()

练习:
需求:
打开注册A.html页面,完成以下操作

1).使用绝对路径定位用户名输入框,并输入:admin
2).暂停2秒
3).使用相对路径定位密码输入框,并输入:123

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

# 获取浏览器对象
driver = webdriver.Chrome()
# 获取地址
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 使用绝对路径定位用户名输入框,并输入:admin
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[1]/input").send_keys("admin")
# 暂停2秒
sleep(2)
# 使用相对路径定位用户名输入框,并输入:123
driver.find_element(By.XPATH, "//p[2]/input").send_keys("123")
# 暂停三秒
sleep(3)
# 退出
driver.quit()

扩展:

  1. //*[text()="文本内容"] 根据文本内容查找
    一般适合p标签,a标签
    如://a[text()="访问 新浪 网站"]
  2. //*[contains(@type,"word")] 属性中含有xxx的元素
    contains为关键字,不可更改
  3. //*[starts-with(@id,"pass")] 以xxx开头的元素
    stars-with为关键字,不可更改

2.1.8css定位方法:

  1. css是一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须找到元素,在css标记语言中使用css选择器
  2. css定位就是通过css选择器工具进行定位
  3. 极力推荐,查找效率高,语法比xpath更简单

方法:element = driver.find_element(By.CSS_SELECTOR,"span").text

css定位常用策略:

  1. id选择器
  2. class选择器
  3. 元素选择器
  4. 属性选择器
  5. 层级选择器

id选择器:
前提:元素必须有id属性
语法 #id 如:#password

class选择器:
前提:元素必须有class属性
语法 .class 如:.class

元素选择器:
语法:element 如:input

属性选择器:
语法:[属性名=属性值]

层级选择器:
语法:
1.p>input
2.p input
提示:>与空格的区别,使用大于号时后面必须为子元素,空格则不用

练习:

  1. 使用css id选择器 定位用户名 输入admin
  2. 使用css 属性选择 定位密码框 输入123456
  3. 使用css class 选择器 定位电话号码: 18611112222
  4. 使用css 元素选择器 定位span标签获取文本值
  5. 使用层级选择器 定位email 输入 123@qq.com
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 获取浏览器对象
driver = webdriver.Chrome()
# 获取地址
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 使用css id选择器 定位用户名 输入admin
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")
# 使用css 属性选择器 定位密码框 输入123456
driver.find_element(By.CSS_SELECTOR, "[name ='passwordA']").send_keys("123456")
# 使用css class选择器 定位电话号码:18611112222
driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18611112222")
# 使用css 元素选择器 定位span标签获取文本值
span = driver.find_element(By.CSS_SELECTOR, "span").text
print("获取的span标签文本值:", span)
# 使用层级选择器 定位email 输入123@qq.com
driver.find_element(By.CSS_SELECTOR, 'p[type="emailA"]').send_keys("123@qq.com")
# 暂停三秒
sleep(3)
# 退出
driver.quit()

扩展:[了解]
1.[属性^='开头的字母'] #获取指定属性以指定字母开头的元素 
2.[属性$='结束的字母'] #获取指定属性以指定字母结束的元素
3.[属性*='包含的字母'] #获取指定属性中包含指定字母的元素

# 开头 定位用户名 输入admin
driver.find_element(By.CSS_SELECTOR, "[name^='us']").send_keys("admin")
# 结束 定位密码框 输入123456
driver.find_element(By.CSS_SELECTOR, "[name$='dA']").send_keys("123456")
# 包含 定位电话号码:18611112222
driver.find_element(By.CSS_SELECTOR, "[class*='el']").send_keys("18611112222")

工具:
可复制Xpath路径以及CSS路径,但不推荐使用,路径长且不一定唯一定位

2.1.9 定位一组元素:

方法:driver.find_elements(By.CSS_SELECTOR,"span")
返回结果:类型为列表,要对列表进行访问和操作必须指定下标或进行遍历[ 下标从0开始]
示例1:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome()
url = r"D:\test\资料\注册A.html"
driver.get(url)

# 获取所有input元素,列表形式
elements = driver.find_elements(By.TAG_NAME, "input")
print(len(elements))
print("element的类型为:", type(elements))

sleep(3)
driver.quit()

输出:

示例2:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome()
url = r"D:\test\资料\注册A.html"
driver.get(url)

elements = driver.find_elements(By.ID, "userA")

# 输入内容 
# 第一种:通过下标访问
# elements[0].send_keys("admin")
# 第二种:通过遍历来输入
for el in elements:
    el.send_keys("admin")

sleep(3)
driver.quit()

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值