彻底学会Selenium元素定位

转载请注明出处?
作者:测试蔡坨坨
原文链接:caituotuo.top/63099961.html
你好,我是测试蔡坨坨 。
最近收到不少初学UI自动化测试的小伙伴私信,对于元素的定位还是有些头疼,总是定位不到元素,以及不知道用哪种定位方式更好 。
其实UI自动化测试的本质就是将手工测试的一系列动作转化成机器自动执行,可以简单概括为五大步骤:定位元素 - 操作元素 - 模拟页面动作 - 断言结果 - 生成报告 。所以很多同学在学习时 , 都是以元素定位作为入门导向 , 好的开始就是成功的一半 。因此 , 本篇将详细介绍Selenium八大元素定位方法,以及在自动化测试框架中如何对元素定位方法进行二次封装,最后会给出一些在定位元素时的经验总结 。
注意:本文出现的代码示例均以 Python3.10 + Selenium4.5.0 为准,由于网上大多数教程都是Selenium3,Selenium4相比于Selenium3会有一些新的语法,如果你还不了解Selenium4,推荐先阅读往期文章「Selenium 4 有哪些不一样?」 。
Selenium八大元素定位所谓八大元素定位方式就是id、name、class_name、tag_name、link_text、partial_link_text、xpath、css_selector 。
在介绍定位方式之前先来说一下定位工具 , 以Chrome浏览器为例,使用F12或右键检查进入开发者工具 。

彻底学会Selenium元素定位

文章插图
ID通过元素的id属性定位,一般情况下id在当前页面中是唯一的 。使用id选择器的前提条件是元素必须要有id属性 。由于id值一般是唯一的,因此当元素存在id属性值时,优先使用id方式定位元素 。
例如:下面的这个input标签的id属性值为kw
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">语法:
driver.find_element(By.ID, "id属性值")举栗:
# author: 测试蔡坨坨# datetime: 2022/10/22 19:08# function: id定位import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.baidu.com")driver.find_element(By.ID, "kw").send_keys("测试蔡坨坨")driver.find_element(By.ID, "su").click()time.sleep(3)driver.quit()NAME通过元素的name属性来定位 。name定位方式使用的前提条件是元素必须有name属性 。由于元素的name属性值可能存在重复 , 所以必须确定其能够代表目标元素唯一性后 , 方可使用 。
当页面内有多个元素的特征值相同时 , 定位元素的方法执行时只会默认获取第一个符合要求的特征对应的元素 。
例如:下面的这个input标签的name属性值为wd
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">语法:
driver.find_element(By.NAME, "name属性值")举栗:
# author: 测试蔡坨坨# datetime: 2022/10/22 19:23# function: name定位import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.baidu.com")driver.find_element(By.NAME, "wd").send_keys("测试蔡坨坨")driver.find_element(By.ID, "su").click()time.sleep(3)driver.quit()CLASS_NAME通过元素的class属性来定位,class属性一般为多个值 。使用class定位方式的前提条件是元素必须要有class属性 。
虽然方法名是class_name,但是我们要找的是class属性 。
例如:下面这个input标签的class属性值为but1
<input class="but1" type="text" name="key" placeholder="请输入你要查找的关键字" value="">语法:
driver.find_element(By.CLASS_NAME, "class属性值")举栗:
# author: 测试蔡坨坨# datetime: 2022/10/22 19:31# function: class定位import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()# 打开电商网站driver.get("http://127.0.0.1")driver.maximize_window()# 搜索框中输入 鞋子driver.find_element(By.CLASS_NAME, "but1").send_keys("鞋子")# 点击搜索driver.find_element(By.CLASS_NAME, "but2").click()注意:如果class name是一个复合类(存在多个属性值,每个属性值以空格隔开),则只能使用其中的任意一个属性值进行定位,但是不建议这么做,因为可能会定位到多个元素 。
例如:下面这个标签的class属性值为bg s_btn btn_h btnhover
<input class="bg s_btn btn_h btnhover" type="text" name="key">则只能使用复合类的任意一个单词去定位:
driver.find_element(By.CLASS_NAME,"bg") # 正确示范driver.find_element(By.CLASS_NAME,"bg s_btn btn_h btnhover") # 错误示范 NoSuchElementException

推荐阅读