selenium--元素定位

Posted guang2508

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium--元素定位相关的知识,希望对你有一定的参考价值。

定位界面元素

1、根据元素特征:id,name,class,tag,超链接  

写法1:

ele=driver.find_element_by_id(kw)

写法2:

from selenium.webdriver.common.by import By
ele=driver.find_element(by=By.ID,value=kw)

 tag为元素标签,类似div,span等

 超链接:driver.find_element_by_link_text(‘转到百度‘)

     driver.find_element_by_partial_link_text(‘百度‘)    #根据部分超链接文本定位元素,模糊匹配

 

2、css

1、选择元素的方法 tag/id/class

  • 根据ID,用 #  ele=driver.find_element_by_css_selector(‘#food‘)
  • 根据class,用 .   ele=driver.find_element_by_css_selector(‘.vegetable‘)
  • 根据tag和class或id的组合写  ele=driver.find_element_by_css_selector(‘span.vegetable‘)
  • 查找 在ID为food的后代元素中 标签为span且class为vegetable 的元素 ele=driver.find_element_by_css_selector(‘#food span.vegetable‘)
  • 后代元素用空格 ,直接子元素 >

 

2、组选择,同时选择多个元素,用逗号隔开

语法<s1>,<s2>

比如:p,button  #food,.cheese

组合使用:

1、选择  id为food的所有span子元素  和  所有的p (包括非food的子元素):#food>span,p

2、选择  id为food的  所有span子元素和所有的p子元素:#food>span,#food>p

3、选择id为food的所有子元素:#food>*

 

3、兄弟节点选择:

  • 二者有相同的父元素,且一个元素紧接在另一个元素后面,用 +

  比如:#food+div     #many>div>p.special+p  兄弟元素,且紧接在后面

  • 二者有相同的父元素,一个元素在另一个元素的后面(不一定需要紧邻),用 ~

  比如:#food~div 兄弟元素,但不一定紧接后面

 

4、属性选择器:可以根据元素的属性及属性值来选择元素

  • *[style]  
  • p[spec=len2]  
  • p[spec=‘len3 len4‘] #有特殊字符空格,需要加引号  
  • p[spec*=‘len2‘]  #包含,包含len2就被取到  
  • p[spec^=‘len2‘]  #开头,以len2开头就被取到   
  • p[spec$=‘len2‘]  #结尾,以len2结尾就被取到  
  • p[class=special][name=p1]  #通过多个属性来定位

5、伪类

  • :nth-child(n)  #选择的元素必须在指定的位置,n从1开始,正向数  .food p:nth-child(1)  #class为food的第一个后代元素,且标签为p,如果第一个不是p,则取不到
  • :nth-last-child(n)  #选择的元素必须在指定的位置,n从1开始,倒数
  • :nth-of-type(n)  #不要求是第几位,只要是第几个出现的就可以,n从1开始,正向数  .food p:nth-of-type(1)  #class为food的后代元素中标签为p的第一个元素,若用*则可能取到多个
  • :nth-last-of-type(n)  #不要求是第几位,只要是第几个出现的就可以,n从1开始,倒数

6、验证CSS选择器

  • 在element内,ctrl+f 查找
  • 在console内,$$(‘......‘) 查找

 

3、xpath

1、选择元素的方法

// :后代元素     /:子元素  //*[@class="name"]

 

2、组选择(根据多个属性定位)

//p[@class="name"][@class="age"]

 

3、子元素选择

  • 选择属于其父元素的第N个类型的子元素

    //*[@id="food"]/p[1]  等价于 #food>p:nth-of-type(1)

  • 选择属于其父元素的倒数第N个某个类型的子元素

    //span[last()-1]  属于其父元素的倒数第二个span

    //*[@id="food"]/span[last()]  id为food下的倒数第一个span元素

  • 选择属于其父元素的第N个子元素(基于所有类型元素)

    //*[2]  等价于 //*[position()=2]

    //*[@id="food"]/*[position()=3]

  • 支持其他的 比较操作符

    //*[@id="food"]/*[position()<3]

    //*[@id="food"]/*[position()<=3]

  • 选择属于其父元素的倒数第N个子元素

    //*[@id="food"]/*[last()-1]   等价于 //*[@id="food"]/*[position()=last()-1]

    多选 //*[@id="food"]/*[position()>last()-3]

  • 选择中间部分的子元素(范围)

    //*[@id="food"]/*[position()>1][position()<last()]  或者  //*[@id="food"]/*[position()>1 and position()<last()]

  • 选择两端的子元素

    //*[@id="food"]/*[position()<=1 or position()>=last()]

 

 4、属性选择器:可以根据元素的属性及属性值来选择元素

//span[contains(@class,"name")]  #包含

//span[starts-with(@class,"name")]  #开头

#结尾---浏览器未实现,只能用css

 

5、相邻兄弟选择器

//*[@id="food"]/following-sibling::div  选择id=food的后面的兄弟div元素(多个)

//*[@id="food"]/following-sibling::div[1]  选择id=food的后面的兄弟div元素中的第一个,下标从1开始

//*[@id="food"]/preceding-sibling::div  选择id=food的前面的兄弟div元素(多个)

//*[@id="food"]/preceding-sibling::div[1]  选择id=food的前面的兄弟div元素中的离的最近的一个,下标从1开始,下标越大,距离越远

 

6、父元素 ..

//*[@id="food"]/..  选择id=food的父元素

 

7、局部查找 .//

es=ele.find_elenments_by_xpath(‘.//span‘)  #相对路径,前面需要加点 . 

 

操作界面元素

1、输入操作:点击、输入文字、拖拽

driver.back()  #后退

driver.forward()  #前进

driver.refresh()  #刷新

driver.get_screenshot_as_file(r‘D:aidu.png‘)  #页面截图,保存路径为D:aidu.png,注意图片格式为png

ele.screenshot(r‘D:aidu2.png‘)  #元素截图,先定位元素,后根据元素截图,保存路径为D:aidu2.png,注意图片格式为png

driver.maximize_window()  #最大化

driver.minimize_wndow()  #最小化

driver.set_window_size(800,600)  #设置指定的尺寸大小

 

2、输出操作:获取元素的各种属性

text属性:显示该元素在web页面显示出来的文本内容

get_attribute方法

 1、某个属性的值

  ele.get_attribute(‘href‘)  #获取属性href的值

 2、该元素对应html源代码    #等于本身+内部部分↓

  ele.get_attribute(‘outerHTML‘)

 3、该元素的内部部分的HTML源代码

  ele.get_attribute(‘innerHTML‘)

print(driver.title) :获取网页的标题,即head里的title里的文本信息

print(driver.current_url) :获取当前窗口的url

获取窗口尺寸:

size=driver.get_window_size()
print(f高度{size["height"]},宽度{size["width"]})

获取元素尺寸:

e_size=ele.size
print(f高度{e_size["height"]},宽度{e_size["width"]})

获取窗口位置(窗口左上角坐标):

loc=driver.get_window_position()
print(f坐标x:{loc["x"]},y:{loc["y"]})

获取元素坐标(元素左上角坐标):

e_loc=ele.location
print(f元素坐标是x:{e_loc["x"]},y:{e_loc["y"]})

 

3、文本框操作

ele.send_keys(‘你好‘)  #输入

ele.clear()  #清除

ss=ele.get_attribute(‘value‘)  #获取文本框内的文本

 

4、单选框操作(type为radio类型)

ele.click()  #点击,即为选择操作

ele.is_selected()  #判断是否被选中,结果为True或False

 

5、多选框(type为checkbox)

ele.click()  #点击,即为选择操作,操作前需要先获取选择状态

ele.is_selected()  #判断是否被选中,结果为True或False

 

6、select选择框(标签为select) multiple代表可多选,没有则只能单选

先导入类:from selenium.webdriver.support.select import Select

参数化:sel=Select(se)

调用方法:

sel.select_by_visible_text(‘自行车‘)  #选择‘自行车’

sel.deselect_by_visible-text(‘火车‘)  #取消选择‘火车’

sel.select_by_index(0)  #选择第一个,下标从0开始

sel.deselect_all()  #全部取消选择

ops=sel.all_selected_options    #返回所有被选择的元素

for op in ops:

    print(op.text)    打印元素文本

 

以上是关于selenium--元素定位的主要内容,如果未能解决你的问题,请参考以下文章

selenium+Python页面元素定位问题

『心善渊』Selenium3.0基础 — 4Selenium基础元素定位详解

selenium8种常用元素定位简介

Selenium基础篇之八大元素定位方式

java+selenium,请问该如何定位#shadow-root里面的元素?

python+selenium 定位隐藏元素