Selenium元素定位方法总共有八大类,分别是:id,name,class name,tag name,link text,partial link text,xpath,css。八种定位方法没有哪个是最好的,在不同的场景下需要使用不用的定位方法。
示例html文件如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="referrer" content="origin" />
<title>centos7 部署openstf - ianduin - 博客园</title>
</head>
<body>
<div>
<a name="top">猜猜看</a>
<img alt="点我试试呀" src="/images/bg.jpg">
<div id="home">
<div id="cnblogs_post_body" class="blogpost-body">
<p><span style="line-height: 1.5">openstf项目开源地址:</span></p>
</div>
<div class="highlighter-rouge">
<div class="newsItem">
<h3 class="catListTitle">公告</h3>
<div id="blog-news">
明天也许是个好日子吧
</div>
</div>
</div>
</div>
</div>
</body>
</html>
1.1 ID定位
- 目标
根据元素ID找到“明天也许是个好日子吧”所属的元素
- 实现
element1 = driver.find_element_by_id(“blog-news”)
element2 = driver.find_element(by=”id”, value=”blog-news”)
- 说明
当前ID没有重复值,所有可以直接用find_element***定位元素,如果ID存在重复则在运行的时候会找不到元素,此时需要使用find_elements***,假设blog-news存在重复值,则定位方式如下:
element3 = driver.find_elements_by_id(“blog-news”)
element4 = driver.find_elements(by=”id”, value=”blog-news”)
使用driver.find_element(by=by, value=value)方式定位时,by传入的是定位方式,by在selenium.webdriver.common.by.By类中,各种定位方式对应关系如下:
CLASS_NAME = 'class name'
CSS_SELECTOR = 'css selector'
ID = 'id'LINK_TEXT = 'link text'
NAME = 'name'
PARTIAL_LINK_TEXT = 'partial link text'
TAG_NAME = 'tag name'
XPATH = 'xpath'
1.2 Class定位
- 目标
查找含有highlighter-rouge类的元素
- 实现
element1 = driver.find_element_by_class_name(“highlighter-rouge”)
element2 = driver.find_element(by=”class name”, value=”highlighter-rouge”)
- 说明
当前class name没有重复值,所有可以直接用find_element***定位元素,如果class存在重复则在运行的时候会找不到元素,此时需要使用find_elements***,假设highlighter-rouge存在重复值,则定位方式如下:
element3 = driver.find_elements_by_class_name(“highlighter-rouge”)
element4 = driver.find_elements(by=”class name”, value=”highlighter-rouge”)
另外class在实际项目中经常都是以组合的方式出现,但是find_element_by_class_name()只能是定位单各class name,复合class name的时候需要使用css或者使用xpath定位方式
1.3 Name定位
- 目标
查找name值为top的元素
- 实现
element1 = driver.find_element_by_name(“top”)
element2 = driver.find_element(by=”name”, value=”top”)
- 说明
当前name没有重复值,所有可以直接用find_element***定位元素,如果name存在重复则在运行的时候会找不到元素,此时需要使用find_elements***,假设top存在重复值,则定位方式如下:
element3 = driver.find_elements_by_class_name(“top”)
element4 = driver.find_elements(by=”class name”, value=”top”)
1.4 标签(tag name)定位
tag name即标签名称,如:a、input、button、img等
- 目标
查找页面中的a标签
- 实现
element1 = driver. find_element_by_tag_name(“a”)
element2 = driver. find_element(by=”tag name”, value=”a”)
- 说明
当前标签没有重复值,所有可以直接用find_element***定位元素,如果name存在重复则在运行的时候会找不到元素,此时需要使用find_elements***,假设a存在重复值,则定位方式如下:
element3 = driver.find_elements_by_class_name(“a”)
element4 = driver.find_elements(by=”class name”, value=”a”)
1.5 超链接文本(Link text)定位
- 目标
查找页面中的a标签
- 实现
element1 = driver. find_element_by_link_text(“猜猜看”)
element2 = driver. find_element(by=”tag name”, value=”猜猜看”)
- 说明
当前标签没有重复值,所有可以直接用find_element***定位元素,如果name存在重复则在运行的时候会找不到元素,此时需要使用find_elements***,假设“猜猜看”存在重复值,则定位方式如下:
element3 = driver.find_elements_by_class_name(“猜猜看”)
element4 = driver.find_elements(by=”class name”, value=”猜猜看”)
1.6 超链接模糊定位(partial link text)
- 目标
查找页面中的a标签
- 实现
element1 = driver. find_element_by_link_text(“猜猜看”)
element2 = driver. find_element(by=”tag name”, value=”猜猜看”)
- 说明
当前标签没有重复值,所有可以直接用find_element***定位元素,如果name存在重复则在运行的时候会找不到元素,此时需要使用find_elements***,假设“猜猜看”存在重复值,则定位方式如下:
element3 = driver.find_elements_by_class_name(“猜猜看”)
element4 = driver.find_elements(by=”class name”, value=”猜猜看”)
关注公众号获取更多内容