一、注意事项
find_element_by:只返回一个元素,找不到元素则报错
find_elements_by:返回匹配到的所有元素,当没有找到元素时不会报错,而是返回空列表[ ]
元素定位优先级: ID>name>css selector>xpath
在项目中我们可能用的最多的是css或者xpath,那么针对这两种,我们优先选择css,原因在哪些?
原因1:css是配合html来工作,它实现的原理是匹配对象的原理,而xpath是配合xml工作的,它实现的原理是遍历的原理,所以两者在设计上,css性能更优秀
原因2:语言简洁,明了,相对xpath
原因3:前端开发主要是使用css,不使用xpath,所以在技术上面,我们可以获得帮助的机会非常多
定位元素注意事项:
找到待定位元素的唯一属性
如果该元素没有唯一属性,则先找到能被唯一定位到的父元素/子元素/相邻元素,再使用> , " " , +等进行辅助定位
不要使用随机唯一属性定位
最重要的是多跟研发沟通,尽量把关键元素加上ID或者name,并减少不合理的页面元素,例如重复ID这样的事情最好不要发生
二、元素定位方法
1.id定位:find_element_by_id("id")
2.class定位:find_element_by_class_name("class")
3.name定位:find_element_by_name("name")
4.tag定位:find_element_by_tag_name("div")
5.link定位:find_element_by_link_text("新闻")
6.partial link定位:find_element_by_partial_link_text("一个很长的")
7.xpath定位:绝对路径定位、利用元素属性定位、层级与属性结合、使用逻辑运算符
(1)绝对路径定位:find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
find_element_by_xpath()方法使用XPath语言来定位元素。XPath主要用标签名的层级关系来定位元素的绝对路径,最外层为html语言。在body文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,例如,div[2]表示当前层级下的第二个div标签。
(2)利用元素属性定位:find_element_by_xpath("//*[@id='kw']") #注意外层 " 符号和内层 ' 符号
//表示当前页面某个目录下,input 表示定位元素的标签名,[@id="kw"]表示这个元素的 id 属性值等于kw。下面通过name和class属性值来定位。浏览器开发者工具F12,复制,XPath
(3)层级与属性结合:find_element_by_xpath('//[@id="cnblogs_post_body"]/p[1]/a[1]')
如果一个元素本身没有可以唯一标识这个元素的属性值,name我们可以找其上一级元素,如果它的上一级元素有可以唯一标识属性的值。也可以拿来使用。
(4)使用逻辑运算符:find_element_by_xpath('//input[@id="kw"and @class="su"]/span/input')
8.Css定位:
(1) 通过 class 属性定位:find_element_by_css_selector(".s_ipt")
(2) 通过 id 属性定位:find_element_by_css_selector("#kw")
(3) 通过标签名定位:find_element_by_css_selector("input")
(3.1)通过父子关系定位:find_element_by_css_selector("span>input")
(3.2)通过属性定位:find_element_by_css_selector("[autocomplete=off]")
(3.3)组合定位:find_element_by_css_selector("span.bgs_btn_wr>input#su")
9.用By定位:
针对前面介绍的 8 种定位方法,WebDriver 还提供了另外一套写法,即统一调用 find_element()方法,通过 By 来声明定位的方法,并且传入对应定位方法的定位参数,具体如下:
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,"登陆")
find_element(By.PARTIAL_LINK_TEXT,"登")
find_element(By.XPATH,"//*[@class='bgs_btn']")
find_element(By.CSS_SELECTOR,"span.bgs_btn_wr>input#su")