Python Selenium基本用法

Python Selenium基本用法

Selenium 作为一款 Web 自动化测试框架,提供了诸多操作浏览器的方法,本节对其中的常用方法做详细介绍。

定位节点

Selenium 提供了 8 种定位单个节点的方法,如下所示:

定位节点方法

方法说明
find_element_by_id()通过 id 属性值定位
find_element_by_name()通过 name 属性值定位
find_element_by_class_name()通过 class 属性值定位
find_element_by_tag_name()通过 tag 标签名定位
find_element_by_link_text()通过标签内文本定位,即精准定位。
find_element_by_partial_link_text()通过标签内部分文本定位,即模糊定位。
find_element_by_xpath()通过 xpath 表达式定位
find_element_by_css_selector()通过 css 选择器定位

假设下面代码某个页面的代码片段,如下所示:

<html>
<head>
<body link="#cc0916">
  <a id="logo" href="http://c.ccc.net" onclick="">
   <form id="form" class="fm" name="f" action="c.ccc.net">
    <span class="btn"></span>
    <input id="kw" class="s_ipt_wr" name="wd" value="" maxlength="255" autocomplete="off">
</body>
</head>
</html>

下面使用表格中提供的方法定位 input 输出框。如下所示:

#创建browewr是浏览器对象
browser = webdriver.Chrome()
#访问某个url得到上述代码片段
browser.get('url')
#通过id定义输入框
brower.dr.find_element_by_id("kw")
#通过class定义
brower.find_element_by_class_name("s_ipt_wr")
#通过name定位
brower.find_element_by_name("wd")
#通过tag name定位:
brower.find_element_by_tag_name("input")
#通过xpath定位
brower.find_element_by_xpath("//*[@id='kw']")
#通过css选择器定位
brower.find_element_by_css_selector("#kw")
通过 a 标签内的文本内容定位节点,如下所示:
<a class="vip" href="http://c.ccc.net">C语言</a>
<a class="search" href="http://www.baidu.com">hao123</a>

示例如下:

#使用全部文本内容定位链接
brower.find_element_by_link_text("c语言")
#使用部分文本内容定位链接
brower.find_element_by_partial_link_text("123")

如果您想定位一组元素,方法如下所示:

find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()

定位一组元素的方法与定位单个元素类似,唯一的区别就是 element 后面多了一个 s(表示复数),因此上述方法的返回值是一个列表,您可以使用 for 循环拿到所有的元素节点。

控制浏览器

Selenium 可以操控浏览器的窗口大小、刷新页面,以及控制浏览器的前进、后退等

1) 设置浏览器窗口大小、位置

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#参数数字为像素点
driver.set_window_size(480, 800)
#设置窗口位置
driver.set_window_position(100,200)
#同时设置窗口的大小和坐标
driver.set_window_rect(450,300,32,50)
#退出浏览器
driver.quit()

2) 控制网页前进、后退、刷新页面

from selenium import webdriver
driver = webdriver.Chrome()
# 访问C语言中文网首页
first_url= 'http://c.biancheng.net'
driver.get(first_url)
# 访问c语言教程
second_url='http://c.biancheng.net/c/'
driver.get(second_url)
# 返回(后退)到c语言中文网首页
driver.back()
# 前进到C语言教程页
driver.forward()
# 刷新当前页面相当于F5
driver.refresh() 
# 退出/关闭浏览器
driver.quit()

WebDriver常用方法

上文中介绍了如何定位元素,以及如何设置浏览的大小、位置。 定位元素节点只是第一步, 定位之后还需要对这个元素进行操作, 比如单击按钮,或者在输入框输入文本 , 下面介绍 WebDriver 中的最常用方法:

# 请求url
get(url)
# 模拟键盘输入文本
send_keys (value)
# 清除已经输入的文本
clear()# 单击已经定位的元素
click()# 用于提交表单,比如百度搜索框内输入关键字之后的“回车” 操作
submit()#返回属性的属性值,返回元素的属性值,可以是id、name、type 或其他任意属性
get_attribute(name)
# 返回布尔值,检查元素是否用户可见,比如 display属性为hidden或者none
is_displayed() 

示例如下:

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#模拟键盘,输出文本
driver.find_element_by_id("kw").send_keys("C语言中文网")
#单击“百度”一下查找
driver.find_element_by_id("su").click()
time.sleep(3)
#退出浏览器
driver.quit()

除了上述方法外, WebDriver 还有一些常用属性,如下所示:

from selenium import webdriver
driver = webdriver.Chrome()
# 获取HTML结构源码
driver.page_source
#在源码中查找指定的字符串
driver.page_source.find('字符串')
# 返回百度页面底部备案信息
text = driver.find_element_by_id("cp").text
print(text)
# 获取输入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)

输出结果:

©2015 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173{'width': 500, 'height': 22}

Selenium事件处理

Selenium WebDriver 提供了一些事件处理函数(鼠标、键盘等),下面我们对常用的事件函数做简单介绍。

1) 鼠标事件

Selenium WebDriver 将关于鼠标的操作方法都封装在 ActionChains 类中,使用时需要引入 ActionChains 类,如下所示:

from selenium.webdriver.common.action_chains import ActionChains

该类包含了鼠标操作的常用方法:

鼠标事件

方法说明
ActionChains(driver)构造 ActionChains 鼠标对象。
click()单击
click_and_hold(on_element=None)单击鼠标左键,不松开
context_click()右击
double_click()双击
drag_and_drop()拖动
move_to_element(above)执行鼠标悬停操作
context_click()用于模拟鼠标右键操作, 在调用时需要指定元素定位。
perform()将所有鼠标操作提交执行。

示例如下:

from selenium import webdriver
#导入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://c.biancheng.net")
# 通过xpath表达式定位到要悬停的元素
above = driver.find_element_by_xpath('//ul[@id="ad-link-top"]/li[1]')
# 对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()

2) 键盘事件

Selenium WebDriver 的 Keys 模块提供了模拟键盘输入的 send_keys() 方法,除此之外,该模块也提供了操作键盘的其他方法,比如复制、粘贴等等。

在使用之前,首先需要导入 Keys 类,如下所示:

from selenium.webdriver.common.keys import Keys

下面列举了一些常用方法:

键盘操作

方法说明
send_keys(Keys.BACK_SPACE)删除键(BackSpace)
send_keys(Keys.SPACE)空格键(Space)
send_keys(Keys.TAB)制表键(Tab)
send_keys(Keys.ESCAPE)回退键(Esc)
send_keys(Keys.ENTER)回车键(Enter)
send_keys(Keys.CONTROL,‘a’)全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’)复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’)剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’)粘贴(Ctrl+V)
send_keys(Keys.F1…Fn)键盘 F1…Fn
keys.down(value,element=None)按下键盘上的某个键
keys.up(value,element=None)松开键盘上的某个键

示例如下:

from selenium import webdriver
# 引入 Keys 模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 输入框输入内容
driver.find_element_by_id("kw").send_keys("C语言中文网H")
# 删除多输入的一个H
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#单击“百度”一下查找
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()

其它键盘操作方法,如下所示:

# 输入空格键 + “Python教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("Python教程")
# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
# ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
# 使用回车键来代替单击操作click
driver.find_element_by_id("su").send_keys(Keys.ENTER)

无界面浏览器

Chromedriver 每一次运行都要打开浏览器,并执行相应的输入、搜索等操作,这样会导致浏览器交互能力变差,浪费许多时间。 Selenium 为了增强浏览器的交互能力,允许您使用无头浏览器模式,也就是无界面浏览器,它被广泛的应用于爬虫和自动化测试中。通过以下代码可以设置无头浏览器模式:

from selenium import webdriver
import time
options=webdriver.ChromeOptions()
options.add_argument('--headless')#无界面浏览
driver=webdriver.Chrome(options=options)
driver.get('https://www.baidu.com')
kw1=driver.find_element_by_id('kw')
print(driver.title)
time.sleep(3)
#关闭当前界面,只有一个窗口
driver.close()
#关闭所有界面
driver.quit()

除了可以设置无头界面之外,Selenium 还支持其他一些浏览器参数设置,如下所示:

opption.add_argument('--window-size=600,600') #设置窗口大小
opption.add_argument('--incognito') #无痕模式
opption.add_argument('--disable-infobars') #去掉chrome正受到自动测试软件的控制的提示
opption.add_argument('user-agent="XXXX"') #添加请求头
opption.add_argument("--proxy-server=http://200.130.123.43:3456")#代理服务器访问
opption.add_experimental_option('excludeSwitches', ['enable-automation'])#开发者模式
opption.add_argument('blink-settings=imagesEnabled=false')  #禁止加载图片
opption.add_argument('lang=zh_CN.UTF-8') #设置默认编码为utf-8
opption.add_extension(create_proxyauth_extension(
           proxy_host='host',
           proxy_port='port',
           proxy_username="username",
           proxy_password="password"
       ))# 设置有账号密码的代理
opption.add_argument('--disable-gpu')  # 这个参数可以规避谷歌的部分bug
opption.add_argument('--disable-javascript')  # 禁用javascript
opption.add_argument('--hide-scrollbars')  # 隐藏滚动条

执行JS脚本

WebDriver 提供了 execute_script() 方法来执行 JavaScript 代码,比如控制浏览器的滚动条。示例如下:

from selenium import webdriver
from time import sleep
# 访问百度
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
# 最大化浏览器窗口
driver.maximize_window()
# 搜索
driver.find_element_by_id("kw").send_keys("C语言中文网")
driver.find_element_by_id("su").click()
sleep(3)
# 通过js代码设置滚动条位置,数值代表(左边距,上边距)
js="window.scrollTo(100,500);"
#执行js代码
driver.execute_script(js)
sleep(5)
driver.quit()

如果想了解更多关于 Selenium 的知识,请参考官方文档:

https://www.selenium.dev/documentation/en/

<think>好的,我需要回答用户关于Python Selenium循环用法的问题。首先,用户希望了解如何在Selenium中使用循环,可能涉及到重复操作,比如遍历元素、处理分页或数据抓取。用户可能是刚开始学习Selenium,需要基础的示例和清晰的步骤。 首先,我应该回忆Selenium基本操作,比如定位元素的方法,如find_element和find_elements,还有常见的循环结构如for循环和while循环。然后,考虑用户可能的场景,比如处理多个相似元素,比如列表项、表格行或分页按钮。 接下来,需要组织回答的结构。先介绍循环在Selenium中的常见用途,然后分点说明不同的循环应用场景,每个场景给出具体的代码示例,并解释代码的作用。这样用户能逐步理解如何应用循环解决实际问题。 要注意用户可能遇到的问题,比如元素未找到、动态加载内容或等待时间的问题,这时候可能需要提到隐式等待或显式等待,但用户问题主要是循环用法,所以可能不需要深入,但可以稍微提及以确保代码的健壮性。 另外,要确保代码示例正确,比如使用正确的语法,比如find_elements_by_css_selector在旧版本中的用法,但现在可能需要用find_elements(By.CSS_SELECTOR, ...),所以需要确认Selenium的最新用法,避免用户复制代码时出错。 还需要检查是否需要导入模块,比如from selenium.webdriver.common.by import By,这样用户不会遗漏必要的导入语句。 然后,考虑分页处理的例子,比如点击“下一页”按钮直到不可用,这里需要用到while循环,并处理可能的异常,比如NoSuchElementException,但为了简化,可以先用find_elements来判断是否存在元素。 最后,可能需要提到循环中的异常处理和等待时间的最佳实践,但保持回答简洁,重点在循环结构本身。 总结回答的结构:先介绍循环的重要性,然后分三个常见用例:遍历元素列表、分页处理、输入多个数据。每个用例给出步骤和代码示例,最后总结注意事项,比如等待和异常处理。确保使用中文,代码部分用Markdown格式,行内公式正确,独立公式单独成段,但在这个问题中可能不需要数学公式,所以主要注意代码块的正确格式。</think>Python Selenium 循环用法主要用于自动化重复性操作,例如批量点击、遍历数据或处理动态加载内容。以下是分步详解及典型场景示例: --- ### 一、遍历元素列表 **场景**:批量获取页面中同类元素(如链接、表格行等) ```python from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://example.com") # 定位所有符合条件的元素(例如class为item的元素) elements = driver.find_elements(By.CLASS_NAME, "item") # 使用for循环逐个操作 for element in elements: print(element.text) # 打印文本 # element.click() # 点击操作 ``` --- ### 二、分页处理 **场景**:自动翻页直到最后一页 ```python while True: # 处理当前页数据 items = driver.find_elements(By.CSS_SELECTOR, ".product") for item in items: print(item.text) # 查找下一页按钮 next_buttons = driver.find_elements(By.XPATH, "//a[text()='下一页']") if not next_buttons: # 如果找不到按钮则退出 break next_buttons[0].click() # 点击下一页 driver.implicitly_wait(3) # 等待加载 ``` --- ### 三、表单循环输入 **场景**:向多个输入框依次填写数据 ```python data_list = ["张三", "李四", "王五"] input_fields = driver.find_elements(By.TAG_NAME, "input") for i in range(len(data_list)): input_fields[i].send_keys(data_list[i]) ``` --- ### 四、循环结合显式等待 **关键点**:处理动态加载内容时需添加等待 ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待元素出现后再操作 wait = WebDriverWait(driver, 10) elements = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "dynamic-item"))) for element in elements: element.click() ``` --- ### 五、注意事项 1. **防重复操作**:循环中确保元素状态未改变(如避免重复提交) 2. **异常处理**:用`try-except`捕获`NoSuchElementException` 3. **性能优化**:适当设置等待时间,避免因加载慢导致循环中断 通过合理使用循环,可显著提升 Selenium 自动化脚本的效率和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睿科知识云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值