1、利用兄弟、父子节点定位
如上,当我们想定位input标签时,但是该id是动态的,class属性又是和很多标签相同时,我们可以看下父子节点或者兄弟节点,
比如上面label标签,就有个特点,利用文本来定位:
//label[text()=\"获取默认网关并添加到系统默认路由\"]
这样input的定位也出来了,其中 .. 表示上一级,也就是父节点
//label[text()=\"获取默认网关并添加到系统默认路由\"]/../input
2、当定位时,怎么看xpath都是对的,但是就是找不到,可以考虑以下几点:
- 是否存在iframe标签下,iframe标签相当于另外的一个页面,当元素处于其下时,需要先跳入iframe,
driver.switch_to_frame(元素定位)
- 可能元素还未出现,需要等待几秒,使用sleep,或者
wait_until_element_is_visible()
- 使用其他元素帮助定位,如父子节点
3、 判断input框是否勾选并勾选:
input_select = self.selenium.get_webelement(xpath路径)#元素定位
# 判断勾选框是否已经选中
selected = input_select.is_selected()
if selected:
print('已经选中')
else:
print('未选中')
input_select.click()
4、根据class属性定位的格式:
//div[@class=\"x-grid3-body\"]
5、当想定位的节点需要先定位父节点,而父节点根据class属性定位出来有多个结果
先用xpath定位父节点,
list_webelements=self.selenium.get_webelements(xpath路径)
list_webelements[父节点所在的列表位置].find_element_by_xpath('./table/tbody/tr/td[1]/div/div').click()
其中 . 表示当前路径
6、验证自己的xpath是否正确
谷歌浏览器f12,console输入$x("xpath路径"),看能否获取到想要的结果
7、过滤出来的元素有多个,取其中一个继续过滤
tmp_webelement = self.selenium.get_webelements('//table[@class=\"x-btn x-btn-noicon adm-form-window-btn sdn-sbumit-btn\"]')[1] tmp_webelement.find_element_by_xpath("./tbody/tr[2]/td[2]/em/button").click()