环境:python3.8
更新中~~
一、八大元素定位方法:
1、id
id属性,确保id唯一。
以百度输入框为例,打开Baidu,按F12,点击左上角箭头点击输入框,就能看到对应的HTML源码,<input ..> 标签中的 id就是id属性
代码实现:driver.find_element(By.ID, "kw")
2、XPATH
用得比较多的方法.
F12后再Ctrl+F 输入XPATH值能检索结果是否唯一、是否定位正确
xpath绝对定位:严格按照元素顺序,过于依赖当前页面元素结构,不稳定xpath相对定位:灵活、用法多、建议用,根据元素本身特征查找、不用按特定顺序.包含以下这些方法:
1).属性定位: //标签名[@属性名=属性值]
2).多个属性组合:and or //标签名[@属性名=属性值 and @属性名=属性值]
3).文本定位://标签名[text()="文本"]
百度例子://span[text()="女儿给爸爸洗脚拍照后转身就走"]
4).文本与属性值组合: //标签名[text()="已签到" and @class="tip"]
5).模糊匹配-包含:
//标签名[contains(text(),"文本")]
//标签名[contains(text(),"文本") and @属性值=属性值]
百度例子://span[contains(text(),"女儿给爸爸洗脚拍照后转身就走") and @class="title-content-title"]
6). * (尽量少用) 模糊匹配
//*[text()="签到"]
//span[@*="member"]
//*[@*="member"]
7).层级定位 :
7.1. 通过父或者祖先找子元素(经常用到),通过自己本身的特征无法唯一定位自己的时用层级定位。格式:
//父标签[@id="u1"]//子标签[@name="tj_login"]
这里用双斜杠比较灵活,单斜杠没那么灵活
7.2.轴定位:通过子元素找祖先元素
语法: 已知元素//...//../轴名称::标签名[@属性名=“属性值” and @属性名=“属性值”]//..
4种轴名称:
parent:父元素 -- 通过子找父 (找到子元素再父)
//子标签名[@属性名="属性值"]/parent::父标签[@属性名=“属性值”]
//子标签名[@属性名="属性值"]/parent::父标签*
ancestor: 通过子找祖先元素
//子标签名[@属性名="属性值"]//子元素标签/ancestor::父标签[@属性名=“属性值”]
preceding-sibling: 通过我 找姐姐/哥哥元素(同一父元素,排在你前面的)
//标签名[@属性名="属性值"]//标签/preceding-sibling::标签[@属性名=“属性值”]
following-sibling: 通过哥哥姐姐找弟弟
//标签名[@属性名="属性值"]//标签/following-sibling::标签[@属性名=“属性值”]
3、link_text
超链接文本, a标签之间的文本
<a>文本</a>
4、partial_link_text
部分超链接文本。
5、name
name属性
6、tag_name
指的是 <> 尖括号中的标签名
7、class_name
class属性
8、css_selector
查看源码实现:(by.py)
二、实现
1. 找单个元素 driver.find_element() 结果是字符串
2. 找多个元素driver.find_elements() 结果 是列表, 找到后再根据下标再定位
元素定位没问题,运行脚本仍然报错提示找不到元素原因:
1、元素在iframe中,这个时候要switch_to.frame,切换iframe
2、添加了智能等待, 还是提示找不到元素。driver.implicitly_wait()
这个时候加个硬性等待即可。 time.sleep(1)