selenium+python:元素定位的八种方式

id,name,class_name(这三种是元素的属性,而selenium单独针对这三种属性提供了对应的定位方法)

tag_name(这个针对标签名称定位)

link_text,partial_link_text(这个针对a标签,就是文本超链接定位)

XPath(这个基于元素的路径定位)

css定位 (这个基于元素选择器):

元素定位八种方式

id定位:

driver.find_element(By.ID,value="属性值")

name定位:

driver.find_element(By.NAME,value="属性值")

class_name定位(使用元素的class属性):

l1=driver.find_element(By.CLASS_NAME,value="属性值").click()

tag_name定位(标签名称<标签名.../>):

如果只有一个相同名称的标签可以用find_element

driver.find_element(By.TAG_NAME,value="input")#定位第一个元素

如果有多个相同的标签需要用find_elements

driver.find_elements(By.TAG_NAME,value="input")[2].click()#定位第二个元素

link_text定位 (定位超链接 a标签):

driver.find_elements(By.LINK_TEXT,value="访问 新浪 网站")

partial_link_text定位(定位超链接 a标签 模糊):

driver.find_elements(By.PARTIAL_LINK_TEXT,value="访问")

driver.find_elements(By.PARTIAL_LINK_TEXT,value="访问 新浪 网站")
 

XPath定位 (基于元素路径):

绝对路径定位:/单斜杠

driver.find_element(By.XPATH,value="/html/body/div[2]/div[4]/div/div[2]/button[1]").click()

 相对路径://双斜杠

driver.find_element(By.XPATH,value="//button[@id='applyMail']").click()#任意属性都可以

或者:

driver.find_element(By.XPATH,value="//*[@id='applyMail']").click()#(*)星号代表所有元素,但是此方法,需要遍历一遍所有元素查找,速度慢

driver.find_element(By.XPATH,value="//button@id='applyMail' and @class='btn btn-primary btn-lg']").click()

建议:

  1. 一般建议使用指定标签名称,不使用*代替,效率慢
  2. 无论是绝对路径还是相对路径,/后面必须要为元素的名称或者*
  3. 在工作中,如果能使用相对路径绝对不使用绝对路径
    1. 太长;
    2. 一旦页面结构发送变化(比如开发加个div层级就会发送变化,定位就失效了)

XPATH定位扩展:

//*text()="xxx"----------------------------------------------文本内容是xxx的元素

//*[contains(@属性,"xxx")]-------------------------属性中含有xxx的元素(移动端经常会用到)

//*[starts-with(@属性,"xxx")]----------------------属性以xxx开头的元素

css定位 (元素选择器)推荐使用,比XPATH效率高,其他定位有的css定位差不多都有非常灵活:

  1.  id选择器
  2. class选择器
  3. 元素选择器
  4. 属性选择器
  5. 层级选择器
    1. id选择器
      driver.find_element(By.CSS_SELECTOR,value="#applyMail")#选择id属性值(格式#id)
    2. class选择器
      1. driver.find_element(By.CSS_SELECTOR,value=".btn-primary")

         组合在一起定位

    3. 元素选择器

      1. driver.find_element(By.CSS_SELECTOR,value="div")#标签

      2. driver.find_element(By.CSS_SELECTOR,value="随机邮箱")#界面元素

    4. 属性选择

      1. driver.find_element(By.CSS_SELECTOR,value="[id='applyMail']")

    5. 层级选择器
        1. >与空格两个方式的区别:

          1. >:表示必须为子元素;空格:则不用(可以是孙子辈,或者重孙辈.....)

        备注:虽然现在浏览器可以复制路径进行定位,但不建议使用,毕竟层级接口一旦改变定位就失效了(性能低)

 定位一组元素:elements

driver.find_elements(By.CSS_SELECTOR,value="div button")[1].click()#定位一组元素使用elements
#定位申请邮箱按钮

代码解释:

        find_element(By.ID,value="")(find:查找,element:元素,By:通过,ID:id属性)

        以前的写法find_element_by_id已经不可用了,这样写会报错

属性定位方法原来的定位方法find_element_by_属性(这个函数已经弃用,不再维护)新的定位方法find_element(By.属性)(封装find_element)
idfind_element_by_id("")find_element(By.ID,value="")
class_namefind_element_by_class_name("")find_element(By.CLASS_NAME,value="")
namefind_element_by_name("")find_element(By.NAME,value="")
tag_namefind_element_by_tag_name("")find_element(By.TAG_NAME,value="")
link_textfind_element_by_link_text("")find_element(By.LINK_TEXT,value="")
partial_link_textfind_element_by_partial_link_text("")find_element(By.PARTIAL_LINK_TEXT,value="")
xpathfind_element_by_xpath("")find_element(By.XPATH,value="")
css_selectorfind_element_by_css_selector("")

find_element(By.CSS_SELECTOR,value="")

(使用find_element()需要导包)from selenium.webdriver.common.by import By
原来的find_element_by_属性方法底层也是用的find_element()进行的组装

PS:一般情况下id属性值是唯一的,name可以重名,class_name可以有多个

快捷键导包:

 

 

常用方法:

  1. 元素输入方法:浏览器对象.send_keys("内容")
  2. 关闭浏览器方法:浏览器对象.quit()
  3. 打开浏览器url:浏览器对象.get(url)
  4. 获取浏览器驱动对象方法:浏览器对象=webdriver.chrome()
  5. 导包:from selenium import webdriver

标签解释:

        标签:如果标签的类型type=text,那这个元素就是文本框,如果type=submit或者botton的时候,那这个元素就是一个按钮

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值