Selenium 4 应用示例解析
目录
二、浏览器设置(这之前没有html基础的朋友可以先去了解一下html哦)
以下代码展示了如何使用 Selenium 4 进行淘宝自动化操作,包括登录、搜索商品等常见网页交互功能。
一、基本配置
#webdriver是用于操作浏览器的
from selenium import webdriver
import time
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
driver_path = r"D:\tools\chromedriver.exe"
#创建管理对象
service = Service(executable_path=driver_path)
#创建webdriver
driver = webdriver.Chrome(service=service)
二、浏览器设置
#设置浏览器最大化
driver.maximize_window()
#隐式等待 #打开网页,网页有过打开的较慢,会影响后续操作,为解决该问题,加上隐式等待
driver.implicitly_wait(10)
#打开想要操作的网页
driver.get("https://www.taobao.com")
在这之前没有html基础的朋友可以先去了解一下html哦
三、元素定位方法
1.Selenium 4 元素的选中
①进入网页后,点击f12,进入开发者模式,点击下图中我选中状态的蓝色图标即可使用鼠标选取元素
②鼠标移动到想要选取的元素位置上,右侧代码也会随之定位到相应位置
2.Selenium 4 元素抓取的核心内容
主要定位元素类型
- 基础HTML元素:包括输入框(input)、按钮(button)、链接(a)、下拉框(select)、复选框(checkbox)、单选框(radio)、文本区域(textarea)、表格(table)、图片(img)。
- 复合组件:如模态框(modal)、标签页(tab)、轮播图(carousel)、日期选择器(datepicker)、文件上传控件(file upload)。
3.八大定位方法
在定位之前先要确定元素的唯一性,一般情况下元素唯一才能定位成功,我们在开发者模式中可以使用CTRL+F得到一个输入框,按照格式输入我们的元素,即可检验出我们的元素是否唯一
这里的1of1即表示我们当前这个元素是可以使用的
八大定位方法:
from selenium.webdriver.common.by import By
# ID定位
driver.find_element(By.ID, "element_id")
# 类名定位
driver.find_element(By.CLASS_NAME, "class_name")
# 名称定位
driver.find_element(By.NAME, "name_attribute")
# 标签名定位
driver.find_element(By.TAG_NAME, "tag_name")
# 链接文本定位
driver.find_element(By.LINK_TEXT, "完整链接文本")
# 部分链接文本定位
driver.find_element(By.PARTIAL_LINK_TEXT, "部分链接文本")
# CSS选择器定位
driver.find_element(By.CSS_SELECTOR, "css_selector")
# XPath定位
driver.find_element(By.XPATH, "xpath_expression")
4.元素操作方法
- 基础交互:
click()
,send_keys()
,clear()
,submit()
- 状态获取:
text
,get_attribute()
,is_displayed()
,is_enabled()
,is_selected()
- 高级交互:
from selenium.webdriver.common.keys import Keys
element.send_keys(Keys.RETURN)
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(element).click().perform()
driver.execute_script("arguments[0].scrollIntoView();", element)
等待机制
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 显式等待
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "element_id"))
)
# 隐式等待(慎用)
driver.implicitly_wait(5)
最佳实践
- 定位策略:优先使用ID > CSS选择器 > XPath
- 稳定性增强:
# 相对XPath示例
driver.find_element(By.XPATH, "//div[contains(@class,'panel')]//button")
# CSS属性选择器
driver.find_element(By.CSS_SELECTOR, "input[name^='user']")
- Page Object模式:
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_field = (By.ID, "username")
self.password_field = (By.NAME, "password")
def login(self, username, password):
self.driver.find_element(*self.username_field).send_keys(username)
self.driver.find_element(*self.password_field).send_keys(password)
以下是对淘宝网站的登录以及搜索的自动化实现:
登录(这里由于小编忘记淘宝密码了,则使用验证码登录)
#未登录状态下,所以先点击我的淘宝进行登录
driver.find_element(By.CSS_SELECTOR,'a[href="//i.taobao.com/my_itaobao"]').click()
time.sleep(10)
#点击使用手机验证码方式登录(因为忘记密码了,小编这里用验证码方式)
driver.find_element(By.CSS_SELECTOR,'a[class="sms-login-tab-item"]').click()
#输入11位数字的验证码
driver.find_element(By.CSS_SELECTOR, 'input[name="fm-sms-login-id"]').send_keys("XXXXXXXXXX")
#因为验证码随时变动,这里没有自动填入验证码的操作,而是自动运行到那一阶段,迅速的手动填入验证码
#点击登录
driver.find_element(By.CSS_SELECTOR,'a[class="send-btn-link"]').click()
time.sleep(10)
搜索功能
# 搜索框输入
driver.find_element(By.CSS_SELECTOR, 'input[id="q"]').send_keys("电饭煲")
# 点击搜索按钮
driver.find_element(By.CSS_SELECTOR, "button.btn-search").click()
注意事项
隐式等待设置会影响所有元素定位操作:
driver.implicitly_wait(10) # 最多等待10秒
显式等待可以针对特定条件:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "q"))
)
改进建议
验证码处理需要额外方案:
# 手动输入验证码
verification_code = input("请输入验证码:")
driver.find_element(By.CSS_SELECTOR, 'input[name="fm-smscode"]').send_keys(verification_code)
页面跳转后建议增加等待:
time.sleep(5) # 等待页面加载
元素定位技巧
开发者工具中使用 Ctrl+F 测试选择器:
document.querySelectorAll('a[href="//i.taobao.com/my_itaobao"]')
XPath 定位可作为备选方案:
driver.find_element(By.XPATH, '//a[@class="sms-login-tab-item"]').click()
Selenium 浏览器操作总结
以下是浏览器操作的优化代码示例,涵盖窗口控制、导航控制和刷新操作。
一、浏览器窗口控制
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
driver_path = "chromedriver.exe"
# #创建管理对象
service = Service(executable_path=driver_path)
# #创建webdriver
driver = webdriver.Chrome(service=service)
try:
# #最大化窗口
driver.maximize_window()
#隐式等待
driver.implicitly_wait(10)
# #打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# #设置窗口的宽和高
driver.set_window_size(480, 800)
time.sleep(2)
print(f"当前窗口尺寸: {driver.get_window_size()}")
print(f"窗口位置: {driver.get_window_position()}")
finally:
driver.quit()
二、浏览器导航控制
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
driver_path = "chromedriver.exe"
service = Service(executable_path=driver_path)
driver = webdriver.Chrome(service=service)
try:
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
print("当前页面:", driver.title)
time.sleep(2)
driver.get("http://www.google.com")
print("当前页面:", driver.title)
time.sleep(2)
#后退
driver.back()
print("后退到:", driver.title)
time.sleep(2)
#前进
driver.forward()
print("前进到:", driver.title)
time.sleep(2)
finally:
driver.quit()
三、浏览器刷新操作
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
import time
driver_path = "chromedriver.exe"
service = Service(executable_path=driver_path)
driver = webdriver.Chrome(service=service)
try:
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
time.sleep(2)
#页面的刷新
driver.refresh()
print("第一次刷新完成")
time.sleep(2)
driver.find_element_by_tag_name('body').send_keys(Keys.F5)
print("第二次刷新完成")
time.sleep(2)
driver.execute_script("location.reload();")
print("第三次刷新完成")
finally:
driver.quit()
四、多窗口处理示例
main_window = driver.current_window_handle
all_windows = driver.window_handles
for window in all_windows:
if window != main_window:
driver.switch_to.window(window)
五、异常处理示例
from selenium.common.exceptions import WebDriverException
try:
driver.refresh()
except WebDriverException as e:
print(f"刷新失败: {str(e)}")