一,selenium的八种定位方法:
1,id定位: find_element_by_id()
ps:前端约定id原则上页面唯一,但也可能出现多个;
2,name定位: find_element_by_name()
ps:前端约定name原则上页面唯一,但也可能出现多个;
3,class定位:find_element_by_class_name()
ps:class页面不唯一;
4,tag定位:find_element_by_tag_name()
5,link定位:find_element_by_link_text()
ps:此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接
6,partial_link定位:find_element_by_partial_link_text()
ps:有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
我们用这种方法来定位百度首页的“新闻”超链接
7,xpath定位:find_element_by_xpath()
前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。
但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了
8、CSS定位:find_element_by_css_selector()
这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍
二,复杂定位xpath和css_selector
1,XPath : XPath 使用路径表达式来选取 XML 文档中的节点或者节点集
1)查找某个特定的节点或者包含某个指定的值的节点:
2)未知元素:
3)选取若干路径:
4)补充:
//*[starts-with(@attribute,’xxx’)] 属性以xxx开头的元素
//*[contains(@attribute,’xxxxx’)] 属性中含有xxx的元素
//*[@attribute1=value1 and @attribute2=value2] 同时有两个属性值的元素
/ 代表子元素,// 代表后面的子子孙孙元素
//*[text()='xxx'] 文本为xxx的元素
following-sibling::div[1] 弟元素(div为示例标签,实际要写实际的标签名)
preceding-sibling::div[1] 兄元素(div为示例标签,实际要写实际的标签名)
5)示例:
a)找到图中的"网页"元素,在Console中用$x("xpath")可查看是否能找到对应元素:
ps1:$x("//*[@id='s_tab']/div/b") id为s_tab下的div下的b标签,则 self.driver.find_element_by_xpath("//*[@id='s_tab']/div/b")可找到该元素;
ps2:由于 id为s_tab下的div下只有一个b标签,则"//*[@id='s_tab']//b"与"//*[@id='s_tab']/div/b"效果相同;
ps3:该b标签的class值为cur-tab,则"//*[@id='s_tab']//*[@class='cur-tab']"与//*[@id='s_tab']/div/b效果相同;
b)找到图中"更多"元素:
ps1:"更多"元素是id为s_tab下的div下的最后一个a标签,self.driver.find_element_by_xpath("//*[@id='s_tab']//a[last()]")可找到该元素;
ps2:"更多"元素的class为s-tab-item s-tab-more 且文本为"更多",则self.driver.find_element_by_xpath("//*[@class='s-tab-item s-tab-more' and text()='更多']")可找到该元素
2,css_selector:CSS 中,选择器是一种模式,用于选择需要添加样式的元素
1)通过伪类名、id、标签名定位:
2)通过元素之前嵌套关系
3)通过属性
4)补充:
(1)first-child:第一个后代元素
(2)last-child:最后一个后代元素
(3)nth-child(N):指定第N个后代元素下面举例:
(a)input:first-child 定位所有层次第一个为input的元素,注意是第一个元素为input标签的
(b)span input:first-child 定位span标签下,第一个为input标签的元素
(c)span :last-child 定位span标签下,最后一个元素
(d)span input:last-child 定位span标签下,最后一个为input标签的元素
(e)span :nth-child(2) 定位span标签下,第二个元素
(f) span p:nth-child(2) p元素的父级的第二个子级,(这里要确保第二个子级确实是p标签才可以)
(g)form.fm>:nth-child(2) 定位form标签,class等于fm下的第二个元素
(h) span :nth-of-type(2) 定位span标签下,第二个元素
(i) span p:nth-of-type(2) 定位span标签下,第二p标签的元素
6)示例:
a)找到找到图中的"网页"元素,在Console中用$("css")可查看是否能找到对应元素:
ps1: $('#s_tab>div>b') id为s_tab下的div下的b标签,则self.driver.find_element_by_css_selector('#s_tab>div>b')能够找到该元素;
ps2:该b标签的class值为cur-tab,则'#s_tab b'与'#s_tab>div>b'效果相同;
b)找到图中"更多"元素:
ps1:self.driver.find_element_by_css_selector('#s_tab a:last-child')
ps2:self.driver.find_element_by_css_selector('#s_tab>div :last-child')
ps3:self.driver.find_element_by_css_selector('#s_tab a:nth-of-type(9)')