UI自动化-元素定位方法

1、id定位: find_element_by_id()

从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框

# 打开百度首页
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过id定位搜索框,并输入selenium
driver.find_element_by_id('kw').send_keys('selenium')

2、name定位: find_element_by_name()
从上面定位到的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框

# 通过name定位搜索框,并输入selenium
driver.find_element_by_name('wd').send_keys('selenium')

3、class定位:find_element_by_class_name()

从上面定位到的搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框

# 通过name定位搜索框,并输入selenium
driver.find_element_by_class_name('s_ipt').send_keys('selenium')

4、tag定位:find_element_by_tag_name()

如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。基本上在我们工作中用不到这种定义方法,仅了解就行

# 通过tag定位搜索框,并输入selenium, 此处必报错
driver.find_element_by_tag_name('input').send_keys('selenium')

5、link定位:find_element_by_link_text()

此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接

# 通过link定位"新闻"这个链接并点击
driver.find_element_by_link_text('新闻').click()

6、partial_link定位:find_element_by_partial_link_text()

有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。

我们用这种方法来定位百度首页的“新闻”超链接

# 通过partial_link定位"新闻"这个链接并点击
driver.find_element_by_partial_link_text('闻').click()

7、xpath定位:find_element_by_xpath()

前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。

但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。

 

 

 

 

 

 


driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')

 

//*input[@name="key"]

#元素定位-联合多个属性共同定位,逻辑表达式 -And查找

//*[@id="searchKey" and @name="key"]

#逻辑表达式 -Or查找

//book[@category=”web” or @cover=”paperback”]

#逻辑表达式 -非查找控件

//book[@category!=”web”]

#逻辑表达式 -Not查找

//year[not(.=2005)]    意思是:查找year内容不为2005的内容 注:“.”就等于text()
//book[not(@category=”children”)]

 

#元素定位-XPATH属性+标签+索引
//form/span[1]/inputsubstring(@class,3)='ipt']
模糊匹配 
//form/span[1]/input[contains(@class,'ipt')]
//input[startwith]

精确匹配 
//input[@value="查一下"]

查找book对象

//book #所有的数

//book[1] #第一本书

//book[last()] 倒数第一本:

//表示从目录任意位置查找,/表示按照目录顺序查找

倒数第二本://book[last()-1]

这里写图片描述

针对同一个元素下面多个相同的子标签和元素,如何定位多胞兄弟
//第一个元素 标签:first-chlid 如:a:first-chlid
//第二个或者n个元素 标签:nth-chlid(n) 如:a:nth-child(n)
//最后元素 标签:last-of-type

8、CSS定位
被测试的html代码:

 #使用绝对路径,根据层级定位,层级定位通过>或者空格隔开

CSS定位表达式:html>body>div>input[type='button']

webElement searchBox=driver.findElement(By.cssSelector("html>body>div>input[type='button']"))

#根据其他属性定位,则[属性值],如:
webElement searchBox=driver.findElement(By.cssSelector("input[type='button']"))
webElement searchBox=driver.findElement(By.cssSelector("input[value='查询']"))

根据id定位 使用#id属性值 如:"input#kw"
webElement searchBox=driver.findElement(By.cssSelector("input#div1input"))

定位获取多个元素:
elist=driver.find_element_by_css_selector("input#kw")

#根据class定位,使用.class属性值,如:"input.s_ipt"
webElement searchBox=driver.findElement(By.cssSelector("input.spread"))

使用页面其他属性值定位:

被测试网页中,查找div标签中第一张图片

        CSS定位表达式:img[alt='div1-img1'][href='http://www.sogou.com']

        定位语句:

  webElement searchBox=driver.findElement(By.cssSelector("img[alt='div1-img1'][href='http://www.sogou.com']"))

使用页面元素属性值的一部分关键字定位

CSS定位表达式:a[href^='http://www.so'];表示匹配链接地址开头含有关键字的链接

a[href$='fou.com'];表示匹配链接地址结尾含有关键字的链接

a[href*='so'];表示匹配链接地址包含有关键字的链接

webElement searchBox=driver.findElement(By.cssSelector("a[href^='http://www.so']"))

webElement searchBox=driver.findElement(By.cssSelector("a[href$='fou.com']"))

webElement searchBox=driver.findElement(By.cssSelector("a[href*='so']"))

使用页面元素进行子页面元素的查询

CSS定位表达式:div#div1 > input#div1input
webElement searchBox=driver.findElement(By.cssSelector("div#div1 > input#div1input"))

使用伪类定位元素
被测试网页中,查找第一个div下的指定子页面元素

div#div1:first-child ;查找id为div1的div页面元素下第一个元素。

div#div1:nth-child(2) ;查找id为div1的div页面元素下的第二个元素。

div#div1:last-child ;查找id为div1的div页面元素下的最后一个元素。
webElement searchBox=driver.findElement(By.cssSelector("div#div1:first-child"))
webElement searchBox=driver.findElement(By.cssSelector("div#div1:nth-child(2)"))
webElement searchBox=driver.findElement(By.cssSelector("div#div1:last-child"))
查找同级兄弟页面元素
#表示ID属性值为div1的div页面元素下,查找input页面元素后面的同级链接元素
CSS定位表达式:div#div1 > input +a ;

#表示ID属性值为div1的div页面元素下,查找input页面元素和链接元素后面的同级图片元素
CSS定位表达式: div#div1 > input+a+img;
#表示ID属性值为div1的div页面元素下,查找input页面元素和某种类型页面元素后面的同级图片元素,*表示任意类型的页面元素。
 CSS定位表达式:div#div1 > input + * +img  ;

posted @   xiaowangzi3668  阅读(3188)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示