Selenium之Web元素定位

server/2025/1/2 19:13:12/

Web页面主要由HTML、CSS和JavaScript脚本构成,当前大部分页面都是动态页面。Web页面中的各类视觉元素,如文本框、按钮、复选框、图品、超链接和表等,在Selenium中都被称为页面元素(web Elements)。

Selenium提供了八种定位元素。

定位元素

含义

定位元素

含义

find_element_by_id

通过ID定位元素

find_elements_by_id

通过ID定位一组元素

find_element_by_name

通过name定位元素

find_elements_by_name

通过name定位一组元素

find_element_by_class_name

通过class定位元素

find_elements_by_class_name

通过class定位一组元素

find_element_by_xpath

通过xpath定位元素

find_elements_by_xpath

通过xpath定位一组元素

find_element_by_tag_name

通过tag name定位元素

find_elements_by_tag_name

通过tag name定位一组元素

find_element_by_css_selector

通过css选择器定位元素

find_elements_by_css_selector

通过css选择器定位一组元素

find_element_by_link_text

通过元素标签对之间的文本信息定位元素

find_elements_by_link_text

通过元素标签对之间的文本信息定位一组元素

find_element_by_partial_link_text

通过元素标签对之间的部分文本信息来定位元素

find_elements_by_partial_link_text

通过元素标签对之间的部分文本信息来定位一组元素

注:通过ID、name、class属性是最常用来定位元素的方法。

一、ID定位

ID(find_element_by_id)是Selenium中较常见的定位方式,一般情况下ID是唯一的,ID的唯一性也成为需要页面上元素较号的方法。

用百度搜索框来举个例子,搜索框的HTML代码如下:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

python代码如下:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 通过ID定位搜索框元素并赋值【测试】
driver.find_element_by_id("kw").send_keys("测试")
sleep(5)        # 页面停留5秒
driver.quit()    #关闭浏览器

二、name定位

一般情况下name与id一样具有唯一性,同时也是作为使用频率较高的定位元素之一。

百度搜索框HTML代码如下:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

python代码如下:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 通过name来定位搜索框元素并赋值【测试】
driver.find_element_by_name("wd").send_keys("测试")
sleep(5)        # 页面停留5秒
driver.quit()    # 关闭浏览器

三、class定位

大部分前端的央视是通过class来渲染,所以定位元素时还可以通过class来定位。class用来关联CSS中定义的属性。

百度搜索框HTML代码如下:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

python代码如下:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_class_name("s_ipt").send_keys("测试")
sleep(5)
driver.quit()

注:有时某元素的class属性值由通过空格隔开的两个值组成(如【百度一下】按钮元素class=“bg s_btn”),这时通过class定位,只需取其中一个即可(class=“bg s_btn”仅仅使用“s_btn”)。

python代码如下:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 通过class定位搜索框并赋值【测试】
driver.find_element_by_class_name("s_ipt").send_keys("测试")
# 通过class定位【百度一下】按钮并点击
driver.find_element_bt_class_name("s_btn").click()
sleep(5)        # 页面停留5秒
driver.quit()     # 关闭浏览器

四、tag定位

tag name方法是通过对HTML页面中tag name匹配方式来定位元素,类似于JavaScript中的getElementsByTagName()。tag name在某些特定场合下十分好用,比如:通过标签,的tag name可一次性定位到页面中的所有复选框元素。

在这里我们用Bing网站举例子,后面会讲到为啥不用百度来举例,以下是Bing首页输入框的HTML代码

<input id="sb_form_q" class="sb_form_q" name="q" type="search" maxlength="1000" autocomplete="off" aria-labelledby="sb_form_c" autofocus="" aria-controls="sw_as" aria-autocomplete="both" aria-owns="sw_as">

python代码如下:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://cn.bing.com")
driver.find_element_by_tag_name("input").send_keys("bella")
sleep(5)
driver.quit()

注意:通过标签名的定位方式需慎用,能不用尽量不要用,因为一个页面有大量重复的标签名,从而使Selenium找不到正确的元素;举例的Bing首页输入框能够执行且成功输入bella,具有一定的偶然性,换成百度就找不到会报错(如下图)。

这边提供一个例子,小伙伴可以试试。

HTML代码

<html><head><title>复选框测试实例</title></head><body>请选择你喜欢的水果</br><input type="checkbox" name="fruit" value="apple">苹果</br><input type="checkbox" name="fruit" value="orange">橘子</br><input type="checkbox" name="fruit" value="mango">芒果</br></body>
</html>

python代码:

# fruit
from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
# checkbox.html的路径要根据自己真正存放的地址
driver.get("file:///F://checkbox.html")inputs = driver.find_elements_by_tag_name("input")
for i in inputs:# 使用type或name均可,因为三种水果的元素type和name都相同if i.get_attribute("type") == "checkbox":i.click()sleep(3)
driver.quit()

五、link定位

find_element_by_link_text方法使通过文本链接来定位元素。以百度首页中顶部的【新闻】链接为例。

HTML代码:

<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>

单击【新闻】链接的python代码:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_link_text("新闻").click()
sleep(5)
driver.quit()

六、partial_link_text定位

find_element_by_partial_link_text方法使通过文本链接的一部分文本来定位元素。以百度首页中顶部的【新闻】链接为例。

HTML代码:

<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>

单击【新闻】链接的python代码:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_link_text("新").click()
sleep(5)
driver.quit()

七、xpath定位

当发现通过id、name、class无法定位元素时,可以尝试用xpath。建议:为了避免人工输入路径有可能引发的错误,尽量不要手动输入绝对路径,错误率太高了。

1、通过绝对路径定位

二话不说,直接上图:

手工输入太累了,还容易漏掉,直接用开发者工具快速获取xpath的绝对路径。选中搜索框元素,右击该元素的代码区域,选择【Copy|Copy full xpath】,直接把绝对路径复制下来,/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input

python代码:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# 绝对路径定位
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input").send_keys("测试")
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input").click()
sleep(5)
driver.quit()

2、通过元素属性定位

xpath除了使用绝对路径,也可以使用元素的某个属性值来定位。同样直接用开发工具复制就行,选中搜索框元素,右击代码区域,选择【Copy|Copy xpath】,就可以直接得到xpath值(//*[@id=“kw”])

python代码:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")# driver.find_element_by_xpath("//*[@id="kw"]").send_keys("测试")
# xpath定位不仅仅局限于id,也可以通过name或是class来实现
driver.find_element_by_xpath("//input[@name='wd']").send_keys("测试")
driver.find_element_by_xpath("//input[@class='bg s_btn']").click()
sleep(5)
driver.quit()

3、 多属性结合定位

搜索框的HTML代码:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

搜索按钮的HTML代码:

<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

python代码:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")driver.find_element_by_xpath("//input[@id='kw' and @name='wd'] ").send_keys("测试")
driver.find_element_by_xpath("//input[@id='su' and @class='bg s_btn']").click()
sleep(5)
driver.quit()

八、css定位

1、通过ID、name、class来定位

搜索框的HTML代码:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

搜索按钮的HTML代码:

<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

python代码:

from selenium import webdriver
from time import sleepdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")# driver.find_element_by_css_selector("#kw").send_keys("测试")  # 符号“#”代表id匹配
driver.find_element_by_css_selector("[name='wd']").send_keys("测试") # 符号“[]”代表name匹配
driver.find_element_by_css_selector(".s_btn").click()    # 符号“.”代表使用class匹配
sleep(5)
driver.quit()

九、find_element定位

前面介绍了八种定位元素的方法,webdriver还提供了另外一种方法find_element,其通过By来申明定位的方法,传入对应定位方法的定位参数。find_element需要传入两个参数,第一个参数是定位的类型,由By模块提供(使用前需要通过from selenium.webdriver.common.by import By 导入By模块);第二个参数是具体定位的方式。

以百度首页搜索框、按钮、以及顶部【新闻】来举例,HTML代码

#百度搜索框
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
# 百度一下按钮
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

对应的python代码:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import Bydriver = webdriver.Firefox()
driver.get("https://www.baidu.com")# driver.find_element(By.NAME, "wd").send_keys("测试")   # 通过By.NAME
# driver.find_element(By.ID, "su").click()     # 通过By.ID
# driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("测试")     # 通过By.CLASS_NAME
# driver.find_element(By.XPATH, "//*[@id='kw']").send_keys("测试")  # 通过By.XPATH
# driver.find_element(By.CSS_SELECTOR, ".s_btn").click()  # 通过By.CSS_SELECTOR
# driver.find_element(By.LINK_TEXT, "新闻").click()     # 通过By.LINK_TEXT
driver.find_element(By.PARTIAL_LINK_TEXT, "新").click()  # 通过By.PARTIAL_LINK_TEXTsleep(4)
driver.quit()

http://www.ppmy.cn/server/154705.html

相关文章

【基础篇】三、MySQL表结构的操作

文章目录 Ⅰ. 创建表1、语法2、创建表样例3、创建和其它表一样结构的表 Ⅱ. 查看表结构1、查看数据库中的表2、查看指定表的属性3、获取表的创建语句 Ⅲ. 删除表Ⅳ. 修改表结构1、向表中插入新的字段2、删除表中的字段3、修改表名4、修改字段属性 Ⅰ. 创建表 1、语法 create …

慧集通iPaaS低代码平台培训-基础篇

训练使用素材&#xff1a; 1.数据源&#xff1a; 单号业务日期工厂仓库物料单位数量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…

【网站推荐】IP反查域名实战

IP反查域名 ip反查域名的三种方法&#xff0c;方法有很多&#xff0c;我这边只描述三种&#xff0c;也算是两种 1&#xff0c;在线网站 http://stool.chinaz.com/same 2&#xff0c;在线网站 https://site.ip138.com/ 3&#xff0c;工具 https://github.com/Sma11New/ip2domain…

Java 编程探秘之饿汉式单例设计模式:原理、优势与实战应用全解析,开启高效代码世界的大门

目录 一、什么是单例设计模式 &#xff08;一&#xff09;单例的概念 &#xff08;二&#xff09;单例的重要性 二、饿汉式单例模式的庐山真面目 &#xff08;一&#xff09;饿汉式的实现方式 &#xff08;二&#xff09;代码解析 三、饿汉式单例模式的优势 &#xff0…

机器学习之逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告

逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告 目录 逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告1 逻辑回归算法1.1 概念理解1.2 算法导入1.3 算法优缺点 2 LogisticRegression理解2.1查看参数定义2.2 参数理解2.3 方法2.4基本格式 3 数据标准…

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…

【LC】3159. 查询数组中元素的出现位置

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;一个整数数组 queries 和一个整数 x 。 对于每个查询 queries[i] &#xff0c;你需要找到 nums 中第 queries[i] 个 x 的位置&#xff0c;并返回它的下标。如果数组中 x 的出现次数少于 queries[i] &#xff0c;该查…

CGAL windows 安装教程

1.下载源代码 CGAL官网下载 2.下载boost库 BOOST官网下载 3.下载 GMP and MPFR GMP MFPR 4.配置VS2022 头文件&#xff1a; 库路径 做完以上步骤&#xff0c;可以使用CGAL了&#xff01;