Python系列文章主要是记录自己学习成果及知识输出整合,提供一个温故而知新的场所。
在WebDriver中提供8种不同定位策略
iupt标签
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
a标签
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻a>
以百度搜索框为例:
ID具有唯一性,所以定位效率非常快
driver.find_element(By.ID, 'kw')
除了ID外,其他属性可能不是唯一性,所以可能会定位到多个元素
driver.find_element(By.NAME, 'wd')
driver.find_element(By.TAG_NAME, 'input')
不可以使用复合类名,例:submit am-btn,需去掉一个类名如:submit
driver.find_element(By.CLASS_NAME, 's_ipt')
driver.find_element(By.LINK_TEXT, '新闻')
driver.find_element(By.PARTIAL_LINK_TEXT, '闻')
driver.find_element(By.CSS_SELECTOR, '#kw')
driver.find_element(By.XPATH, '//*[@id="kw"]')
返回单个元素
# ID具有唯一性,如果可以通过ID定位元素就可以使用
driver.find_element(By.ID, 'kw')
# 如果使用其他属性,就需要保证其他属性的唯一性,如
driver.find_element(By.NAME, 'wd')
返回多个元素,通过列表的形式返回
# 如果元素属性不唯一,或者想要使用同级别的元素,就可以使用find_elements
# 如 input标签种type值可能在一个网页存在多个
<input type="hidden" name="rsv_spt" value="1">
<input type="hidden" name="rsv_iqid" value="0xc8af5ebe000b8fc8">
# 这种情况可以使用name属性值来进行定位,这里因为name的唯一性就可以使用
find_element
# 如果想使用type定位第一个,只能使用find_elements
elements = driver.find_elements(By.XPATH, '//input[@type="hidden"]')
# 通过列表下标的方式,选择想要的元素进行操作
elements[0].click
#ID(id选择器通过#加id值进行定位)
driver.find_element(By.CSS_SELECTOR, '#kw')
.class(class选择器通过.加class值进行定位)
driver.find_element(By.CSS_SELECTOR, '.s_ipt')
通过input、a、span等元素标签进行定位
driver.find_element(By.CSS_SELECTOR, 'input')
通过标签里面的具体属性值定位
driver.find_element(By.CSS_SELECTOR, "input[id='kw']")
通过元素路径来定位
driver.find_element(By.CSS_SELECTOR,'form span input')
XPATH是’XML路径查询语言’
XPATH优势:
层级表示:
/html/body/div (/ (开头)根路径;/ (中间)下一级; //任一级 )
属性表示:
//input[@id='kw']
位置表示(从1开始,没有-1):
//input/div[1]
元素表示:
直接写元素名
//input 或者 //*
*代表所有元素
常用的函数
text:定位标签之间的文本(精确定位)
//div[text()='vvv']
contains:判断元素与给定字符串是否包含关系
//div[contains(@input,'vvv')]
//div[contains(text(),'vvv')]----标签之间包含文本内容
starts-with:以什么开头的元素(多用于动态元素定位)
//div[starts-with(@input,'vvv')]
ends-with:以什么结尾的元素
//div[ends-with(@input,'vvv')]
last:最后一个元素
//div[last()]
四字口诀:父子兄弟
相对路径 代表相对于当前节点的 单个节点(可向上找看,可向下找)
通过当前节点找到父级,再找到兄弟元素
//*[@id='v']/div/div/a (当前节点)
//*[@id='v']/div/div/a/../input (..为父级/input是兄弟元素)
代表相对于当前节点的 N个节点
轴名称 | 结果 |
---|---|
following | 自身之前的所有元素 |
preceding | 自身之后的所有元素 |
ancestor | 所有先辈(父、祖父等) |
ancestor-or-self | 所有先辈以及自身 |
parent | 父节点 |
preceding-sibling | 所有兄节点 |
self | 自身 |
following-sibling | 所有弟节点 |
child | 所有子元素 |
descendant-or-self | 所有后代元素以及当前节点本身 |
descendant | 所有后代元素 |
例:
name = driver.find_element(By.XPATH, "//*[@id='v']/div/div/a") # (当前节点)
name.find_element(By.XPATH, "ancestor::*[1]/input") # (ancestor是找所有祖先的,[1]代表父级[2]代表祖父级以此类推)
原理:通过JS代码,遍历附近所有元素的rect(坐标+大小),然后进行元素筛选定位
优势:根据元素实际展示效果进行定位,不关心具体层级
劣势:效率低,准确低,通用性差,很多时候无法按照预期工作
相对定位 | 作用 |
---|---|
above | 在指定元素上方进行搜索 |
below | 在指定元素下方进行搜索 |
to_left_of | 在指定元素左侧进行搜索 |
to_right_of | 在指定元素右侧进行搜索 |
near | 在指定元素附近(50px)进行搜索 |
例:
name = driver.find_element(By.XPATH, "//*[@id='v']/div/div/a") #(当前节点)
n_name = driver.find_element(locate_with(By.TAG_NAME,'a').above(name))
以上就是文章要表达的内容,本文介绍了web自动化测试selenium的八种元素定位策略,最主要还是CSS选择器和XPATH选择器:CSS选择器,通用性好,执行效率高,是selenium推荐的选择器;XPATH选择器,效率高,有很多的函数,用法灵活更精确。