![](https://i-blog.csdnimg.cn/blog_migrate/691b92787f487c0bff2b615c04069627.jpeg)
寻思着已经“金三银四”了,赶紧跟在大厂当面试官的朋友聊聊今年行业趋势,问问对入行软测是如何看的,哪知道刚问就先引来了朋友的一顿牢骚。
他跟我说:
“最近看了很多简历,很多候选人年限不小,但是做的都是一些非常传统的项目,想着也不能通过简历就直接否定一个人,何况现在大环境越来 越难,大家找工作也不容易,于是就打算见一见。”
“在沟通中发现,由于年限不小,他们的定位基本都是高级及以上,毕竟,年限摆在那里,面个中级也不体面。”
“面试时我打算聊点基础的,先打开一下话题,结果没想到我一问,不提测试工具,仅仅基础的技术很多也知之不详。5年的工作经验仅仅是功能测试堆起来的,毫无深度,对于APP自动化等等一问三不知,都停留接口测试的基础方法层面上,自动化进阶问题更是一问一个死,前沿技术最新动态也毫无关注。”
我问他:
“你问了啥啊,是你不想招,就故意出难题吧?”
他急忙解释道:
“什么出难题,我就问个Selenium 八大定位法,就支支吾吾说不清了!”
我没在继续问了,心想,这不至于吧?
定位法
selenium中有八种元素定位,分别是:id,name,class_name,tag_name,link_text、partial_link_text、xpath、css
简单的定位可以用id、name、class_name、tag_name等,如果遇到复杂的元素需要定位则要使用xpath、或者css定位
为了防止真的有同学不清楚这8种定位法,下面是每种定位的用法:
“
ID定位
HTML Tag 的 id 属性值是唯一的,故不存在根据 id 定位多个元素的情况。下面以在百度首页搜索框输入文本“python”为例。搜索框的 id 属性值为“kw”,如图1.1所示:
![](https://i-blog.csdnimg.cn/blog_migrate/66b0da54731445fc43f7293bb85dea04.png)
代码如下,“find_element_by_id”方法已废弃,
使用find_element(By.ID, 'kw')
from selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Firefox()# 需要将浏览器驱动添加到环境变量中# 打开百度driver.get('https://www.baidu.com/')# 通过id,在搜索输入框中输入文本“python”driver.find_element(By.ID, 'kw').send_keys('python')# 点击搜索driver.find_element(By.ID, 'su').click()# 关闭浏览器driver.close()
“
name 定位
以上百度搜索框也可以用 name 来实现,如图 1.1 所示,其 name 属性值为“wd”,方法“find_element(By.NAME, 'wd')”表示通过 name 来定位
代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# 通过name,在搜索输入框中输入文本“自动化测试”driver.find_element(By.NAME, 'wd').send_keys('自动化测试')# 点击搜索driver.find_element(By.ID, 'su').click()# 关闭浏览器driver.close()
注意:用 name 方式定位需要保证 name 值唯一,否则定位失败。
“
class 定位
以百度首页搜索框为例,如图 1.1所示,其 class 属性值为“s_ipt”,“By.CLASS_NAME, 's_ipt'”表示通过 class_name 来定位
代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# 通过class,在搜索输入框中输入文本“web测试”driver.find_element(By.CLASS_NAME, 's_ipt').send_keys('web测试')# 点击搜索driver.find_element(By.ID, 'su').click()# 关闭浏览器driver.close()
“
link_text 定位
link_text 是以超链接全部名字作为关键字来定位元素的。以百度首页“新闻”超链接为例,如图 1.2 所示,关键字为“新闻”。
![](https://i-blog.csdnimg.cn/blog_migrate/c0ecd39a9efd32c25eedec0b8e61ddc5.png)
代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# 通过link_text定位,点击‘新闻’超链接driver.find_element(By.LINK_TEXT, '新闻').click()# 关闭浏览器driver.close()
注意:用此方法定位元素超链接,中文字需要写全。
“
partial_link_text 定位
即用超链接文字的部分文本来定位元素,类似数据库的模糊查询。以“新闻”超链接为例,只需“新”一个字即可,即取超链接全部文本的一个子集。
代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# 通过partial_link_text定位,用超链接文字的部分文本来定位元素,类似数据库的模糊查询driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()# 关闭浏览器driver.close()
“
tag_name 定位
tag_name 定位即通过标签名称定位,如图 1.6所示,定位标签“form”并打印标签属性值“name”。
![](https://i-blog.csdnimg.cn/blog_migrate/81a8d3e25c4be5ab22e43dcf0101f6de.png)
代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# tag_name 定位即通过标签名称定位print(driver.find_element(By.TAG_NAME, 'form').get_attribute('name'))
成功后控制台输出“f”:
![](https://i-blog.csdnimg.cn/blog_migrate/41cda583cab2237a1a0bedea08fc449a.png)
“
CSS 定位
CSS 定位的优点是速度快、语法简洁。表 1.1 中的内容出自 W3School 的 CSS 参考手册。CSS 定位的选择器有十几种,在本节中主要介绍几种比较常用的选择器。
![](https://i-blog.csdnimg.cn/blog_migrate/96f1babf706686413afbeb8c89037b42.png)
仍以百度搜索框为例,代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# 以class选择器为例,实现CSS定位,在搜索框输入“python3”driver.find_element(By.CSS_SELECTOR, '.s_ipt').send_keys('python3')# 以id定位语法结构为:#加 id 名,实现CSS定位,在搜索框输入“python3”driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('python3')# CSS 定位主要利用属性 class 和 id 进行元素定位。也可以利用常规的标签名称来定位,如输入框标签“input”,在标签内部又设置了属性值为“name=’wd’”driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('python3')# CSS 定位方式可以使用元素在页面布局中的绝对路径来实现元素定位。百度首页搜索输入框元素的绝对路# 径为“html>body>div>div>div>div>div>form>span>input[name="wd"]”driver.find_element(By.CSS_SELECTOR, 'html>body>div>div>div>div>div>form>span>input[name="wd"]').send_keys('python3')# CSS 定位也可以使用元素在页面布局中的相对路径来实现元素定位。相对路径的写法和直接利用标签名称来定位,两者# 的代码实现的功能是一致的driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('python3')# 点击搜索driver.find_element(By.ID, 'su').click()# 关闭浏览器driver.close()
“
XPath 定位
通过 XPath 来定位元素的方式,对比较难以定位的元素来说很有效,几乎都可以解决,特别是对于有些元素没有 id、name 等属性的情况。
XPath 是 XML Path 语言的缩写,是一种用来确定 XML 文档中某部分位置的语言。它在 XML 文档中通过元素名和属性进行搜索,主要用途是在 XML 文档中寻找节点。XPath定位比 CSS 定位有更大的灵活性。XPath 可以向前搜索也可以向后搜索,而 CSS 定位只能向前搜索,但是 XPath 定位的速度比 CSS 慢一些。
XPath 语言包含根节点、元素、属性、文本、处理指令、命名空间等。以下文本为 XML实例文档,用于演示 XML 的各种节点类型,便于理解 XPath。
<?xml version = "1.0" encoding = "utf-8" ?><!-- 这是一个注释节点 --><animalListtype="mammal"><animalcategoruy = "forest"><name>Tiger</name><size>big</size><action>run</action></animal></animalList>
其中为文档节点,也是根节点;为元素节点;type=“mammal”为属性节点。
节点之间的关系:
• 父节点。每个元素都有一个父节点,如上面的 XML 示例中,animal 元素是 name、size,以及 action 元素的父节点。
• 子节点。与父节点相反,这里不再赘述。
• 兄弟节点,有些也叫同胞节点。它表示拥有相同父节点的节点。如上代码所示,name、size 和 action 元素都是同胞节点。
• 先辈节点。它是指某节点的父节点,或者父节点的父节点,以此类推。如上代码所示,name 元素节点的先辈节点有 animal 和 animalList。
• 后代节点。它表示某节点的子节点、子节点的子节点,以此类推。如上代码所示,animalList 元素节点的后代节点有 animal、name 等。
仍以百度搜索框为例,代码如下:
driver = webdriver.Firefox()# 打开百度driver.get('https://www.baidu.com/')# XPath 有多种定位策略,最简单直观的就是写出元素的绝对路径。driver.find_element(By.XPATH, '/html/body/div/div/div/div/div/form/span/input').send_keys('python3')# XPath还可以使用元素的属性值来定位。//input 表示当前页面某个 input 标签,[@id='kw'] 表示这个元素的 id 值是 kw。driver.find_element(By.XPATH, "//input[@id='kw']").send_keys('python3')# 如果一个元素本身没有可以唯一标识这个元素的属性值,我们可以查找其上一级元素。# form[@class='fm has-soutu']通过 class 定位到父元素,后面的/span/input 表示父元素下面的子元素。driver.find_element(By.XPATH, "//form[@class='fm has-soutu']/span/input").send_keys('python3')# 如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来查找元素driver.find_element(By.XPATH, "//input[@id='kw' and @class='s_ipt']").send_keys('python3')# 点击搜索driver.find_element(By.ID, 'su').click()# 关闭浏览器driver.close()
后话
每一种定位方式都有其特殊的用法,只要掌握其特殊性即可。需要在项目中多用多想、总结经验,时间久了会对这些定位方式有更深的理解。
如果文章对你有帮助,记得点赞,收藏,加关注。会不定期分享一些干货哦......
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
![](https://i-blog.csdnimg.cn/blog_migrate/8e78e66c119b82ca38fa68e09c2d24fc.png)
这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入下方我们的测试交流群大家一起讨论交流学习。【点击下方小卡片进群免费领取~】