WeDriver 对页面元素的定位和操作

本文详细介绍了Selenium WebDriver如何定位和操作网页元素,包括八种定位方法及其实现,如ID、Name、Class Name、Tag Name、Link Text等。同时,深入解析了Xpath和CSS定位的高级技巧,以及对元素的常见操作,如clear(), send_keys(), click()等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WeDriver 对网页元素的定位

web界面的元素

随意打开一个web界面,里面的元素一般会有图片、链接、文本框、按钮、下拉列表和视频等等

查看百度的首页,这张页面上有输入框、按钮和文字链接等,自动化要做的就是模拟鼠标和键盘来操作这些元素,或单击,或输入
在这里插入图片描述
通过前端工具可以查看页面上HTML源码,通过页面源码可以看到页面上的元素都是由一行行的代码组成的,他们之间有层级的组织起来,每个元素有不同的标签名和属性值

webdriver就是通过这些信息找到不同元素的

WebElement 对象

先来一些简单的操作,定位百度页面上的输入框
在这里插入图片描述

通过右键检查元素,可以发现文本框的 id 属性

通过代码驱动浏览器进行操作

# 从selenium中导入webdriver
import time

from selenium import webdriver



# 创建一个浏览器驱动,打开一个浏览器,与浏览器创建会话
# 启动了chromedriver.exe 并建立了连接,创建了会话ID
driver = webdriver.Chrome()


# 用谷歌浏览器打开一个网站
driver.get(url='https://www.baidu.com/')

#在该页面定位百度文本框

# element 是一个 WebElement 对象
element = driver.find_element_by_id('kw')
print(element)
# <selenium.webdriver.remote.webelement.WebElement (session="fa51aba298f1af5375a7f56f46c03195", element="c25df5be-aef2-460e-94a6-65ed3180d959")>

运行这段代码,可以发现浏览器打开了百度的页面,打印出来的 element 是一个 WebElement 对象
在这里插入图片描述
WebElement 是一个类,所以当我们用 element 接收它的时候,也就是通过 element 实例化这个对象的时候,就继承了 WebElement 类的方法和属性。就比如 clear() 方法–清空内容,send_keys()–输入内容 这些方法。

通过找到了输入框,接下来就可以往输入框中输入内容,这时候就可以用上 send_keys 方法,比如想在文本框中输入 selenium

element.send_keys(“selenium”)

对于 WebElement ,要了解这个类,可以通过查看源码的方式,将鼠标移至代码send_keys处,按住Ctrl 单击鼠标左键(或是使用快捷键Ctrl + b
可以看到 send_keys 这个方法的源码
在这里插入图片描述
往上滑,可以看到,这些方法,都是属于 WebElement 类
在这里插入图片描述
我们看源码的时候,可以不用先看代码,直接先看注释

注释的大概意思是:WebElement 代表一个DOM 元素,所以我们使用 webdriver 对 元素进行操作的时候,会默认通过这个类的方法执行

然后我们再去看这个类的代码
在这里插入图片描述
这些方法都是调用的命令(Command)进行执行(_execute)
像 tag_name 和 text 方法,都加上了@property 说明这两个命令可以不用加括号(),就可以获取所操作元素的名称和文本
而 click() 和 submit() 方法的调用则需要加上括号

具体情况可以下面的示例

八种元素定位方法

WebDriver 提供了八种元素定位方法,以下是各种定位方法,及其对应的用 Python 实现的方法

WebDriver 元素定位方式对应的 Python 方法
idfind_element_by_id()
name()find_element_by_name()
class_namefind_element_by_class_name()
tag_namefind_element_by_tag_name()
link_textfind_element_by_link_text()
partial_link_textfind_element_by_partial_link_text()
xpathfind_element_by_xpath()
css_selectorfind_element_by_css_selector()

常见元素定位

理想状态下,在一个页面中每一个元素都有唯一的 id 和 name 等属性值,可以通过它们的属性来找到它们

需求:
打开百度首页
在百度文本框中输入selenium
点击百度一下

find_element_by_id()
#1、导包
from selenium import webdriver
import time
#2、创建google浏览器对象
driver = webdriver.Chrome()
#3、打开被测系统的首页面
driver.get("https://www.baidu.com")

#4、对打开页面中的元素进行操作(识别、对象进行点击、输入、悬浮、键盘快捷键等)
# 在百度文本框中输入selenium
#识别文本框,输入文字 
driver.find_element_by_id('kw').send_keys("selenium")
time.sleep(5)
#点击百度一下
driver.find_element_by_id("su").click()
time.sleep(5)
#5、关闭浏览器对象
driver.quit()
find_element_by_name()
#1、导包
from selenium import webdriver
#2、创建google浏览器对象
driver = webdriver.Chrome()
#3、打开百度首页
driver.get("https://www.baidu.com")
# 4、识别元素,对元素进行操作(通过name属性进行定位)
driver.find_element_by_name("wd").send_keys("selenium")
driver.find_element_by_id('su').click()

#5、关闭浏览器对象
driver.quit()
find_element_by_class_name()
#1、导包
from selenium import webdriver
#2、创建google浏览器对象
driver = webdriver.Chrome()
#3、打开百度首页
driver.get("https://www.baidu.com")
# 4、识别元素,对元素进行操作(通过class name属性进行定位)
driver.find_element_by_class_name("s_ipt").send_keys("selenium")
driver.find_element_by_id('su').click()
#5、关闭浏览器对象
driver.quit()
find_element_by_tag_name()
#1、导包
from selenium import webdriver
#2、创建google浏览器对象
driver = webdriver.Chrome()
#3、打开百度首页
driver.get("https://www.baidu.com")
# 4、识别元素,对元素进行操作(通过标签名进行定位)
driver.find_element_by_tag_name("input").send_keys("selenium")
driver.find_element_by_id('su').click()

#5、关闭浏览器对象
driver.quit()

需求:
打开百度首页
点击首页上的新闻链接
在新闻页面点击一条新闻链接

find_element_by_link_text()
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#使用Link text进行定位
driver.find_element_by_link_text("新闻").click()
driver.find_element_by_partial_link_text("回信催人奋进").click()
time.sleep(3)
driver.quit()

然而在实际项目中,有时候一个元素并没有id、name属性,或者页面上多个元素的id和name属性值相同,又或者每一次刷新页面,id值都会随机变化。
这个时候,就需要才用呢更加灵活的定位策略,通过不同的方式定位到想要的元素。

Xpath定位

需求:定位百度页面的百度文本框

绝对路径方式定位
#导包
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")

#在该页面定位百度文本框
driver.find_element_by_xpath('/html/body/div/div[1]/div/div/div/form/span[1]/input').send_keys("selenium")
driver.find_element_by_xpath('/html/body/div/div[1]/div/div/div/form/span[2]/input').click()
#driver.find_element_by_id("su").click()
time.sleep(3)
#退出浏览器
driver.quit()
属性方式定位
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")

#在该页面定位百度文本框
# driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
# driver.find_element_by_xpath("//input[@id='su']").click()

#如果是从浏览器复制出来的xpath,需要将其双引号该为单引号(避免相同引号进行嵌套)
driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
driver.find_element_by_xpath('//*[@id="su"]').click()
#driver.find_element_by_id("su").click()
time.sleep(3)
#退出浏览器
driver.quit()
层级与属性方式定位
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")

#在该页面定位百度文本框(通过属性方式先定位他爷爷,在通过层级关系定位相应的元素)
driver.find_element_by_xpath("//form[@id='form']/span/input").send_keys("selenium")
driver.find_element_by_xpath("//input[@id='su']").click()

#driver.find_element_by_id("su").click()
time.sleep(3)
#退出浏览器
driver.quit()
模糊匹配属性内容方式定位
#导包
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")

#在该页面定位百度文本框(模糊匹配定位)
# 查找所有的id中包含kw的输入框
driver.find_element_by_xpath("//input[contains(@id,'kw')]").send_keys("selenium")
# 查找所有的id中以su开头的输入框
driver.find_element_by_xpath("//input[starts-with(@id,'su')]").click()

time.sleep(3)
#退出浏览器
driver.quit()
逻辑运算符进行组元素属性定位
#导包
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")

#在该页面定位百度文本框(多个元素属性定位)
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").send_keys("selenium")
driver.find_element_by_xpath("//input[@id='su']").click()

time.sleep(3)
#退出浏览器
driver.quit()

css定位

css可以较为灵活的选择空间的任意属性,一般情况定位速度要比Xpath快。
css选择器的常见语法如下:

选择器例子描述
.class.introclass选择器,选择class=“intro”的所有元素
#id#firstnameid选择器,选择id=“firstname”的所有元素
**选择所有元素
slementp所有<p>元素
element>elementdiv>input选择父元素为<dib>的所有<input>元素
element+elementdiv+input选择同一级中紧接在<div>元素之后的所有<input>元素
[attribute=value][target=_blank]选择target=“_blank”的所有元素

通过CSS selector定位百度页面的百度文本框\百度一下按钮

#导包
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")

#在该页面定位百度文本框(类样式定位)
# driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
# driver.find_element_by_css_selector(".s_btn").click()
#id属性定位
# driver.find_element_by_css_selector("#kw").send_keys("selenium")
# driver.find_element_by_css_selector("#su").click()

#通过父子关系定位
driver.find_element_by_css_selector("#form>span>input").send_keys("selenium")
driver.find_element_by_css_selector(".s_btn").click()

time.sleep(3)
#退出浏览器
driver.quit()

Xpath和css定位功能对比

定位方式Xpathcss
By id//divdiv
By class//div[@id=‘eleid’]div#eleid
By 属性//div[@title=‘Move mouse here’]div[title=Move] div[title^=Move] div[title$=here] div[title*=mouse]
定位子元素//div[@id=‘eleid’] /*//div/h1div#eleid>*div>h1

Xpath和css都提供了非常强大而灵活的定位方法,相比较而言css语法更简洁,但理解和使用的难度更大一些

WeDriver对网页元素的操作

定位只是第一步,定位之后需要对这个元素进行操作,或单击(按键)或输入(输入框)

WeDriver对网页元素的进行操作的几个常用方法:

  1. clear():清除文本
  2. send_keys(value):模拟按键输入
  3. click():单击元素。例如安静操作
  4. Current_url:返回当前页面的url地址
  5. title:返回当前页面的title
  6. Text:获取页面显示的文本
  7. get_attribute(name):获取属性值,文本框中的值使用value属性名
  8. is_displayed():设置该元素是否用户可见
#导包
from selenium import webdriver
import time

#创建浏览器对象
driver = webdriver.Chrome()

#获得被测系统的某一个页面(指定URL)
driver.get("https://www.baidu.com")
time.sleep(2)
#driver.current_url获取浏览当前页面的url地址?获取了干嘛用?
#可以作为自动化测试用例中的实际结果来用
url = driver.current_url
title = driver.title
print(url)
print(title)

data = driver.find_element_by_xpath('//*[@id="setf"]').text
print(data)

#获取页面底部的信息:把百度设为主页关于百度About  Baidu百度推广
textt = driver.find_element_by_xpath("//*[@id='lh']").text
print("页面底部信息为:%s"%textt)

#通过get_attribute(id)获取某一个元素的id属性值
ff = driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").get_attribute('id')
print(ff)
#在该页面定位百度文本框(多个元素属性定位)
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").send_keys("selenium")


ffff = driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").get_attribute('value')
print(ffff)
#clear()方法清除元素中的数据
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").clear()


#通过is_dispalyed()来判断某个元素是否已经在页面中正常显示了
flag = driver.find_element_by_xpath("//input[@id='su']").is_displayed()
print(flag)

driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").send_keys("jmeter")
driver.find_element_by_xpath("//input[@id='su']").click()

time.sleep(3)
#退出浏览器
driver.quit()

练习

打开百度页面
获取当前页面的url,并打印出来(driver.current_url)
获取当前页面的title,并打印出来(driver.title)
百度“selenium”,点击百度一下
判断页面中的“百度一下”按钮是否正常显示,是则打印“正常显示按钮”
获取文本框中的文本,并打印出来
清除百度文本框中内容
获取页面底部的信息:把百度设为主页关于百度About Baidu百度推广
关闭浏览器

from  selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

#获取当前页面的url,并打印出来(driver.current_url)
url = driver.current_url
print(url)
#获取当前页面的title,并打印出来(driver.title)
title = driver.title
print(title)


# 获取页面底部的信息:把百度设为主页关于百度About  Baidu百度推广
ddd = driver.find_element_by_xpath('//*[@id="lh"]').text
print(ddd)

#百度“selenium”,点击百度一下
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id('su').click()

#判断页面中的“百度一下”按钮是否正常显示,是则打印“正常显示按钮”
if driver.find_element_by_id('su').is_displayed():
    print("正常显示按钮")
else:
    print("没有显示出来")
#获取文本框中的文本,并打印出来
data = driver.find_element_by_id('kw').get_attribute("value")
print(data)
#清除百度文本框中内容
driver.find_element_by_id('kw').clear()

#关闭浏览器
driver.quit()
<think>好的,我现在需要处理用户关于如何打开使用WeDrive文件的问题。首先,用户可能指的是WeDriver,因为在引用中提到了WeDriver,这可能是一个拼写错误。用户提到的引用内容涉及使用Selenium的WebDriver来操作浏览器,例如打开浏览器驱动、控制窗口大小等。因此,我需要确认用户真正想了解的是否是关于Selenium WebDriver的使用方法,而不是某种名为“WeDrive”的文件格式,因为根据提供的引用,似乎没有提到WeDrive文件,而是WebDriver工具。 接下来,我需要根据用户的问题提供的引用信息,整理出使用WebDriver的基本步骤。引用中提到了使用`webdriver.Chrome()`来打开浏览器驱动,以及`driver.get()`来访问网址。因此,我应该分步骤说明如何安装WebDriver、初始化驱动、打开网页,以及一些基本操作如窗口控制、元素交互等。 另外,用户的问题可能包含误解,将WebDriver误写为WeDrive或WeDriver,需要明确纠正这一点,确保回答准确。同时,按照用户的要求,生成相关问题,可能需要包括安装问题、常见错误处理、高级功能等。 还需要注意回答结构清晰,逐步引导用户完成操作,并确保LaTeX格式的正确应用,尽管在这个问题中可能数学公式较少,但如果有代码块或命令行内容,需要正确使用代码块标记。同时,引用标识要自然地添加在相关段落末尾,例如在提到打开浏览器驱动的部分添加[^1]。 最后,检查所有内容是否符合系统级指令,包括使用正确的中文表达,避免术语错误,并确保引用的正确性。可能还需要补充一些常见问题的解决方法,比如驱动不匹配的情况,或者元素定位的问题,以增强回答的实用性。</think>关于如何打开使用 **WebDriver**(可能误写为“WeDrive”)的方法教程如下: --- ### **WebDriver 的基本使用步骤** 1. **安装浏览器驱动** 确保已安装对应浏览器的驱动(如ChromeDriver),并将其路径添加到系统环境变量中。 ```python # 示例:安装ChromeDriver pip install webdriver-manager ``` 2. **初始化浏览器驱动** 使用代码打开浏览器驱动并控制窗口大小: ```python from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.set_window_size(1024, 768) # 设置浏览器窗口大小 ``` 3. **打开目标网页** 使用`get()`方法加载指定网址: ```python driver.get("https://example.com") ``` 4. **操作页面元素** 通过选择器定位元素并执行操作(如点击、输入文本): ```python search_box = driver.find_element("name", "q") search_box.send_keys("WebDriver教程") search_box.submit() ``` 5. **关闭浏览器** 结束操作后关闭驱动: ```python driver.quit() ``` --- ### **常见问题解答** 1. **驱动路径错误** 若报错`WebDriverException`,需检查驱动版本是否与浏览器匹配,或使用`webdriver-manager`自动管理驱动版本[^1]。 2. **元素无法定位** 确保页面加载完成后再操作元素,可添加等待时间: ```python from selenium.webdriver.support.ui import WebDriverWait WebDriverWait(driver, 10).until(lambda d: d.find_element("id", "element_id")) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值