selenium 定位元素的方式

942 阅读7分钟

1. 通过id属性选择元素[id唯一]

element=driver.find_element_by_id("kw")

2. 通过name属性选择元素

<input name="sheese" type="text"/>
element = driver.find_element_by_name("sheese")

3. 通过class属性选择元素

<div class="cheese"><span>cheddar</span></div>
<dic class="cheese"><span>gouda</span></div>
find_elements_by_class_name("cheese")   

4. 通过tag名选择元素[tag就是标签名]

<iframe src="..."></iframe>
element = driver.find_element_by_tag_name("iframe")
from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME,"iframe")

5. 通过链接文本选择元素

<a href="http:www.baidu.com">转到百度</a>
a > 全链接文本
ele = driver.find_element_by_link_text(u"转到百度")
b > 部分链接文本
也可以通过部分文本去找到该链接元素
ele = driver.find_element_by_partial_link_text(u"百度")

上述方法部分存在 element 和 elements 两种匹配方式
element 返回了最先匹配到的一个 elements 返回全部匹配的list

6. xpath

XPath 使用路径表达式在 XML 文档中选取节点。 xpath定位的要点

  • 寻找具有唯一属性值的属性
  • 尽量使用更直观的属性
  • 注意表述
  • 如果查找的控件有多个相同的, 这个时候要找到我们要找的控件相对不变的控件

1、路径表达式

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点
..选取当前节点的父节点
@选取属性

2、节点位置定位

通过节点的下标进行定位

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素

3、节点属性定位

通过节点的属性进行定位 属性可以多个用and连接

路径表达式结果
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须

4、未知节点

XPath 通配符可用来选取未知的 XML 元素

通配符描述实例说明
*匹配任何元素节点/bookstore/*选取 bookstore 元素的所有子元素
@*匹配任何属性节点//title[@*]选取所有带有属性的 title 元素
node()匹配任何类型的节点

5、轴定位

轴可定义相对于当前节点的节点集
语法: //节点类型/轴::节点类型
例子: //div[contains(.,'XXX')]/ancestor::td/following-sibling::td/div[contains(.,'正常')]

轴名称说明
ancestor选取当前节点的所有先辈(父、祖父等)
ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute选取当前节点的所有属性
child选取当前节点的所有子元素
descendant选取当前节点的所有后代元素(子、孙等)以及当前节点本身
following选取文档中当前节点的结束标签之后的所有节点
following-sibling选择当前节点之后的所有同级节点
namespace选取当前节点的所有命名空间节点
parent选取当前节点的父节点
preceding选取文档中当前节点的开始标签之前的所有节点
preceding-sibling选取当前节点之前的所有同级节点。
self选取当前节点
&nbsp
例子说明
child::book选取所有属于当前节点的子元素的 book 节点
attribute::lang选取当前节点的 lang 属性
child::*选取当前节点的所有子元素
attribute::*选取当前节点的所有属性
child::text()选取当前节点的所有文本子节点
child::node()选取当前节点的所有 book 后代
ancestor::book选择当前节点的所有 book 先辈
ancestor-or-self::book选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price选取当前节点的所有 price 孙节点

6、常用函数

函数说明用法
text()text()只获取节点本身的内容//button[text()='查询']
contains内容包含XXXX字符串//div[contains(@style,'XX')]
starts-with内容以XXX字符串开始//div[starts-with(@style,'XX')]
&nbsp

7. CSS选择器

selenium元素定位,CSS选择器定位效率会高很多

选择器示例示例说明
.class.intro选择所有class="intro"的元素
#id#firstname选择所有id="firstname"的元素
**选择所有元素
elementp选择所有<p>元素
element,elementdiv,p选择所有<div>元素和<p>元素
element elementdiv p选择<div>元素内的所有<p>元素
element>elementdiv>p选择所有父级是 <div> 元素的 <p> 元素
element+elementdiv+p选择所有父级是 <div> 元素的 <p> 元素
[attribute][target]选择所有带有target属性元素
[attribute=value][target=-blank]选择所有使用target="-blank"的元素
[attribute~=value][title~=flower选择所有带有target属性元素
[attribute=language][lang=en]选择一个lang属性的起始值="EN"的所有元素
:linka:link选择所有未访问链接
:visiteda:visited选择所有访问过的链接
:activea:active选择活动链接
:hovera:hover选择鼠标在链接上面时
:focusinput:focus选择具有焦点的输入元素
:first-letterp:first-letter选择每一个<P>元素的第一个字母
:first-linep:first-line选择每一个<P>元素的第一行
:first-childp:first-child指定只有当<p>元素是其父级的第一个子级的样式
:beforep:before在每个<p>元素之前插入内容
:afterp:after在每个<p>元素之后插入内容
:lang(language)p:lang(it)选择一个lang属性的起始值="it"的所有<p>元素
element1~element2p~ul选择p元素之后的每一个ul元素
[attribute^=value]a[src^="https"]选择每一个src属性的值以"https"开头的元素
[attribute$=value]a[src$=".pdf"]选择每一个src属性的值以".pdf"结尾的元素
[attribute*=value]a[src*="runoob"]选择每一个src属性的值包含子字符串"runoob"的元素
:first-of-typep:first-of-type选择每个p元素是其父级的第一个p元素
:last-of-typep:last-of-type选择每个p元素是其父级的最后一个p元素
:only-of-typep:only-of-type选择每个p元素是其父级的唯一p元素
:only-childp:only-child选择每个p元素是其父级的唯一子元素
:nth-child(n)p:nth-child(2)选择每个p元素是其父级的第二个子元素
:nth-last-child(n)p:nth-last-child(2)选择每个p元素的是其父级的第二个子元素,从最后一个子项计数
:nth-of-type(n)p:nth-of-type(2)选择每个p元素是其父级的第二个p元素
:nth-last-of-type(n)p:nth-last-of-type(2)选择每个p元素的是其父级的第二个p元素,从最后一个子项计数
:last-childp:last-child选择每个p元素是其父级的最后一个子级
:root:root选择文档的根元素
:emptyp:empty选择每个没有任何子级的p元素(包括文本节点)
:target#news:target选择当前活动的#news元素(包含该锚名称的点击的URL)
:enabledinput:enabled选择每一个已启用的输入元素
:disabledinput:disabled选择每一个禁用的输入元素
:checkedinput:checked选择每个选中的输入元素
:not(selector):not(p)选择每个并非p元素的元素
::selection::selection匹配元素中被用户选中或处于高亮状态的部分
:out-of-range:out-of-range匹配值在指定区间之外的input元素
:in-range:in-range匹配值在指定区间之内的input元素
:read-write:read-write用于匹配可读及可写的元素
:read-only:read-only用于匹配设置 "readonly"(只读) 属性的元素
:optional:optional用于匹配可选的输入元素
:required:required用于匹配设置了 "required" 属性的元素
:valid:valid用于匹配输入值为合法的元素
:invalid:invalid用于匹配输入值为非法的元素