自动化(二)——八种元素定位方法

一、元素定位

目标:掌握id、name、class_name、tag_name、link_text、partial_link_text、XPath、CSS八种定位方式

为什么要掌握元素定位?
让程序操作指定元素,就必须线找到此元素

1)如何元素定位

在这里插入图片描述
谷歌浏览器,按F12出现右侧的检查栏,点击鼠标,然后再点击页面中的元素,则可以找到该元素的组成代码。
在这里插入图片描述

定位元素时,依赖于以下几点:
1、标签名
2、属性
3、层级
4、路径

二、元素定位方式

Selenium提供了八种定位元素方式
1、id
2、name
3、class_name
4、tag_name
5、link_text
6、partial_link_text
7、XPath
8、CSS

在这里插入图片描述

1)id定位

在这里插入图片描述
案例

# 导包
from selenium import webdriver
from time import sleep 
# 获取浏览器对象
driver = webdriver.Chrome()

# 打开url
# 在路径前添加r也可
# r是修饰的字符串,如果字符串中有转义字符,不进行转义使用
# url = r"E:\课程文件\暑期学习\html\day02\03表单.html"
url = "E:\\课程文件\\暑期学习\\html\\day02\\03表单.html"
driver.get(url)

# 查找用户名
username = driver.find_element_by_id("yhm")

# 查找密码元素
pwd = driver.find_element_by_id("mm")

# 用户名输入admin		输入方法:send_keys("内容")
username.send_keys("admin")

# 密码输入123456		输入方法:send_keys("内容")
pwd.send_keys("123456")

# 暂停3s
sleep(5)
# 退出浏览器
driver.quit()

2)name定位

在这里插入图片描述

# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器对象
driver = webdriver.Chrome()

# 打开url
# 在路径前添加r也可
# r是修饰的字符串,如果字符串中有转义字符,不进行转义使用
# url = r"E:\课程文件\暑期学习\html\day02\03表单.html"
url = "E:\\课程文件\\暑期学习\\html\\day02\\03表单.html"
driver.get(url)

# 查找用户名
username = driver.find_element_by_name("yhm1")

# 查找密码元素
pwd = driver.find_element_by_name("yhm2")

# 用户名输入admin   send_keys("内容")
username.send_keys("admin")

# 密码输入123456
pwd.send_keys("123456")

# 暂停3s
sleep(5)
# 退出浏览器
driver.quit()

3) class_name定位

在这里插入图片描述

# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器对象
driver = webdriver.Chrome()

# 打开url
# 在路径前添加r也可
# r是修饰的字符串,如果字符串中有转义字符,不进行转义使用
# url = r"E:\课程文件\暑期学习\html\day02\03表单.html"
url = "E:\\课程文件\\暑期学习\\html\\day02\\03表单.html"
driver.get(url)

# 查找用户名
username = driver.find_element_by_class_name("yhm1")

# 查找密码元素
pwd = driver.find_element_by_class_name("yhm2")

# 用户名输入admin   send_keys("内容")
username.send_keys("admin")

# 密码输入123456
pwd.send_keys("123456")

# 暂停3s
sleep(5)
# 退出浏览器
driver.quit()

在这里插入图片描述

id一般是唯一的
name可以重复,可以包含一组元素
class可以多个名字,通过名字来获得属性

4) tag_name定位

在这里插入图片描述
在这里插入图片描述

# 导包
from selenium import webdriver
from time import sleep

# 获取浏览器驱动对象
driver = webdriver.Chrome()

# 打开页面
url = "E:\\课程文件\\暑期学习\\html\\day02\\03表单.html"
driver.get(url)

# 使用tag_name定位用户名,并输入admin
# 页面中如果存在多个同名的标签,只会返回第一个。
driver.find_element_by_tag_name("input").send_keys("admin")

# 暂停3s
sleep(3)

# 退出驱动器
driver.quit()

5) link_text以及partial_link_text

在这里插入图片描述

"""
    driver.find_element_by_link_text("")   # 定位元素方法
    click()   # 点击方法

    注意:
        link_text:
            1、只能定位a标签
            2、link_text定位元素的内容必须为全部匹配
"""
# 导包
from selenium import webdriver
from time import sleep

# 获取浏览器驱动对象
driver = webdriver.Chrome()

# 打开页面
url = r"E:\课程文件\暑期学习\8天web全套测试视频视频教程\8天web自动化讲义\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 使用link_text定位 访问网站
driver.find_element_by_link_text("访问 新浪 网站").click()

# 暂停3s
sleep(3)

# 退出驱动器
driver.quit()

partial_link_text定位元素的内容可以为模糊部分值,但是必须能代表唯一性

# 导包
from selenium import webdriver
from time import sleep

# 获取浏览器驱动对象
driver = webdriver.Chrome()

# 打开页面
url = r"E:\课程文件\暑期学习\8天web全套测试视频视频教程\8天web自动化讲义\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 使用partial_link_text可以实现模糊定位 访问网站

# 没有使用唯一代表词时,默认操作符合条件的第一个元素

# 使用全部匹配也能够进行操作。
driver.find_element_by_partial_link_text("访问").click()


# 暂停3s
sleep(3)

# 退出驱动器
driver.quit()

6) Xpath

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(1)路径

绝对路径
在这里插入图片描述
相对路径
在这里插入图片描述

(2)路径结合属性

在这里插入图片描述

(3) 路径结合逻辑

在这里插入图片描述

(4)路径结合层级

在这里插入图片描述

(5) 案例

"""
    使用绝对路径定位  用户名,输入admin
    暂停2s
    使用相对路径定位  密码框,输入123

    driver.find_element_by_xpath()
"""

# 导包
from selenium import webdriver
from time import sleep

# 创建浏览器驱动对象
driver = webdriver.Chrome()

# 打开html界面
url = r"E:\课程文件\暑期学习\8天web全套测试视频视频教程\8天web自动化讲义\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 定位元素
driver.find_element_by_xpath('//*[@id="userA"]').send_keys("admin")

sleep(3)

driver.find_element_by_xpath('//*[@id="passwordA"]').send_keys("admin")

# 暂停3s
sleep(3)

# 关闭
driver.quit()

(6)Xpath拓展

Xpath延伸

  1. //*[text()=‘XXX’] # 定位文本值等于XXX的元素
    提示:一般适合 p标签,a标签
  2. //*[contains(@属性,‘xxx’)] # 定位属性包含xxx的元素 【重点】
    提示:contains为关键字,不可更改。
  3. //*[starts-with(@属性,‘xxx’)] # 定位属性以xxx开头的元素
    提示:starts-with为关键字不可更改

在这里插入图片描述
在这里插入图片描述

7) CSS定位

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

方法:
driver.find_element_by_css_selector()

(1)CSS定位常用策略

    1. id 选择器
      前提:元素是必须有id属性
      语法:#id 如:#passwordA
    1. class 选择器
      前提:元素是必须有class属性
      语法:.class 如:.telA
    1. 元素选择器
      语法:element 如:input
    1. 属性选择器
      语法:[属性名=属性值]
    1. 层级选择器
      语法:
      1. p>input
      2. p input
  • 提示:>与空格的区别,大于号必须为子元素,空格则不用。
    在这里插入图片描述
    在这里插入图片描述

(2)案例

"""
    1、使用id选择器定位用户名,输入admin
    2、使用属性选择器定位密码框,输入123456
    3、使用class选择器定位电话号码,输入182
    4、元素选择器定位span标签获取其文本值
    5、使用层级选择器定位email,输入123456789

    获取文本的方法: element.text
"""

# 导包
from selenium import webdriver
from time import sleep

# 创建浏览器驱动对象
driver = webdriver.Chrome()

# 打开html界面
url = r"E:\课程文件\暑期学习\8天web全套测试视频视频教程\8天web自动化讲义\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# id选择器定位元素
driver.find_element_by_css_selector('#userA').send_keys("admin")
sleep(3)

# 属性选择器
driver.find_element_by_css_selector('[name="passwordA"]').send_keys("123456")
sleep(3)

# class选择器
driver.find_element_by_css_selector('.telA').send_keys("182")
sleep(3)

# 元素选择器
span = driver.find_element_by_css_selector('span').text
print("span的文本值为:"+span)
sleep(3)

# 层级选择器
driver.find_element_by_css_selector('p input[placeholder="电子邮箱A"]').send_keys("123456789")
sleep(3)

# 暂停3s
sleep(3)

# 关闭
driver.quit()

(3)CSS拓展

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


	复制xpath:/html/body/form/div/fieldset/p[1]/input
	复制最简xpath://*[@id="userA"]
	复制CSS路径:html body form div#zc fieldset p#p1 input#userA
	
	提示: 
		1. 虽然借助工具可以快速生成xpath路径和css语法,但是前期不建议使用。
		2. 工具在智能,没有人智能。

在这里插入图片描述

三、元素定位方式总结

在这里插入图片描述

在这里插入图片描述

1)定位一组元素

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

# 导包
from selenium import webdriver
from time import sleep


# 获取 浏览器驱动对象
driver = webdriver.Firefox()

# 打开 注册A.html
url = r"D:\web自动化素材\课堂素材\注册A.html"
driver.get(url)

# 获取所有的input元素
# elements = driver.find_elements_by_tag_name("input")

elements = driver.find_elements_by_id("userA")
print(len(elements))
print("elements的类型为:", type(elements))

# 输入内容
# elements[0].send_keys("admin")

# 通过遍历来输入
for el in elements:
    el.send_keys("admin")

# 暂停 3秒
sleep(3)
# 退出浏览器驱动
driver.quit()

2)扩展8种元素定位的底层实现

方式:driver.find_element(By.xxx, 'value')
参数说明:
	By.xxx :为By类的类型 如:By.ID
	value: 元素的定位值 如: "userA"
	
By类:需要导包 位置: from selenium.webdriver.common.by import By

版权声明:本文为CloserSide原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。