一、什么是元素定位
- 元素定位就是查找HTML元素的过程,操作页面元素之前,首先要对元素进行定位,所以定位是自动化脚本编写的开始。
- 通常使用find_element或find_elements方法来定位元素(find_element 使用给定的方法定位和查找一个元素;find_elements 使用给定的方法定位和查找所有的元素)
二、Selenium元素定位常用API
1.By_id定位
当所定位的元素具有id属性的时候我们可以通过by_id来定位该元素
例如:打开百度,定位搜索框
搜索框页面源代码:属性id值为kw
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="255" autocomplete="off">
-
'''
-
1.学习目标
-
必须掌握selenium中元素定位方法,id定位方法
-
2.操作步骤(语法)通过元素id属性定位
-
driver.find_element_by_id(id属性的值)
-
3.需求
-
在百度页面中使用id属性定位百度输入框
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器(获取浏览器对象)
-
driver = webdriver.Chrome()
-
# 3.输入网址
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.元素定位(id定位方法),百度输入框
-
'''
-
注意:
-
如果有多个相同属性值的元素,单数形式,定位第一个.
-
'''
-
srk = driver.find_element_by_id("kw")
-
# 打印srk对象
-
print(srk)
-
# 查看元素对应的源码
-
print(srk.get_attribute("outerHTML"))
-
# 5.关团浏览器
-
driver.quit()
-
'''
-
输出结果:
-
-
(session="6fbad6d63614e1cae6cd346153a7105e",
-
element="0dd374b6-74ed-4f4c-b610-5c772fd8c366")>
-
我们可以看到srk是一个WebElement类型的对象。
-
查看元素对应的源码如下:
-
-
说明我们已经把百度首页的输入框获取到了。
-
'''
复数形式:
-
'''
-
学习目标
-
复数形式
-
复数定位形式:driver.find_elements_XXX
-
复数定位,返回的列表类型数据
-
遍历列表操作具体元素
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.输入网址
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.通过by_id复数定位
-
srk = driver.find_elements_by_id("kw")
-
# 5.查看返回结果数据类型
-
print("结果数据类型", type(srk))
-
print("元素个数", len(srk))
-
# 6.遍历结果,查看源码
-
for i in srk:
-
# 查看元素对应的源码
-
print(i.get_attribute("outerHTML"))
-
# 7.关团浏览器
-
driver.quit()
-
'''
-
结果数据类型
-
元素个数 1
-
-
'''
异常总结:
异常1:AttributeError:'list' object has no attribute 'get_attribute' :表示定位元素返回的是一个列表格式,原因:使用复数定位方式 find_elements获取的定位
异常2 :NoSuchElementException : 表示元素没找到元素,原因是定位方式出现问题,有一种情况是属性值写错了。
2.by_name 定位
当所定位的元素具有name属性的时候,我们可以通过by_name来定位该元素
如上图中的百度搜索页面,搜索框页面源代码:属性name值为wd
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
使用name属性定位百度搜索框
-
'''
-
1.学习目标:
-
必须掌握selenium的元素定位方法by_name
-
2.语法
-
name定位
-
driver.find_element_by_name(name属性的值)
-
3.需求
-
使用name属性定位百度搜索框
-
4.总结
-
当元素中有name属性时才能使用上述定位方法
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器(获取浏览器对象)
-
driver = webdriver.Chrome()
-
# 3.输入网址
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4. 使用name定位百度搜索框
-
'''
-
注意:
-
如果有多个相同属性值的元素,单数形式,定位第一个.
-
'''
-
srk = driver.find_element_by_name("wd")
-
# 打印srk对象
-
print(srk)
-
# 打印定位元素所在行的源码
-
print(srk.get_attribute("outerHTML"))
-
# 5.关闭浏览器
-
driver.quit()
-
'''
-
输出结果:
-
-
(session="3149d334336f0eab9e4d8d394e4efd72",
-
element="0.1359081202533734-1")>
-
-
'''
复数形式:
-
'''
-
学习目标
-
复数形式
-
复数定位形式:driver.find_elements_XXX
-
复数定位,返回的列表类型数据
-
遍历列表操作具体元素
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.输入网址
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.通过by_id复数定位
-
srk = driver.find_elements_by_name("wd")
-
# 5.查看返回结果数据类型
-
print("结果数据类型", type(srk))
-
print("元素个数", len(srk))
-
# 6.遍历结果,查看源码
-
for i in srk:
-
# 查看元素对应的源码
-
print(i.get_attribute("outerHTML"))
-
# 7.关团浏览器
-
driver.quit()
-
'''
-
结果数据类型
-
元素个数 1
-
-
'''
3.by_class_name 定位
当所定位的元素具有class属性的时候,我们可以通过by_class_name来定位该元素
搜索框页面源代码:属性classname值为s_ipt
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="255" autocomplete="off">
使用class属性定位百度搜索框
-
'''
-
1.学习目标:
-
必须掌握selenium的元素定位方法by_class_name
-
2.语法
-
classname定位
-
driver.find_element_by_class_name(class属性值)
-
3.需求
-
使用class属性定位百度搜索框
-
4.总结
-
当元素中有class属性时才能使用上述定位方法
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器(获取浏览器对象)
-
driver = webdriver.Chrome()
-
# 3.输入网址
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4. 使用name定位百度搜索框
-
'''
-
注意:
-
如果有多个相同属性值的元素,单数形式,定位第一个.
-
'''
-
srk = driver.find_element_by_class_name("s_ipt")
-
# 打印srk对象
-
print(srk)
-
# 查看元素对应的源码
-
print(srk.get_attribute("outerHTML"))
-
# 5.关闭浏览器
-
driver.quit()
-
'''
-
输出结果:
-
-
(session="e4f97a48e7f113e681950b62c7789966",
-
element="0.5782514739919584-1")>
-
-
'''
复数形式:
-
'''
-
学习目标
-
复数形式
-
复数定位形式:driver.find_elements_XXX
-
复数定位,返回的列表类型数据
-
遍历列表操作具体元素
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.输入网址
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.通过by_id复数定位
-
srk = driver.find_elements_by_class_name("s_ipt")
-
# 5.查看返回结果数据类型
-
print("结果数据类型", type(srk))
-
print("元素个数", len(srk))
-
# 6.遍历结果,查看源码
-
for i in srk:
-
# 查看元素对应的源码
-
print(i.get_attribute("outerHTML"))
-
# 7.关团浏览器
-
driver.quit()
-
'''
-
结果数据类型
-
元素个数 1
-
-
'''
4.by_tag_name 定位
by_tag_name方法可以通过元素的标签名来查找元素。由于搜索到的标签名通常不 止一个,所以一般结合使用find_elements方法来使用
假设页面中有一个button按钮
-
-
'''
-
1.学习目标:
-
必须掌握selenium中tag_name定位方法
-
2.语法
-
driver.find_element_by_tag_name(标签名) # 单数形式
-
driver.find_elements_by_tag_name(标签名) # 定位一组标签名相同的元素
-
3.需求
-
在页面中,使用tag_name对按钮注册用户A定位
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
import os
-
# 2.打开浏览器(获取浏览器对象)
-
driver = webdriver.Chrome()
-
# 3.打开注册A页面
-
url = "file:///" + os.path.abspath("./练习页面/注册A.html")
-
driver.get(url)
-
sleep(2)
-
# 4.使用tag_name定位按钮
-
'''
-
注意:
-
如果有多个相同标签的元素,单数形式,定位第一个.
-
'''
-
button = driver.find_element_by_tag_name("input")
-
print(button.get_attribute("outerHTML"))
-
# 5.关闭浏览器
-
sleep(2)
-
driver.quit()
-
'''
-
输出结果:
-
-
'''
复数形式:
-
'''
-
1.学习目标:
-
必须掌握selenium中tag_name定位方法
-
2.语法
-
driver.find_element_by_tag_name(标签名) # 单数形式
-
driver.find_elements_by_tag_name(标签名) # 定位一组标签名相同的元素
-
3.需求
-
在页面中,使用tag_name复数形式定位 input标签
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
import os
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.打开注册A页面
-
url = "file:///" + os.path.abspath("./练习页面/注册A.html")
-
driver.get(url)
-
sleep(2)
-
# 4.使用tag_name复数形式定位 input标签
-
input_elements = driver.find_elements_by_tag_name("input")
-
# 查看结果类型
-
print(type(input_elements))
-
print(len(input_elements))
-
# 5.遍历列表打印每个元素的源码
-
for element in input_elements:
-
print(element.get_attribute("outerHTML"))
-
# 6.关闭浏览器
-
driver.quit()
-
'''
-
输出结果:
-
-
16
-
-
-
-
-
......等等
-
'''
tag_name定位:
单数形式
当页面中如果定位的标签是唯一的,可以直接使用tag_name方法定位
如果所定位的标签在页面中的索引位置是第一个,也可以用tag_name方法定位
复数形式
复数定位形式:driver.find_elements_XXX
复数定位,返回的列表类型数据
遍历列表操作具体元素
5.by_link_text 定位
by_link_text通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接
例如打开百度首页,定位点击超链接地图
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>
使用link_text定位百度首页地图链接
-
'''
-
1.学习目标:
-
必须掌握selenium中超链接的定位方法
-
2.语法
-
link_text # 需要链接的全部文本
-
driver.find_element_by_link_text(全部文本)
-
3.需求
-
在页面中,使用定位连接的方法,访问百度网站,定位点击超链接地图。
-
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
import os
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.打开页面
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.使用link_text定位
-
'''
-
注意:
-
连接的全部文本,表示标签中的全部内容,有空格也要算。
-
如果有相同部分文本的元素,单数形式,定位第一个。
-
'''
-
linkText = driver.find_element_by_link_text("地图")
-
print(linkText.get_attribute("outerHTML"))
-
# 5.关闭浏览器
-
driver.quit()
-
'''
-
输出结果:
-
'''
复数形式:
-
# 定位一组标超链接文本全部内容相同的元素,很少用到。# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.打开页面
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.使用link_text定位
-
'''
-
注意:
-
连接的全部文本,表示标签中的全部内容,有空格也要写。
-
'''
-
linkText = driver.find_elements_by_link_text("地图")
-
# 5.遍历列表打印每个元素的源码
-
for element in linkText:
-
print(element.get_attribute("outerHTML"))
-
# 6.关闭浏览器
-
driver.quit()
-
'''
-
输出结果:
-
'''
6.by_partial_link_text 定位
当你不能准确知道超链接上的文本信息或者只想通过一些关键字进行匹配时,可以使 用by_partial_link_text这个方法来通过部分链接文字进行匹配
例如打开百度首页,定位点击超链接
<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
使用partial_link_text方法定位百度首页
-
'''
-
1.学习目标:
-
必须掌握selenium中超链接的定位方法
-
2.语法
-
partial_link_text # 需要连接部分文本
-
driver.find_element_by_partial_link_text(部分文本)
-
部分文本必须是连续的文字(中可包含空格)
-
3.需求
-
在页面中,使用定位连接的方法,访问百度网站,定位点击超链接
。 -
'''
-
# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.打开页面
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.使用by_partial_link_text定位
-
'''
-
注意:
-
连接的部分文本,表示标签中的连续的部分内容,之中有空格也要算。
-
如果有相同部分文本的元素,单数形式,定位第一个。
-
'''
-
pLinkText = driver.find_element_by_partial_link_text("ao1")
-
print(pLinkText.get_attribute("outerHTML"))
-
# 6.关闭浏览器
-
sleep(2)
-
driver.quit()
-
'''
-
输出结果:
-
'''
复数形式:
-
# 定位一组标超链接文本目标内容相同的元素,很少用到。# 1.导入selenium
-
from selenium import webdriver
-
from time import sleep
-
# 2.打开浏览器
-
driver = webdriver.Chrome()
-
# 3.打开页面
-
url = "http://www.baidu.com"
-
driver.get(url)
-
sleep(2)
-
# 4.使用by_partial_link_text定位
-
'''
-
注意:
-
连接的部分文本,表示标签中的连续的部分内容,之中有空格也要算。
-
'''
-
pLinkText = driver.find_elements_by_partial_link_text("ao1")
-
# 5.遍历列表打印每个元素的源码
-
for element in pLinkText:
-
print(element.get_attribute("outerHTML"))
-
# 6.关闭浏览器
-
driver.quit()
-
'''
-
输出结果:
-
'''
以上就是selenium的基础元素定位,下次讲解xpath和css定位方法,感兴趣的可以关注下。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取



评论记录:
回复评论: