selenium基础定位元素入门

news2024/11/18 13:42:06

参考文章链接

什么是selenium?

selenium是一个web自动化测试工具

selenium环境部署安装

首先需要安装python环境
1、安装

在cmd 直接输入 :pip install selenium

2、卸载:

在cmd输入:pip uninstall selenium

3、查看:

pip show selenium 或者 pip list



4、安装浏览器驱动
谷歌(国内镜像地址)
其他浏览器的话需要自行下载查看,对应自身浏览器的版本进行选择即可
若没发现对应的64位的驱动,用32位的也可以,不影响使用。

5、浏览器驱动安装
下载好驱动压缩包过后,解压得到 chromedriver.exe 驱动程序把他放进Python解释器根目录下,就ok了

在这里插入图片描述

selenium初体验

"""
web 自动化基本代码
"""
# 1、导包
from time import sleep
from selenium import webdriver

# 2、实例化浏览器对象:类名()
driver = webdriver.Chrome()

# 3、打开网页包含协议头
driver.get('https://www.baidu.com/')

# 4、时间轴观察效果
sleep(5)

# 5、关闭网页
driver.quit()

八大元素定位

浏览器点击f12或者右键点击浏览器的检查,调出开发者工具进行元素选择的调试

定位方式:
1、id
2、name
3、class_name(使用的是class属性进行定位)
4、teg_name (标签名称)
5、link_text(定位超链接 a 标签)
6、partial_link_text(定位超链接 a 标签 包含关系)
7、xpath (路径)
8、css (元素选择器)

id定位法(由于版本迭代,新版的selenium已经不再使用find_element_by_id方法。)

改用方法为:

driver.find_element(By.ID, 'kw').send_keys('苹果15')

在这里插入图片描述
同理其他方式定位则用By.对应的定位方式

name定位方式

说明:通过元素的name属性来定位, name一般名称为重复
提示:元素必须要有name属性

1、name方法:由于元素的 name 属性值可能存在重复, 必须确定其能够代表⽬标元素唯⼀性之后, ⽅可使⽤
2、当页⾯面内有多个元素的特征值是相同的时候, 定位元素的⽅法执⾏时,默认只会获取第⼀个符合要求的特征对应的元素
3、因此, 定位元素时需要尽量保证使⽤的特征值能够代表⽬标元素在当前⻚页⾯内的唯⼀性!否则定不了位,添加在第一个定位的位置
driver.find_element(By.NAME, 'wd').send_keys('苹果15')

class_name 方法

说明:通过元素的class属性来定位,class属性一般为多个值。
提示:元素必须要有class属性

driver.find_element(By.CLASS_NAME, 's_ipt').send_keys('苹果15')

tag_name 方法

说明:通过元素的标签名称来定位,标签名(查看元素时尖括号(<)紧挨着的单词或字母就是标签名) (标签名也就是元素名)

tag_name 方法:由于存在大量标签,并且重复性更高,因此必须确定其能够代表目标元素唯一性之后,方可以使用;如果页面中存在多个相同标签,默认返回第一个标签元素。

注意:一般标签重复性过高,要精确定位,都不会选择tag_name !

link_text

说明:定位超链接标签

注意:
1、只能使用精准匹配(a标签的全部文本内容)
​ 2、该⽅法只针对超链接元素(a 标签),并且需要输入超链接的全部⽂本信息

driver.find_element(By.LINK_TEXT, '新闻').click()

partial_link_text

说明:定位超链接标签
注意:
1. 可以使用精准或模糊匹配,如果使用模糊匹配最好使用能代表唯一的关键词
2. 如果有多个值,默认返回第一个值

他和link_text的区别在于,他可以模糊的匹配,但link_text只能精确匹配

driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()

定位一组元素的方法

​ 通常我们定义元素方法的是 driver.find_element,但是也有driver.find_elements()这种element后面带s,表示执行结果返回的是列表类型,里面的数据是多个元素对象。

其用法与获取单个元素时差不多,但driver.find_elements()返回的则是一个数组列表

# 说明:通过元素的id属性定位,id一般情况下在当前页面中是唯一。
# 提示:元素必须要有id属性。

"""
语法:find_element_by_id(元素value)
1、元素定位:首先调用find_element_by_id(元素value)获得元素定位(过时了)
2、调用send_keys来填写内容
3、通过⽬标元素的 id 属性值定位, 由于 id 值一般是唯一的,因此当元素存在 id 属性值时, 优先使用 id 方法定位元素
"""

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

# 实例化浏览器对象
driver = webdriver.Chrome()

# 打开网址url
driver.get('https://www.baidu.com/')

# 需求
# driver.find_element_by_id('kw').send_keys('苹果15')
# driver.find_element(By.ID, 'kw').send_keys('苹果15')
# driver.find_element(By.NAME, 'wd').send_keys('苹果15')
# driver.find_element(By.CLASS_NAME, 's_ipt').send_keys('苹果15')
# driver.find_element(By.LINK_TEXT, '新闻').click()
# driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()
aLinks = driver.find_elements(By.CLASS_NAME, 'c-color-t')
aLinks[0].click()
aLinks[1].click()
aLinks[2].click()
# 观察效果
sleep(3)

# 关闭网页
driver.quit()

总结:

1、id,name,class,都是依赖于元素这三个对应的属性,如果元素没有这个三个属性,定位方法不能使用;

2、link_text, partial_link_text: 只适合超链接定位

3、tag_name: 只能找页面唯一元素,或者 页面中多个相同元素中的第一个元素

xpath (重点掌握,这个是常用的方式)

说明:Xpath策略有多种,无论使用哪一种策略(方法),定位的方法都是同一个,不同策略只决定方法的参数的写法

什么是xpath定位

基于元素的路径定位

Xpath常用的定位策略:
绝对路径:从最外层元素到指定元素之间所有经过元素层级的路径 ,绝对路径是以/html根节点开始,使用 / 来分割元素层级
语法:/html/body/div/fieldset/form/p[1]/input (可能会有多个p标签,所以也是用索引的方式定位,是从一开始以便读者看懂)
绝对路径对页⾯结构要求比较严格,不建议使⽤!!!!

相对路径:匹配任意层级的元素,不限制元素的位置 ,相对路径是以 // 开始, // 跟元素名称,不知元素名称可以使用*代替。
语法://input 或者 //*
推荐使用相对路径!!

在这里插入图片描述

利用元素属性策略

1、路径结合属性

该方法可以使用目标元素的任意一个属性和属性值(需要保证唯⼀性)

# 语法1://标签名[@属性名='属性值']
# 语法2://*[@属性名='属性值']

注意:
1、使用 XPath 策略, 需要在浏览器⼯具中根据策略语法, 组装策略值,验证后再放入代码中使用
2、⽬标元素的有些属性和属性值, 可能存在多个相同特征的元素, 需要注意唯一性


2、路径结合逻辑(多个属性)

解决的是单个属性和属性值无法定位元素唯一性的问题。

# 语法: //*[@属性1="属性值1" and @属性2="属性值2"]

注意:多个属性可有由 多个 and 链接,每一个属性前面都要有 @ 开头,可以根据需求使用更多属性值

3、层级和属性结合策略

目标元素⽆法直接定位, 可以考虑先定位其父层级或祖辈层级, 再获取目标元素

# 语法://*[@id='父级id属性值']/input    (⽗层级定位策略/目标元素定位策略)
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By


# 实例化浏览器对象
driver = webdriver.Chrome()
# 打开网址url
driver.get('https://www.baidu.com/')
# 需求
# 1、相对路径
# ele = driver.find_element(By.XPATH, '//*[@id="kw"]')
# ele.send_keys('苹果15')


# # 2、绝对路径//这个验证会报错找不到元素
# driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input').send_keys('苹果15')
#
# # 3、路径结合属性  语法1://标签名[@属性名='属性值']
# driver.find_element(By.XPATH, "//input[@id='kw']").send_keys('苹果15')
# # 语法2: //*[@属性名='属性值']
# driver.find_element(By.XPATH, "//*[@id='kw']").send_keys('苹果15')
#
# # 4、路径结合逻辑(多个属性)
# driver.find_element(By.XPATH, "//*[@id='kw' and @name ='wd']").send_keys('苹果15')
#
# 5、层级和属性结合策略//这个验证会报错找不到元素
driver.find_element(By.XPATH, "//*[@id='s_kw_wrap']/input").send_keys('苹果15')

# 观察效果
sleep(3)

# 关闭网页
driver.quit()

xpath 扩展

1. //*[text()='文本信息'] # 定位文本值等于XXX的元素  
	提示:一般适合 p标签,a标签 
2. //*[contains(@属性,'属性值的部分内容')] # 定位属性包含xxx的元素 【重点】
	提示:contains为关键字,不可更改。 
3. //*[starts-with(@属性,'属性值的开头部分')] # 定位属性以xxx开头的元素
	提示:starts-with为关键字不可更改

driver.find_element(By.XPATH, "//*[text()='新闻']").click()
driver.find_element(By.XPATH, "//*[contains(@autocomplete,'f')]").send_keys('苹果15')
driver.find_element(By.XPATH, "//*[starts-with(@autocomplete,'o')]").send_keys('苹果15')

css定位 (重点掌握)

通过 css 的选择器语法定位元素

1、Selenium框架官方推荐使用 css ,因为定位效率高于xpath

2、 CSS一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须先找到元素,在css标记语言中找元素使用css选择器;

3、css的选择策略也有很多,但是无论选择哪一种选择策略都是用的同一种定位方法
	
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By


# 实例化浏览器对象
driver = webdriver.Chrome()
# 打开网址url
driver.get('https://www.baidu.com/')
# 需求
# 方法:
# driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('苹果15')
# driver.find_element(By.CSS_SELECTOR, '[class="s_ipt"]').send_keys('苹果15')

# 语法属性选择器
# driver.find_element(By.CSS_SELECTOR, 'input[id="kw"]').send_keys('苹果15')
# driver.find_element(By.CSS_SELECTOR, '[name="wd"]').send_keys('苹果15')



# 观察效果
sleep(3)

# 关闭网页
driver.quit()

css的扩展方法 (重点掌握)

1. [属性^='开头的字母'] # 获取指定属性以指定字母开头的元素
2. [属性$='结束的字母'] # 获取指定属性以指定字母结束的元素
3. [属性*='包含的字母'] # 获取指定属性包含指定字母的元素
# 语法1:[属性^='开头的字母'] # 获取指定属性以指定字母开头的元素
driver.find_element(By.CSS_SELECTOR, "[class^='s_i']").send_keys('苹果15')

# 语法2:[属性$='结束的字母'] # 获取指定属性以指定字母结束的元素
driver.find_element(By.CSS_SELECTOR, "[class$='pt']").send_keys('苹果15')

# 语法3:[属性*='包含的字母'] # 获取指定属性包含指定字母的元素
driver.find_element(By.CSS_SELECTOR, "[autocomplete*='f']").send_keys('苹果15')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直播产品行业解决方案|商业化变现模型

摘要 在过去几年的直播行业创业风口期中&#xff0c;直播的用户关注度疯狂增长&#xff0c;但用户质量却参差不齐。随着用户新鲜感一过&#xff0c;流失率变得相当严重&#xff0c;各大平台都在竭尽全力防御。然而&#xff0c;留住“凑热闹”的非直播受众用户并不是最关键的问…

python高级-线程和进程相关

这里前面的linux基础就不补充了&#xff0c;只写一些比较高级的 目录 一、文件查找 1.按照名字查找 2.通配符 3.文件大小查找 二、压缩和打包 1.zip 2.gzip 3.tar命令 三、权限管理 四、多进程 1.创建进程 2.获取进程id 3.进程传参 4.进程不共享全局变量 5.守护…

系统重构实施,百亿级核心交易如何保证准确性?

重构&#xff1a;又喜欢又害怕 一个企业级的应用&#xff0c;即使是诸葛亮级别的设计人员&#xff0c;最初的考虑都不可能尽善尽美&#xff0c;会存在设计不够或者设计过头的情况。加上业务的发展可能与当初的推想不一致&#xff0c;这样就使得上线初期稳稳当当的一个系统&…

【MySQL】数据库中这么多数据类型你真的了解吗?一文看懂不同数据类型有何区别

【MySQL】数据类型 一、常见数据类型二、数值类型2.1 整型2.1.1 小结 2.2 bit类型2.3 float 类型2.4 decimal类型---精度更高 三、字符串类型3.1 char---固定字符串3.2 varchar---变长字符串3.2.1 char和varchar区别 3.3 日期和时间类型3.4 enum和set3.4.1 set查询----find_in_…

入门编程其实也简单

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f; 编程是指使用计算机语言编写计算机程序的过程。计算机程序是一系列指令的集合&#xff0c;这些指令告诉计算机要执行的操作。编程的目的是创建计算机…

2023-6-13-第四式建造者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

Openharmony使用hdc提效

告别串口卡顿调试&#x1f438;hdc增效大法&#x1f438;&#xff0c;工作环境主要是Linux&#xff0c;所以主要是介绍Linux环境下使用喔~ 文章目录 HDC1.1 简单介绍1.2 搭建环境1.2.1 设备机1.2.2 pc机1.2.3 操作 AuthorDateVersionDescription陈梓归2023-06-13V1.0第一个版本…

详解模板模式

目录 1.概述 2.实际业务场景示例 2.1.需求和实现思路 2.1.完整代码实现 1.概述 模板模式是一种常用的设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;将某些步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤…

【ubuntu】vscode上jupter notebook的使用

1.安装vscode 2.安装python环境和插件 系统要有Python环境&#xff1a;conda install python 或者 pip都可以 在vsode里安装如下插件 3.安装jupter conda install jupyter notebook 安装完之后试着打开 输入jupyter note 打开才行&#xff0c;如果安装失败&#xff0c;就…

【IoT】降低硬件创业风险的 6 个小建议

目录 第一个是聘用多名独立的工程师 第二个是从小批量开始做 第三个是使用电子模块 第四个是充分利用制造商资源 第五个是在构建产品之前先建立客户群体 第六个是预售你的产品 无论你提前做了多么充分的准备。 将全新的硬件产品推向市场就一定会引入风险。 这里的全新是…

AntDB 企业增强特性介绍——读写分离

面对日益增加的系统访问量&#xff0c;读写分离可以充分利用备机资源&#xff0c;有效地提升数据库的吞吐量。过去常用的手段是通过应用层来控制数据库的读写流量。 AntDB 通过在 Coordinator 组件的 SQL 解析路由层增加对读写流量的精确访问控制且对应用透明&#xff0c;做到…

CMU-Multimodal SDK Version 1.2.0(mmsdk)Windows配置与使用+pytorch代码demo

最近做实验要用到CMU-MOSI数据集&#xff0c;网上搜到的教程很少&#xff0c;经过一天时间的探索&#xff0c;最终成功安装配置数据集&#xff0c;这篇文章完整地整理一下该数据集的下载与使用方法。 配置环境&#xff1a; window10&#xff0c;anaconda 1. 需要下载的内容 …

DVWA-15.Open HTTP Redirect

OWASP将其定义为&#xff1a; 当 Web 应用程序接受不受信任的输入时&#xff0c;可能会导致 Web 应用程序将请求重定向到不受信任输入中包含的 URL&#xff0c;则可能会出现未经验证的重定向和转发。通过修改恶意站点的不受信任的 URL 输入&#xff0c;攻击者可以成功发起网络钓…

NeRF 模型评价指标PSNR,MS-SSIM, LPIPS 详解和python实现

PSNR&#xff1a; PSNR&#xff08;Peak Signal-to-Noise Ratio&#xff0c;峰值信噪比&#xff09;是一种常用于衡量图像或视频质量的指标。它用于比较原始图像与经过处理或压缩后的图像之间的差异。PSNR通过计算原始图像与重建图像之间的均方误差&#xff08;Mean Squared E…

python爬各平台评论并数据分析——数据采集、评论情绪分析、新闻热度

一、爬取数据 小问题汇总 1.python之matplotlib使用系统字体 用于解决python绘图中&#xff0c;中文字体显示问题 2.cookie与视频页面id&#xff08;b站、微博等&#xff09;查看 F12打开网页开发者模式&#xff0c;然后F5刷新&#xff0c;进入控制台中的网络&#xff0c;…

618什么值得囤?这些刚需数码好物必囤!

​目前&#xff0c;618活动已经正式拉开帷幕了&#xff0c;相信很多小伙伴已经按耐不住想要入手了&#xff01;但如果目前还没什么头绪&#xff0c;不知道买什么的话&#xff0c;现在就不妨来抄一下作业吧&#xff01;近期我整理了一份618数码好物清单&#xff0c;都是精心挑选…

插件化工程R文件瘦身技术方案 | 京东云技术团队

随着业务的发展及版本迭代&#xff0c;客户端工程中不断增加新的业务逻辑、引入新的资源&#xff0c;随之而来的问题就是安装包体积变大&#xff0c;前期各个业务模块通过无用资源删减、大图压缩或转上云、AB实验业务逻辑下线或其他手段在降低包体积上取得了一定的成果。 在瘦…

Window域控环境之账号误删恢复

文章目录 背景信息问题分析操作步骤 文章内容已做脱敏处理 背景信息 8&#xff1a;30&#xff0c;收到联络反馈客户误删除部门领导域控账户&#xff0c;希望紧急实施VM整机恢复工作。收到联络时&#xff0c;我是觉得这个事情挺严重的。毕竟现在域控账号是企业里面重要的身份与…

深度学习数据处理中,标量、向量、张量的区别与联系

计算机中的标量机是指只是一个数一个数地进行计算的加工处理方法&#xff0c;区别于向量机能够对一批数据同时进行加工处理。标量机比向量机的运算速度慢&#xff0c;因此&#xff0c;向量机更适合于演算数据量多的大型科学、工程计算问题。 计算机可以进行数值计算&#xff0c…

5.2.11 IP分组的转发(二)IP分组转发算法

5.2.11 IP分组的转发&#xff08;二&#xff09;IP分组转发算法 我们前面已经了解了路由器的结构以及直接交付和间接交付的概念&#xff0c;明白了路由器会根据路由协议生成路由表再根据路由表生成转发表&#xff0c;当路由器收到一个待转发的IP分组以后&#xff0c;会根据分组…