定位辅助工具:
chrome:一,自带的ctrl+f 二,ChroPath插件
firefox:firebug插件
定位原则:
1,不依靠节点顺序和节点位置。
2,只要能够找得到匹配特征的元素久可以。
3,有id尽量用,尽量定位到要操作的元素上。
4,定位选取时分析页面结构,考虑属性不会变化,稳定的不变的,有代表性。
8种定位策略:
ID:id是指页面元素的属性名id值,因为元素id在整个页面中是唯一的,所以如果元素有id属性,通过id定位是首选的方式。如果id不唯一则不建议使用。对应定位方法:find_element_by_id
NAME:通过元素的name属性进行定位。对应定位方法:find_element_by_name
CLASS NAME:通过元素的class name属性进行定位。对应定位方法:find_element_by_class_name
TAG NAME:通过元素名定位,基本不用,因为相同的tagname太多。对应定位方法:find_element_by_tag_name
LINK_TEXT:通过链接文本内容全匹配。对应定位方法:find_element_by_link_text
PARTIAL LINK:通过链接文本内容模糊匹配。对应定位方法:find_element_by_partial_link_text
CSS:css_selector定位。对应定位方法:find_element_by_css_selector
XPATH:通过xpath表达式定位。对应定位方法:find_element_by_xpath
XPATH定位:
基本语法:
/ 绝对定位,从根节点选取
// 相对定位,从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置。
. 选取当前节点
.. 选取当前节点的父
@ 选取属性。@class="xxx" @id="xxx"。属性放在中括号[]中
- 通配符。匹配所有标签
@* 匹配所有属性
绝对定位:
/开头 父节点/子节点关系
相对定位:
//开头 后可以接//
对比优缺点:页面元素一旦发生变化,绝对路径就会失效。
所以一般不适用绝对路径来定位元素。
定位方式:
1,使用标签名+节点属性定位, //标签名[@属性名=值]
2,使用文本匹配定位,//标签名[text()=值]
3,模糊匹配(包含),//标签名[contains(@属性/text(),值)]
4,逻辑运算 and or,//标签名[@属性=值 and contains(@属性,值) and text()=值]
5,层级定位,//一级元素//二级元素//N级元素
6,组合元素索引(下标)定位,//li[@class="num"][2]//img
7,轴定位:常用4种
ancestor:祖先节点 包括父
parent:父节点
preceding-sibling:当前元素节点标签之前的所有兄弟节点
following-sibling:当前元素节点标签之后的所有兄弟节点 #要找的元素是已知的后边元素
find_element和find_elements:
源码中,8大定位方式实际都是调用driver.find_element(by, value),直接使用这个方法框架中使用时会更加灵活一些。使用时要导入By类:from selenium.webdriver.common.by import By
find_element(By.定位策略,定位表达式),返回的是WebElement对象。
find_elements(By.定位策略,定位表达式),返回时一个对象列表。