xpath定位的高级用法

有时候我们需要先定位到父元素,再去定位某个元素

注意:当你使用 父元素.find_element_by_xpath 这种方式定位的时候,元素定位表达式必须以点开头,如

ele = driver.find_elements_by_xpath("//div[@id='category-block']//ol/li")       #父元素

b = ele.find_elements_by_xpath('.//li[@class=\'subcate-item\']//span')

如果不用点,会从整个文档开始找,即使你前边使用了父元素也没有效果

绝对路径定位

绝对路径定位 从顶层 html 开始往下找,像文件夹一样写的完整路径, 缺点:一旦页面结构发生改变,路径也随之失效,必须重新定位。 所以不推荐使用绝对路径的写法

以 "/"  开头, 让xpath 从文档的根节点开始解析 

相对路径定位

以"//" 开头, 让xpath 从文档的任何元素节点开始解析(也就是说每个节点都作为起点找一下)

索引定位

//input[2]  任意节点下的第二个 input 标签

属性定位

//input[@type="submit"]    任意节点下type 属性为 submit 的 input 标签

其他定位方式

parent  选取当前节点的父节点

//*[@id="content_views"]/p[51]/span[1]/parent::p

 

 后面的就不一个一个举例了

 

ancestor  选取当前节点的所有先辈(父、祖父等)

//*[@id="content_views"]/p[51]/span[1]/ancestor::div

ancestor-or-self  选取当前节点的所有先辈(父、祖父等)以及当前节点本身(不包含叔叔伯伯

//*[@id="content_views"]/p[51]/span[1]/ancestor-or-self::div

descendant选取当前节点的所有后代元素(子、孙等)

//*[@id="content_views"]/descendant::span

descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身

//*[@id="content_views"]/p[51]/descendant-or-self::p

preceding   选取文档中当前节点的开始标签之前的所有节点

//*[@id="content_views"]/p[51]/preceding::p

preceding-sibling选取当前节点之前的所有同级节点

//*[@id="content_views"]/p[51]/span[2]/preceding-sibling::span

following   选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素

//*[@id="content_views"]/p[51]/following::p

following-sibling选取当前节点之后的所有同级节点

//*[@id="content_views"]/p[51]/span[2]/following-sibling::span

注意这个::后面跟的是对应的父、子、同级等标签

posted @ 2020-08-31 15:43  懒惰的咸鱼  阅读(2505)  评论(0编辑  收藏  举报