[selenium]元素定位

打印 上一主题 下一主题

主题 830|帖子 830|积分 2490

前言

selenium提供八种元素定位的方法:

  • find_element_by_id(): 通过id定位。一个页面中的id是唯一的。有id的话尽量使用id定位。
  • find_element_by_xpath(): 通过xpath语法定位(常用)
  • find_element_by_link_text(): 通过链接文本定位
  • find_element_by_partial_link_text(): 通过部分链接文本定位
  • find_element_by_name(): 通过标签名称定位
  • find_element_by_tag_name(): 通过标签名称定位
  • find_element_class_name(): 通过class name定位
  • find_element_by_css_selector(): 通过css选择器(常用)
当前selenium版本(v4.1.5)更推荐使用find_element(by=By.xx, value="")的方式
通过ID定位元素

按照W3C的规范,元素的ID在页面上是唯一的,因此元素如有ID,通过ID去定位一般是最方便的,也是最快的。
但是,浏览器允许元素没有ID或者ID不唯一,所以还需要综合利用其它方法去定位元素。

  • 示例
  1. from selenium.webdriver.common.by import By
  2. # 点击id为123456的元素
  3. driver.find_element(by=By.ID, value="123456").click()
复制代码
通过name属性定位元素

元素的name属性是常用的一种定位锚点,但是需要注意,页面上name属性的值不一定是唯一的。
假设元素的网页源代码为:
  1. [/code]定位方式:
  2. [code]from selenium.webdriver.common.by import By
  3. # 定位name属性为next的元素,然后输入123456
  4. driver.find_element(by=By.NAME, value="next").send_keys("123456")
复制代码
通过XPATH定位元素

xpath是xml页面中定位元素的一种方法,在html中也适用。通过xpath可以定位到绝大部分元素。xpath语法需要花大概十几分钟时间简单学习下。W3C School - xpath在线文档
假设元素的网页源代码为:
  1. [/code]定位方式:
  2. [code]from selenium.webdriver.common.by import By
  3. # 通过相对路径定位属性namee为next、属性type为submit的input元素
  4. # 然后输入123456
  5. driver.find_element(by=By.XPATH, value="//input[@name='next' and @type='submit']").send_keys("123456")
复制代码
xpath基本概念


  • 父子节点
  • 绝对路径和相对路径
  • xpath方法:

    • contains()
    • text()
    • starts-with()

示例
  1. from selenium.webdriver.common.by import By
  2. # 根据页面文字定位元素
  3. driver.find_element(by=By.XPATH, value="//span[contains(text(), '资金业务系统')]").click()
复制代码
通过css选择器定位元素

css选择器和xpath都可以定位复杂的页面元素,但是css选择器不依赖DOM。当页面集成了很多的CSS元素,CSS选择器的性能比xpath要更好。
  1. # 基本语法
  2. driver.find_element(by=By.CSS_SELECTOR, value='')
  3. # 定位标签为p,id为press的元素
  4. # <p id="press"></p>
  5. value='p#press'
  6. ## 或者
  7. value="p[id='press']"
  8. ## 或者
  9. value="p#id='press'"
  10. # 定位标签为p,标签文本包含press的元素
  11. # <p>press</p>
  12. value="p:contains('press')"
  13. # 定位多属性的元素
  14. # <p class ="container" id="apress" ></p>
  15. value="[class='container'][id='apress'][style='align-self:center']"
  16. # 定位子元素
  17. #
  18. #     <a target="_blank" href="https://www.cnblogs.com/#aston_martin">Aston</a>
  19. #
  20. value="div#cars a"
  21. # 多子元素中定位
  22. # <ul id="cars">
  23. #     <li>Aston Martin</li>
  24. #     <li>BMW</li>
  25. #     <li>Chevy</li>
  26. #     <li>Dodge</li>
  27. # </ul>
  28. # 定位第二个li
  29. value="ul#cars li:nth-of-type(2)"
  30. # 定位最后一个li
  31. value="ul#cars li:last-child"
复制代码
通过锚标签定位元素

假设网页源代码为:
  1. <a target="_blank" href="https://www.cnblogs.com/python.html">Python</a>
复制代码
定位方法:
  1. driver.find_element(by=By.LINK_TEXT, value="Python").click()
复制代码
通过部分锚标签定位元素
  1. driver.find_element(by=By.PARTIAL_LINK_TEXT, value="Pyt").click()
复制代码
通过tag定位元素

假设需要定位网页标题
  1. elem1 = driver.find_element(by=By.TAG_NAME, value="Title")
复制代码
通过class名定位元素

假设元素的网页源代码为:
  1. <p >Python with Selenium</p>
复制代码
定位方式:
  1. elem = driver.find_element(by=By.CLASS_NAME, value="text-justify")
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表