1.通过css_selector定位,By.CSS_SELECTOR
CSS常用汇总
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
# 1.使用id属性定位,id前面要加#号
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys("selenium")
# 2.通过class属性定位,class前面要加.
driver = webdriver.Chrome()
driver.get('https://www.bilibili.com')
driver.find_element(By.CSS_SELECTOR, '.nav-search-input').send_keys('selenium')
# 3.根据name属性定位,属性值为[name="wd"]
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.CSS_SELECTOR, '[name="wd"]').send_keys("selenium")
# 4.根据标签属性定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.CSS_SELECTOR, 'a[href="http://image.baidu.com/"]').click()
# 模糊匹配-包含
driver.find_element(By.CSS_SELECTOR, 'a[href*="image.baidu.com"]').click()
# 模糊匹配-匹配开头
driver.find_element(By.CSS_SELECTOR, 'a[href^="http://image.baidu"]').click()
# 模糊匹配-匹配结尾
driver.find_element(By.CSS_SELECTOR, 'a[href$="image.baidu.com/"]').click()
# 5.组合定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# input+name
driver.find_element(By.CSS_SELECTOR, 'input[name="wd"]').send_keys("selenium")
# input+class
driver.find_element(By.CSS_SELECTOR, 'input.s_ipt').send_keys("selenium")
# 6.定位子元素
# 一般根据最近一个id属性往下找,可以根据class或者标签。
# #s-top-left > a
# :nth-child(3)代表第几个子元素,下标从1开始
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 百度首页新闻,以下3种方式皆可
driver.find_element(By.CSS_SELECTOR, 'div.s-top-left-new.s-isindex-wrap a' ) # 根据class
driver.find_element(By.CSS_SELECTOR, 'div#s-top-left a') # 根据id
driver.find_element(By.CSS_SELECTOR, '#s-top-left a') # 简写
# 百度首页地图,以下2种方式皆可
driver.find_element(By.CSS_SELECTOR, '#s-top-left a:nth-child(3)')
driver.find_elements(By.CSS_SELECTOR, '#s-top-left a')[2]
# a:first-child 第一个标签
driver.find_element(By.CSS_SELECTOR, '#s-top-left a:first-child')
# a:last-child 最后一个标签
driver.find_element(By.CSS_SELECTOR, '#s-top-left a:last-child')
2.通过xpath定位,By.XPATH
xpath是什么?XPath 是一门在 XML 文档中查找信息的语言
XML(可扩展标记语言),主要用于传输数据
为什么可以使用xpath定位html?
XPath(XML路径语言)是一种用于在XML文档中定位元素的语言,它可以用于定位HTML文档中的元素。尽管XML和HTML是两种不同的标记语言,但HTML文档实际上可以视为XML文档的一种特定形式。
HTML文档的结构和标签嵌套遵循XML的基本规则,因此XPath可以有效地用于在HTML文档中定位元素。XPath通过使用元素的标签名、属性、层级关系等来指定元素的位置,从而实现定位。
XPath定位HTML元素的基本原则是,将HTML文档视为XML文档,并使用XPath表达式来描述元素的位置关系。XPath表达式可以使用标签名、属性、父子关系、索引等来选择特定的元素或元素集合。
Xpath可以通过相对路径与绝对路径去定位元素,绝对路径从 HTML 根节点开始算,相对路径从任意节点开始。
一般不推荐绝对路径,因为写起来太麻烦了
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
# 1.使用id属性定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.XPATH, '//input[@id="kw"]').send_keys("软件测试老白")
# 2.使用class属性定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# class中间有空格,需要全部写上
driver.find_element(By.XPATH, '//a[@class="mnav c-font-normal c-color-t"]')
# 3.根据name属性定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.XPATH, '//input[@name="wd"]').send_keys("软件测试老白")
# 4.由子元素定位父元素
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 定位输入框的父元素
driver.find_element(By.XPATH, '//input[@id="kw"]/..')
# 5.多个属性组合定位 支持and or
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element(By.XPATH, '//input[@name="wd" and @class="s_ipt"]').send_keys("软件测试老白")
# 6.多组数据使用下标定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 定位百度首页地图
driver.find_element(By.XPATH, '//div[@id="s-top-left"]/a[3]')
# 7.根据文本内容定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 定位百度首页网盘
driver.find_element(By.XPATH, '//a[contains(text(),"网盘")]')
# 8.其它定位方式,轴定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 最后一个子元素,last()
driver.find_element(By.XPATH, '//a[@class="mnav c-font-normal c-color-t"][last()]')
# 动态ID https://element.eleme.cn/#/zh-CN/component/cascader
driver.find_element(By.XPATH, '//span[text() = "默认 click 触发子菜单"]/following-sibling::div/div/input')
3.元素定位最佳顺序
- ID(唯一标识):如果元素具有唯一的ID属性,优先使用ID进行定位,因为它是最快和最可靠的定位方式。
- CSS选择器:如果元素没有唯一的ID,可以考虑使用CSS选择器进行定位。CSS选择器具有灵活的语法,并且在性能上通常比XPath更高效。
- 类名(class):如果元素没有唯一的ID或合适的CSS选择器,可以使用元素的类名进行定位。尽量选择具有明确含义的类名,并避免选择过于通用的类名。
- Name属性:如果元素具有唯一的name属性,可以使用name属性进行定位。但要注意,name属性并不是所有元素都具有的,所以不是一种通用的定位方式。
- XPath:如果前面的方式都无法定位元素,可以使用XPath进行定位。XPath提供了强大的定位功能,但在性能上相对较低,因为XPath需要遍历整个文档,直到找到匹配的元素。暂无性能对比数据,我觉得好用就用,及时行乐。
- 标签名(TagName):如果元素无法使用上述方式进行定位,可以考虑使用标签名进行定位。但要注意,标签名定位方式通常会返回多个匹配的元素,需要结合其他条件来缩小范围。
4.元素定位建议
- 在定位列表的元素时,尽量根据文本信息定位而不是下标(比如百度首页的左上角,可能顺序会打乱,后台配置)
- 相对定位时,尽量选择不易改变的元素作为锚点,比如拥有id的元素或者一个目录。比如后台管理系统中的主菜单,比如H5页面的tab
- 如果关系好,可以让开发多加一些id,不要勉强。现在的前端开发都用的框架,html,css,js等都是由框架定义的了。