web页面元素定位
所有web网页中有8种元素定位方式
靠单一的特征找元素:6种(id,class_name,tag_name,name,link_text(2))
组合各种特征和关系来找元素:2种(xpath,css)
以下4种方法对所有元素可用
1.id:唯一,id不变时首选它。
# 一个元素有很多属性时,元素定位优先级首先是id,但id有时是变的,如果id是不变的,可用它来定位。 # 如果id是变化/动态的,那么要舍弃id定位方式,换别的。 # 以百度首页为例: # 这里定位策略是id,定位表达式是id="kw"。 ele = driver.find_element_by_id("kw") # 元素有属性+操作-----返回的是webElement对象(所以selenume中对元素是做了一层封装的) # driver所有的查找方法都是find_element开头,所有的查找结果都是webElement。 # id在web网页中只会找到一个元素,所以只有一个对象可以返回. # 如果找到的是多个,须纠正开发. print(ele)
2.标签名称 tag_name:可以找到一个或多个,不唯一,所以查找方法都一样。
ele = driver.find_element_by_tag_name("input") # 在DOM/html中匹配到的第一个元素
print(ele)
eles = driver.find_elements_by_tag_name("input") # 多个,返回的是列表,元素为webElement对象,页面中全部匹配的元素.
# 按整个html页面从上到下一层层找
print(eles)
3.class_name(不唯一):同上。
ele1 = driver.find_element_by_class_name("")
print(ele1)
ele2 = driver.find_elements_by_class_name("")
print(ele2)
4.name(不唯一):同上。
# 虽name很多时候重名,但尽可能不重名,每个人都有自己的一个名字,名义上不绝对唯一,但很多时候唯一性很高 ele3 = driver.find_element_by_name print(ele1) ele4 = driver.find_elements_by_name print(ele1)
a元素:两种方法
5.完整匹配文本值
driver.find_element_by_link_text("更多产品") # a链接的文本必须是"更多产品"4个字 # 全量匹配,完全匹配 # 不是绝对唯一:一个页面中允许多个链接文本值是一样的 # 当前页面中,任何一个元素只要它的文本值是‘更多产品’,那就完全匹配.
6.部分匹配/包含
driver.find_elements_by_partial_link_text("产品")
# 只要a元素的文本内容中有"产品"两字,就符合要求.
以上6种方法在使用时,可能有时候会找不到元素,或者找到了后面又变了。所以用xpath或css组合定位。
7.xpath定位
# 绝对定位:路径绝对(兼容差,过度依赖位置和继承关系) 从祖先开始到本身 以/开头 /父/子
# 相对定位:
# 在整个html页面,逐个条件,找到唯一的元素。
# 摆脱位置和继承关系,web自动化首选。
# 按ctrl+f打开下面的输入框使用相对路径进行查找
# 多个属性:通过逻辑运算and/or
1>.以//开头,//标签名[@属性名=值] 如果标签名是*,匹配所有标签。
//input[@id="kw"] # 找属性id,值为kw的元素
2>.多个属性:通过逻辑运算and/or
//*[@id="kw" and @name="wd" and @class="s_ipt"] # 同时满足 //*[@id="kw" or @name="wd" or @class="s_ipt"] # 满足其中一个
3>.通过元素的文本内容来定位---文本内容固定才可用----函数 //标签名[text()=对应的文本值]
//p[text()="平均出勤率"]
4>.包含:属性/文本内容包含一部分即可-----//标签名[contains(@属性/text(),被包含的内容)]
# 属性包含方式: //span[contains(@class,"quickdelete-wrap")]
# 文本包含方式: //h1[contains(text(),"第2期")]
# 包含与逻辑and/or相结合 //h1[contains(text(),"第2期") and @id="ccc"]
5>.层级定位:
# 通过父辈/祖先辈 # 以百度首页为例: # 定位登录元素 # 它是一个a链接,有链接地址,有name/class/onclick属性,文本内容。 # 首选name属性定位 //a[@name="tj_login"] # 会出现两个元素,不知道是哪个,可以将鼠标分别放在两个黄色部分,会显示定位路径/元素特征的就是要找的元素。
两个元素一模一样,靠它自己本身根本找不到。
用find elements找到所有匹配的元素,然后通过下标取值。
两个一模一样分不清,可能爹/祖先不一样。
通过父辈/祖先辈,先找到不一样的先辈,在先辈下面再找。------层级定位
# 通过父辈找元素: # /只能跟直系后代(会限制前后关系:父/子) # //只要是后代就行 //div[@id="u1"]/a[@name="tj_login"]
6>.轴定位:多用于表格
已知元素/轴名称::标签名称[@属性=值]
轴运算:
ancestor:祖先结点,包括父。
parent:父结点
preceding:当前元素节点标签之前的所有结点。(html页面先后顺序)
preceding-sibling:当前元素节点标签之前的所有兄弟结点。
following:当前元素节点标签之后的所有结点。(html页面先后顺序)
following-sibling:当前元素节点标签之后的所有兄弟结点。
8.css定位