Selenium的WebDriver API元素定位中的XPath和CSS
元素的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的。
浏览器的常规操作
import time
from selenium import webdriver
# 打开浏览器
driver = webdriver.Chrome()
# 加载网页
driver.get("https://www.baidu.com")
# 休息3秒
time.sleep(3)
# 设置浏览器最大化
driver.maximize_window()
time.sleep(2)
# 设置浏览器最小化
driver.minimize_window()
time.sleep(2)
# 设置浏览器窗口大小
driver.set_window_size(1200, 700)
time.sleep(2)
# 刷新
driver.refresh()
time.sleep(2)
# 返回
driver.back()
time.sleep(2)
# 前进
driver.forward()
time.sleep(2)
# 截图
driver.save_screenshot('baidu.png')
driver.get_screenshot_as_file('baidu2.png')
# 获取浏览器当前url
# print(driver.current_url)
print(f'浏览器当前URL:{driver.current_url}') # https://www.baidu.com/
# 获取浏览器的标题title
# print(driver.title)
print(f'浏览器的标题:{driver.title}') # 百度一下,你就知道
# 获取页面源码
print(driver.page_source)
# 关闭当前窗口
driver.close()
# 退出driver,关闭所有窗口
driver.quit()
八大元素定位方法
1、id定位
2、name定位
3、class_name定位
4、link_text定位(针对a标签)
5、partial_link_text定位(针对a标签)
6、tag_name标签名定位
7、xpath定位
(1)绝对路径(绝对路径使用"/")
(2)相对路径(相对路径使用"//")
(3)索引定位
1)具体格式://标签名[@属性="属性值"]
2)支持使用and和or关键字,多个属性一起定位元素。
(4)属性定位
(5)部分的属性值
(6)通过文本定位
(7)各种xpath组合
(8)通配符*
8、css选择器定位
(1)绝对路径
(2)相对路径
(3)通过属性定位
(4)通过部分属性值(也称为模糊方法定位)
(5)通过查询子元素
(6)查找兄弟元素
1、id定位
# driver.find_element_by_id("kw").send_keys("测试玉米君")
# 输出获取到的元素的id属性内容
# print(driver.find_element_by_id("kw").get_attribute("id"))
print(f'1、id定位 获取到的元素的id属性内容:{driver.find_element_by_id("kw").get_attribute("id")}') # kw
2、name定位
# driver.find_element_by_name('wd').send_keys("测试玉米君")
# 输出获取到的元素的name属性内容
# print(driver.find_element_by_name("wd").get_attribute("name"))
print(f'2、name定位 获取到的元素的name属性内容:{driver.find_element_by_name("wd").get_attribute("name")}') # wd
3、class_name定位
# driver.find_element_by_class_name("s_ipt").send_keys("测试玉米君")
# 输出获取到的元素的class属性内容
# print(driver.find_element_by_class_name("s_ipt").get_attribute("class"))
print(f'3、class_name定位 获取到的元素的class属性内容:{driver.find_element_by_class_name("s_ipt").get_att
ribute("class")}') # s_ipt
4、link_text定位(针对a标签)
# driver.find_element_by_link_text("新闻").click()
# 输出获取到的元素的文本内容
print(driver.find_element_by_link_text("新闻").text)
print(
f'4、link_text定位 获取到的元素的文本内容:{driver.find_element_by_link_text("新闻").text}') # 新闻
5、partial_link_text定位(针对a标签)
# driver.find_element_by_partial_link_text("闻").click()
# 输出获取到的元素的文本内容
# print(driver.find_element_by_partial_link_text("闻").text)
print(f'5、partial_link_text定位 获取到的元素的文本内容:{driver.find_element_by_partial_link_text("闻").text}') # 新闻
6、tag_name标签名定位
# 输出获取到的元素的action属性内容
# print(driver.find_element_by_tag_name("form").get_attribute("action"))
print(
f'6、tag_name标签名定位 获取到的元素的action属性内容:{driver.find_element_by_tag_name("form").get_attribute("action")}') # https://www.baidu.com/s
7、xpath定位
(7.1)绝对路径(绝对路径使用"/")
# 举例:定位搜索框输入搜索内容"测试玉米君"
# driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input").send_keys("测试玉米君")
print(
f'7.1、xpath绝对路径定位 获取到的元素的id属性内容:{driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input").get_attribute("id")}') # kw
(7.2)相对路径(相对路径使用"//")
# 举例:定位搜索框输入搜索内容"测试玉米君"
# driver.find_element_by_xpath("//form/span/input").send_keys("测试玉米君")
# 输出获取到的元素的id属性内容
print(f'7.2、xpath相对路径定位 获取到的元素的id属性内容:{driver.find_element_by_xpath("//form/span/input").get_attribute("id")}') # kw
(7.3)索引定位(索引从"1"开始,默认不填写就是"1")
# 举例:定位 百度一下 按钮
# driver.find_element_by_xpath("//form/span[2]/input").click()
# 输出获取到的元素的value属性内容
print(
f'7.3.1、xpath索引定位 取到的元素的value属性内容:{driver.find_element_by_xpath("//form/span[2]/input").get_attribute("value")}') # 百度一下
# 举例:定位百度hao123链接
# driver.find_element_by_xpath("//div[3]/a[2]").click()
# 输出标签文本内容
print(f'7.3.2、xpath索引定位 取到的元素的文本内容:{driver.find_element_by_xpath("//div[3]/a[2]").text}') # hao123
# 举例:定位百度hao123链接
# driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]").click()
# 输出标签文本内容
print(
'7.3.3、xpath索引定位 取到的元素的文本内容:{}'.format(driver.find_element_by_xpath('//div[@id="s-top-left"]/a[2]').text)) # hao123
(7.4)属性定位 使用"@"符号呼叫属性
# driver.find_element_by_xpath("//input[@autocomplete='off']").send_keys("测试玉米君")
print('7.4.1、xpath属性定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_xpath("//input[@autocomplete='off']").get_attribute("id"))) # kw
# driver.find_element_by_xpath("//input[@autocomplete='off' and @name='wd']").send_keys("测试玉米君")
print('7.4.2、xpath属性定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_xpath("//input[@autocomplete='off' and @name='wd']").get_attribute("id"))) # kw
(7.5)部分的属性值(也称为模糊方法定位)
# 元素属性值开头包含内容:starts-with()
# driver.find_element_by_xpath("//input[starts-with(@autocomplete,'of')]").send_keys("测试玉米君")
print('7.5.1、xpath部分的属性值定位 取到的元素的autocomplete属性内容:{}'.format(
driver.find_element_by_xpath("//input[starts-with(@autocomplete,'of')]").get_attribute("autocomplete"))) # off
# 元素属性值结尾包含内容:substring()
# driver.find_element_by_xpath("//input[substring(@class,3)='ipt']").send_keys("测试玉米君")
print('7.5.2、xpath部分的属性值定位 取到的元素的class属性内容:{}'.format(
driver.find_element_by_xpath("//input[substring(@class,3)='ipt']").get_attribute("class"))) # s_ipt
# 元素属性值包含内容:contains()
# driver.find_element_by_xpath("//input[contains(@class,'pt')]").send_keys("测试玉米君")
print('7.5.3、xpath部分的属性值定位 取到的元素的class属性内容:{}'.format(
driver.find_element_by_xpath("//input[contains(@class,'pt')]").get_attribute("class"))) # s_ipt
(7.6)通过文本定位
# 元素文本在xpath中可以通过text()函数获取,也可以用其来进行元素定位。
# driver.find_element_by_xpath("//a[text()='新闻']").click()
print('7.6.1、xpath文本定位 取到的元素的文本内容:{}'.format(driver.find_element_by_xpath("//a[text()='新闻']").text)) # 新闻
# driver.find_element_by_xpath("//span[text()='按图片搜索']").get_attribute("style")
print('7.6.2、xpath文本定位 取到的元素的style属性内容:{}'.format(
driver.find_element_by_xpath("//span[text()='按图片搜索']").get_attribute("style"))) # display: none
(7.7)各种xpath组合
# driver.find_element_by_xpath("//a[contains(text(),'新闻')]").click()
print('7.7.1、各种xpath组合 取到的元素的文本内容:{}'.format(driver.find_element_by_xpath("//a[contains(text(),'新闻')]").text)) # 新闻
# driver.find_element_by_xpath("//a[contains(text(),'新')]").click()
print('7.7.2、各种xpath组合 取到的元素的文本内容:{}'.format(driver.find_element_by_xpath("//a[contains(text(),'新')]").text)) # 新闻
# driver.find_element_by_xpath("//form[@id='form']/span[1]/input").send_keys("测试玉米君")
print('7.7.3、各种xpath组合 取到的元素的id属性内容:{}'.format(
driver.find_element_by_xpath("//form[@id='form']/span[1]/input").get_attribute("id"))) # kw
(7.8)通配符*
# driver.find_element_by_xpath("//*[@*='kw']").send_keys("测试玉米君")
print('7.8、xpath通配符*定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_xpath("//*[@*='kw']").get_attribute("id"))) # kw
8、css选择器定位(html,javascript,css,h5+css3),通过.找class,通过#找id
(8.1)绝对路径
# driver.find_element_by_css_selector("html body div div div div div form span input").send_keys("测试玉米君")
print('8.1.1、css绝对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("html body div div div div div form span input").get_attribute("id"))) # kw
# driver.find_element_by_css_selector("html>body>div>div>div>div>div>form>span>input").send_keys("测试玉米君")
print('8.1.2、css绝对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("html>body>div>div>div>div>div>form>span>input").get_attribute("id"))) # kw
# driver.find_element_by_css_selector("html body div.wrapper_new div#head div.head_wrapper.s-isindex-wrap.nologin div div form span input").send_keys("测试玉米君")
print('8.1.3、css绝对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector(
"html body div.wrapper_new div#head div.head_wrapper.s-isindex-wrap.nologin div div form span input").get_attribute(
"id"))) # kw
(8.2)相对路径(通过class(.)和id(#)定位)可以和标签名组合使用
# driver.find_element_by_css_selector("#kw").send_keys("测试玉米君")
print('8.2.1、css相对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("#kw").get_attribute("id"))) # kw
# driver.find_element_by_css_selector(".s_ipt").send_keys("测试玉米君")
print('8.2.2、css相对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector(".s_ipt").get_attribute("id"))) # kw
# driver.find_element_by_css_selector("input#kw").send_keys("测试玉米君")
print('8.2.3、css相对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("input#kw").get_attribute("id"))) # kw
# driver.find_element_by_css_selector("input.s_ipt").send_keys("测试玉米君")
print('8.2.4、css相对路径定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("input.s_ipt").get_attribute("id"))) # kw
(8.3)通过元素属性定位
# 具体格式:标签名[属性="属性值"] 支持使用多个属性一起定位元素
# driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("测试玉米君")
print('8.3.1、css元素属性定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("input[autocomplete='off']").get_attribute("id"))) # kw
# driver.find_element_by_css_selector("input[autocomplete='off'][name='wd']").send_keys("测试玉米君")
print('8.3.2、css元素属性定位 取到的元素的id属性内容:{}'.format(
driver.find_element_by_css_selector("input[autocomplete='off'][name='wd']").get_attribute("id"))) # kw
(8.4)通过部分元素属性值(也称为模糊方法定位)
元素属性值开头包含内容:^=
元素属性值结尾包含内容:$=
元素属性值当中包含内容:*=
# driver.find_element_by_css_selector("input[autocomplete^='of']").send_keys("测试玉米君")
print('8.4.1、css部分属性值定位 取到的元素的autocomplete属性内容:{}'.format(
driver.find_element_by_css_selector("input[autocomplete^='of']").get_attribute("autocomplete"))) # off
# driver.find_element_by_css_selector("input[autocomplete$='ff']").send_keys("测试玉米君")
print('8.4.2、css部分属性值定位 取到的元素的autocomplete属性内容:{}'.format(
driver.find_element_by_css_selector("input[autocomplete$='ff']").get_attribute("autocomplete"))) # off
# driver.find_element_by_css_selector("input[autocomplete*='of']").send_keys("测试玉米君")
print('8.4.3、css部分属性值定位 取到的元素的autocomplete属性内容:{}'.format(
driver.find_element_by_css_selector("input[autocomplete*='of']").get_attribute("autocomplete"))) # off
(8.5)通过查询子元素(类似xpath中的索引的方法)
1)子元素:A>B
2)后代元素:A B(类似>)
3)第一个后代元素:first-child
4)最后一个后代元素:last-child[等同于 p:nth-last-child(1)]
5)第n个子元素:nth-child(N)[类同:nth-of-type(N)]
6)通过空格和>查找子元素(只能一级一级找)
# driver.find_element_by_css_selector("div#s-top-left a:nth-child(1)").click()
print('8.5.1、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a:nth-child(1)").text)) # 新闻
# driver.find_element_by_css_selector("div#s-top-left a:first-child").click()
print('8.5.2、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a:first-child").text)) # 新闻
# driver.find_element_by_css_selector("div#s-top-left a:last-child").click()
print('8.5.3、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a:last-child").text)) #
# driver.find_element_by_css_selector("div#s-top-left a:nth-last-child(2)").click()
print('8.5.4、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a:nth-last-child(2)").text)) # 学术
# driver.find_element_by_css_selector("div#s-top-left a:nth-child(2)").click()
print('8.5.5、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a:nth-child(2)").text)) # hao123
(8.6)查找兄弟元素
1)同层级下一个元素:+
2)选择同层级多个相同标签的元素:~
备注:
+号可以多次使用
~号一般返回的是多个元素,要用find_elements接收
# driver.find_element_by_css_selector("div#s-top-left a +a").click()
print('8.6.1、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a +a").text)) # hao123
# driver.find_element_by_css_selector("div#u1 a +a +a").click()
print('8.6.2、css子元素定位 取到的元素的文本内容:{}'.format(
driver.find_element_by_css_selector("div#s-top-left a +a +a").text)) # 地图
自动化框架中封装定位
from selenium.webdriver.common.by import By
driver.find_element(By.ID, "kw").send_keys("测试玉米君")
总结
定位元素的方式有8种,写法有两种
id定位
driver.find_element_by_id("kw")
driver.find_element(By.ID, "kw")
name定位
driver.find_element_by_name("wd")
driver.find_element(By.NAME, "wd")
class定位
driver.find_element_by_class_name("s_ipt")
driver.find_element(By.CLASS_NAME, "s_ipt")
tag_name定位
driver.find_element_by_tag_name("form")
driver.find_element(By.TAG_NAME, "form")
link_text定位
driver.find_element_by_link_text("新闻")
driver.find_element(By.LINK_TEXT, "新闻")
partial_link_text定位
driver.find_element_by_partial_link_text("新")
driver.find_element(By.PARTIAL_LINK_TEXT, "新")
XPath定位
driver.find_element_by_xpath("//input[@id='kw']")
driver.find_element(By.XPATH, "//input[@id='kw']")
CSS定位
driver.find_element_by_css_selector("#kw")
driver.find_element(By.CSS_SELECTOR, "#kw")
Selenium的WebDriver API元素定位中的XPath和CSS的更多相关文章
- 【selenium】- webdriver常见元素定位(中)
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1.By.tagName 遇到hidden就break,继续下一个循环. 2.By.linkText 对上图中的“糯米”进行定位: 3.By. ...
- 【selenium】- webdriver常见元素定位(上)
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. 元素的定位 2.By.id 打开Firefox,打开百度首页,右键点击选择“使用Firebug”查看元素. 点击红框内的按钮,将鼠标指针 ...
- 【selenium】- webdriver常见元素定位(下)
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1.table 表格如下: 使用firebug查看: 代码实现: 1)显示出表格所有内容 2)显示表格某个特定的数值 自动化测试框架: 关键字 ...
- [小北De编程手记] : Lesson 03 - Selenium For C# 之 元素定位
无论哪一种自动化测试的驱动框架(基于B/S,桌面应用,还是手机App).都应当具有一套优秀的元素定位技术.通常的自动化测试流程也可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作和验证元 ...
- 关于selenium的8种元素定位
selenium中有八种元素定位,分别是:id,name,class_name,tag_name,link_text.partial_link_text.xpath.css 简单的定位可以用 id.n ...
- 转:python webdriver API 之定位 frame 中的对象
在 web 应用中经常会出现 frame 嵌套的应用,假设页面上有 A.B 两个 frame,其中 B 在 A 内,那么定位 B 中的内容则需要先到 A,然后再到 B.switch_to_frame ...
- PhantomJS + Selenium webdriver 总结-元素定位
webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一 ...
- Java + Selenium + WebDriver八大元素定位方式
UI自动化测试的第一步就是进行元素定位,下面给大家介绍一下Selenium + WebDriver的八大元素定位方式.现在我们就以百度搜索框为例进行元素定位,如下图: 一.By.name() Java ...
- WebDriver API元素的定位
一.以下截图为用FireBug定位的用火狐(Firefox)浏览器打开的百度首页,下面所讲述的八种定位方法,就是以该截图中的百度输入框为例子. ①.FireBug是Firefox浏览器下的开发类插件, ...
随机推荐
- Linux系统zabbix_agentd客户端安装与配置
标注:官网下载zabbix安装包(zabbix安装包里包含了zabbix_agentd客户端安装包,我们只选择zabbix_agentd客户端安装) zbbix官网下载地址: http://www. ...
- SQLyog无操作一段时间后重新操作会卡死问题(解决办法)
这种是因为一段时间不操作后,服务器将空闲连接丢弃了,而客户端(sqlyog)不知道,导致长时间无响应,而超时之后,sqlyog 使用了新的连接,所以又可以顺畅操作了. 将会话空闲时间默认改为自定义,填 ...
- PHP 数据库 ODBC创建 ODBC 连接
PHP 数据库 ODBC ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数 ...
- Redis服务之常用配置(三)
上一篇博客我们聊了下redis的rdb持久化.安全连接.资源限制相关配置;回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我们来 ...
- JsLint undeclared ‘window’
如果使用IDEA 设置一下 globals 或 /*global window */ ... your script goes here https://stackoverflow.com/quest ...
- 【CF115E】Linear Kingdom Races 题解(线段树优化DP)
前言:前辈讲课时设的状态还是有些繁琐,感觉题解设的状态更简洁. -------------- 题目链接 题目大意:给定$n$条道路和$m$场比赛,每个道路修建需要$c_i$,每场比赛需要使用$[l_i ...
- wps 2011 破解版软件
今天换了一台新电脑. wps 都没有 系统的太过忍受不了 整了一天终于是找到了一个合适安装的 想要的邮件发给我 673658917@qq.com
- 微信小程序--家庭记账小账本(四)
今天的进展不太顺利,总的账单表,代码改了又改,最后决定用一个新的表,账单界面中弄了一天删除,发现都无法实现想要的效果,于是把账单界面的删除功能去了,就感觉大功告成的时候,发现收入和支出界面的删除也出现 ...
- QT下UDP套接字通信——QUdpSocket 简单使用
QT下UDP套接字通信--QUdpSocket QUdpSocket类提供一个UDP套接字. UDP(用户数据报协议)是一种轻量级.不可靠.面向数据报.无连接的协议.它可以在可靠性不重要的情况下使用. ...
- 10、Java 数组的定义和使用
1.数组的定义 首先举一个小例自:如果你现在需要定义100个int类型的变量,那么按照前俩节的做法为: int a = 1, b=2 , c=3.......; 可以发现我们的代码特别的冗余,而且不美 ...