【Selenium学习】元素定位
18种定位
Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装
单数形式8种
1 # 1、id定位 2 al = driver.find_element_by_id('i1') 3 al.send_keys('id定位') 4 5 # 2、class定位 6 bl = driver.find_element_by_class_name('classname') 7 bl.send_keys('class定位') 8 9 # 3、css selector定位 10 cl = driver.find_element_by_css_selector('#i1') 11 cl.send_keys('css selector定位') 12 13 # 4、name定位:按照标签中的name属性定位 14 dl = driver.find_element_by_name('name') 15 dl.send_keys('name定位') 16 17 # 5、link_text 文本内容定位 18 import time 19 time.sleep(1) 20 driver.execute_script('window.scrollTo(0,0);') # 跳转到网页的最上面 21 time.sleep(1) 22 el = driver.find_element_by_link_text('跳转大师兄博客地址') 23 el.click() 24 25 # 6、partial_link_text 模糊文本内容匹配 26 import time 27 time.sleep(1) 28 driver.execute_script('window.scrollTo(0,0);') # 跳转到网页的最上面 29 time.sleep(1) 30 fl = driver.find_element_by_partial_link_text('跳转') 31 fl.click() 32 33 # 7、Xpath 定位 34 gl = driver.find_element_by_xpath('//input[@placeholder="请通过XPATH定位元素"]') 35 gl.send_keys('xpath 定位') 36 37 # 8、tag_name 标签名定位 38 hl = driver.find_element_by_tag_name('input') 39 hl.send_keys('tag_name 标签名定位')
复数形式也是8种,是以上8种的复数形式,返回的是一个列表
1 # 1、id定位 2 als = driver.find_elements_by_id('i1') 3 als[0].send_keys('id定位') 4 5 # 2、class定位 6 bls = driver.find_elements_by_class_name('classname') 7 bls[0].send_keys('class定位') 8 9 # 3、css selector定位 10 cls = driver.find_elements_by_css_selector('input') 11 cls[2].send_keys('定位到第三个input输入框') 12 13 # 4、name定位:按照标签中的name属性定位 14 dls = driver.find_elements_by_name('name') 15 dls[0].send_keys('name定位') 16 17 # 5、link_text 文本内容定位 18 import time 19 time.sleep(1) 20 driver.execute_script('window.scrollTo(0,0);') # 跳转到网页的最上面 21 time.sleep(1) 22 els = driver.find_elements_by_link_text('跳转大师兄博客地址') 23 els[0].click() 24 25 # 6、partial_link_text 模糊文本内容匹配 26 import time 27 time.sleep(1) 28 driver.execute_script('window.scrollTo(0,0)') # 跳转到网页的最上面 29 time.sleep(1) 30 fls = driver.find_elements_by_partial_link_text('示例') 31 fls[0].click() 32 33 # 7、Xpath 定位 34 gls = driver.find_elements_by_xpath('//input') 35 gls[4].send_keys('xpath 定位') 36 37 # 8、tag_name 标签名定位 38 hls = driver.find_elements_by_tag_name('input') 39 hls[5].send_keys('tag_name 标签名定位')
最后两种是前面16种的底层封装
1 driver.find_element('id','i1') 2 driver.find_elements('xpath','//input')
以上两种定位方式,第一个参数填入下面8个字符串,分别对应上面的16种定位方式,单数和复数分别对应
1 "id" 2 "xpath" 3 "link text" 4 "partial link text" 5 "name" 6 "tag name" 7 "class name" 8 "css selector"
下面举例说明:
1 ali = driver.find_element('id','i1') 2 ali.send_keys('xxxx') 3 # 相当于: 4 al = driver.find_element_by_id('i1') 5 al.send_keys('xxxx') 6 7 bls = driver.find_elements('css selector','input') 8 bls[1].send_keys('css selector') 9 # 相当于: 10 bl = driver.find_elements_by_css_selector('input') 11 bl[1].send_keys('css selector')
总结:
我们工作当中应该优先使用Css Selector定位,如果定位不到再用Xpath定位。因为查看源代码发现:使用id、name、tag name、class name定位,都会转换成css selector定位,具体源代码如下:
1 def find_element(self, by=By.ID, value=None): 2 if self.w3c: 3 if by == By.ID: 4 by = By.CSS_SELECTOR 5 value = '[id="%s"]' % value 6 elif by == By.TAG_NAME: 7 by = By.CSS_SELECTOR 8 elif by == By.CLASS_NAME: 9 by = By.CSS_SELECTOR 10 value = ".%s" % value 11 elif by == By.NAME: 12 by = By.CSS_SELECTOR 13 value = '[name="%s"]' % value 14 return self.execute(Command.FIND_ELEMENT, { 15 'using': by, 16 'value': value})['value'] 17 18 def find_elements(self, by=By.ID, value=None): 19 if self.w3c: 20 if by == By.ID: 21 by = By.CSS_SELECTOR 22 value = '[id="%s"]' % value 23 elif by == By.TAG_NAME: 24 by = By.CSS_SELECTOR 25 elif by == By.CLASS_NAME: 26 by = By.CSS_SELECTOR 27 value = ".%s" % value 28 elif by == By.NAME: 29 by = By.CSS_SELECTOR 30 value = '[name="%s"]' % value 31 return self.execute(Command.FIND_ELEMENTS, { 32 'using': by, 33 'value': value})['value'] or []
Xpath详细
一、什么是Xpath
XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素。
工具
Xpath的练习建议大家安装火狐浏览器后,下载插件,FireBug。由于最新版火狐不再支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/ 下载49版本以下的火狐就可以增加Firebug等扩展了。
二、Xpath的使用方法
注:默认死格式 先写 //* 代表定位页面下所有元素
1、Xpath通过标签的属性定位
1 @代表以属性定位,后面可以接标签中任意属性 2 通过ID定位 3 //*[@id='i1'] 4 5 通过Class定位 6 //*[@class='pg-header'] 7 8 通过Name定位 9 //*[@name='username'] 10 11 通过Type定位 12 //*[@ type='button']
2、当标签的属性重合时,Xpath提供了通过标签来进行过滤
1 获取所有input标签元素 2 //input 3 4 获取placeholder='用户名'的input标签元素 5 //input[@placeholder='用户名'] 这种方式比//*要快 6 7 当出现重复时可以使用下标定位,从1开始 8 //div[@class='inner'][2]
3、当标签页重复时,Xpath提供了层级过滤
例如:找不到儿子,那么就先找他的爸爸,实在不行可以在找他的爷爷
1 支持通过 / 进行层级递进,找到符合层级关系的标签 2 //form/div/input[@placeholder="用户名"] 3 4 当层级都重复时,可以通过单个层级的属性进行定位 5 //form/div[@class='login-user']/input
4、一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。Xpath提供了索引过滤
1 通过索引,在List中定位属性,与python的索引有些差别,Xpath从1开始 2 //select[@name='city'][1]/option[1]
5、上面集中如果都用上了之后还重复的话,我们就可以使用Xpath提供的终极神器,逻辑运算定位:and和or
通过and来缩小过滤的范围,只有条件都符合时才能定位到 //select[@name='city' and @size='4' and @multiple="multiple"] or就相反了,只要这些筛选中,其中一个出现那么久匹配到了 //select[@name='city' or @size='4']
Css Selector详细
一、什么是Css Selector
Css Selector定位实际就是HTML的Css选择器的标签定位
工具
Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 FireBug和FirePath组合使用。
二、Css Selector使用方法
1、通过ID、Class定位
1 ID定位 2 #号代表id,定位有id的标签方式更加简洁 3 #i1 4 5 Class定位 6 .代表Class 7 .c1 8 Class定位还提供了多个Class定位,通过连续.来缩小范围 9 .c1.c2.c3
2、通过标签定位
1 定位方式 :直接输入标签名称 2 div 3 input 4 单独用没什么作用,因为一个页面相同的标签太多了,需要和其他方式组合起来用
3、通过属性定位
1 属性定位方式,直接中括号,加上属性就可以了 2 [name='n1']
4、通过标签属性组合定位
1 标签属性组合 2 input[name='n1'] 3 4 标签与Class组合 5 input.c1 6 7 标签与ID组合 8 input#i1
5、通过多属性组合
1 Css Selector 的多属性组合选择过滤 没有and 只需要多个[] 连接 就可以 2 select[name='city'][size='4'][multiple="multiple"]
6、通过层级关系定位
1 与Xpath的不同 Css Selector通过 > 来区分层级的界定 2 select>option[value='3']
7、模糊匹配
1 ^= 匹配元素属性以什么开头 2 [placeholder^='请输入'] 3 4 $= 匹配属性以什么结尾 5 [placeholder$='元素'] 6 7 *= 匹配属性包含什么值 input 8 [placeholder*='ID']