1、环境准备
- 安装python和pycharm
- 安装浏览器如谷歌
- 根据浏览器版本尽量下载大版本相近的浏览器驱动googlechromelabs.github.io/chrome-for-… (可以选择在开始处搜索services.msc 找到 Google更新组件全部禁用)如图:
- 安装selenium工具在左下角的终端中输入pip install selenium -i pypi.tuna.tsinghua.edu.cn/simple (可以输入后面代码验证一下:python -c "import selenium; print(selenium.version)")
- 将下载的驱动拖入项目下,并开始写代码
# 导入Selenium WebDriver相关模块
from selenium import webdriver
from selenium.webdriver.chrome.options import Options # 用于配置Chrome浏览器选项
from selenium.webdriver.chrome.service import Service # 用于管理ChromeDriver服务
# 创建浏览器选项配置对象
q1 = Options()
# 添加"--no-sandbox"参数:禁用Chrome的沙盒安全模式
# 通常在Linux服务器或无GUI环境下需要此配置
q1.add_argument("--no-sandbox")
# 设置实验性选项"detach"为True:
# 保持浏览器窗口在脚本结束后不自动关闭(便于调试)
q1.add_experimental_option("detach", True)
# 初始化Chrome浏览器实例
# service参数:指定ChromeDriver可执行文件路径(使用原始字符串r前缀避免转义问题)
# options参数:应用上面设置的浏览器选项
a1 = webdriver.Chrome(
service=Service(r'E:\temp\PythonTemp\Selenium\chromedriver.exe'),
options=q1
)
# 注意:
# 1. chromedriver.exe需要与已安装的Chrome浏览器版本匹配
# 2. 路径中的r前缀确保Windows路径中的反斜杠被正确解析
# 3. detach=True时,最后需要手动调用a1.quit()关闭浏览器
2、操作练习
- 函数模版: def main(): return
time.sleep(3):强制等待 3 秒(慎用)。注意:使用时需要import timeweb.close():关闭当前标签页,web.quit()关闭浏览器。- web.maximize_window():最大化
- web.minimize_window():最小化
- web.set_window_position(100, 100):设置浏览器位置
- web.set_window_size(800, 600):设置浏览器大小
- web.refresh():刷新浏览器
- web.get_screenshot_as_file("1.png"):截图浏览器并保存成png文件到当前文件夹下
- 可以在网页F12之后的控制台中输入进行查找元素:document.getElementById("name")
- 八大定位:可以用find_elements来返回一组值,在使用数组方式来获取其中一个
- name1 = web.find_element(By.ID, "loginname"):查找id为loginname的元素,有则返回
- name1 = web.find_element(By.NAME, "loginname"):查找name为loginname的元素,有则返回
- name1 = web.find_element(By.CLASS_NAME, "el-radio__label"):如果有class可用
注意:定位的class值不能有空格,否则报错 - name = web.find_elements(By.TAG_NAME, "input"):查找标签名:input的元素,一般要配合数组来使用
- name = web.find_element(By.LINK_TEXT, "你好"):通过a标签文本内容来获取元素,它是精确查询,需要模糊查询是PARTIAL_LINK_TEXT
- name = web.find_element(By.CSS_SELECTOR, "#loginname"):通过#(id); .(class); 不加标签(标签头);任意类型格式
注意是精确值,但在type后加个*表示为模糊值,^是开头值,$是结尾值:name = web.find_element(By.CSS_SELECTOR, "[type='submit']")更简单的做法是直接F12后复制它的selector然后直接使用即可 - button1 = web.find_element(By.XPATH, '//button[@type="button"]'):使用属性加路径定位,
注意:它也可以在浏览器控制台中复制-XPATH,但有些动态变化的不起作用这时候需要复制完整XPATH - 即5中的模糊查询
- name1.send_keys(""):输入内容
- button1.click():点击元素
- name1.clear():清空
- web.implicitly_wait(5)#隐式等待:一旦获取到元素即可继续执行
- 日期类:web.find_element(By.XPATH, "你的XPATH").send_keys("0020251001")
- 附件:web.find_element(By.XPATH, "/html/body/div[1]/div/div[1]/form/div[4]/div/button").send_keys(r'你文件的绝对路径')
- webs = web.window_handles:获取全部标签页的句柄
- web.switch_to.window(webs[0]):切换标签页
- 处理警告弹窗
| 方法 | 作用 |
|---|---|
| alert.accept() | 点击“确定” |
| alert.dismiss( | 点击“取消”(Confirm/Prompt) |
| alert.text | 获取弹窗文本 |
| alert.send_keys() | 向Prompt弹窗输入文本 |
- iframe处理:先获取iframe元素,之后进入到里面的页面再进行操作。
- text = web.find_element(By.XPATH, "").text:获取文本内容
- web2D.find_element(By.XPATH, "").is_displayed():是否是可见内容
- web.back():标签页后退
- web.forward():标签页前进
- 判断是否可编辑:is_editable = input_element.is_enabled()
- 创建文件并写入:
with open('new_file.txt', 'w', encoding='utf-8') as f:
f.write("使用pathlib创建的文件内容")
with file_path.open('a', encoding='utf-8') as f:
- 抛出错误
try:
WebDriverWait(web, 1).until(
EC.presence_of_element_located((By.CSS_SELECTOR, '.search_div_box no_data_text'))
)
# 如果1秒内找到元素,会执行到这里(但您没有写任何操作)
except TimeoutException:
pass # 1秒内未找到元素,跳过并继续执行后续代码
- 需要另开一页操作:
# 执行JavaScript代码来打开新标签页并访问指定网址
web.execute_script(
"window.open('目标网址');")
# 获取所有打开的窗口句柄
tabs = web.window_handles
# 切换到新打开的标签页
web.switch_to.window(tabs[1])
- 打印所有元素
all_options = web.find_elements(By.CSS_SELECTOR, "div.search_choose_item")
print("所有可用选项:")
for opt in all_options:
print(opt.text)
- 直接执行 JavaScript 点击
driver.execute_script("arguments[0].click();", element)
-
循环输入执行函数格式:
while True:
user_input = input("请输入字符串(或输入 'exit' 退出): ").strip()
if user_input.lower() == 'exit':
print("退出程序")
break # 退出循环
if user_input: # 非空输入才处理
process_string(user_input)
else:
print("输入不能为空!")
- python中导入其他包方法:
# 从技能包下Skill.py中导入extract_data_from_txt方法
from 技能.Skill import extract_data_from_txt
- 3
ActionChains(web).move_to_element(input_element).click().perform()是 Selenium 中模拟更真实用户操作的一种方式,它比直接element.click()更可靠,特别是在处理复杂网页时。下面详细解释它的作用和原理:
ActionChains(web) # 创建动作链对象
.move_to_element(input_element) # 将鼠标移动到目标元素
.click() # 执行点击操作
.perform() # 执行所有缓存的动作
-
4 正则表达式测试网站:
https://regex101.com/ -
5 ?:前面的一个字符出现0或1次。* :前面一个字符出现0或多次。+:匹配出现1次以上。{}:匹配几次,也可指定范围:如
表示匹配出现2次以上的。匹配多个多次出现(元素)+。或:(a|b)匹配a或者b。[]表示所有元素都取自这里面,a-zA-Z0-9表示所有英文和数字。^在[]中表示排除,外面表示匹配行首的元素如^a与此相反匹配行尾的是a$。元字符:\d数字字符;\w单词字符(包含_、英文、数字);\s空白符包含tab和换行符(而\D表示非数字字符、\W非单词字符、\S非空白字符)。任意字符:<.>。
点击按钮(需要滚动到达并等待加载)
# 先滚动到主体表格的第i行
row = web3D.find_element(By.XPATH, f"你的XPATH")
web3D.execute_script("arguments[0].scrollIntoView({block: 'center', inline: 'nearest'});", row)
# 然后等待固定列部分的编辑按钮可点击并点击
button1 = WebDriverWait(web3D, 10).until(EC.element_to_be_clickable(
(By.XPATH, f"你的XPATH")))
button1.click()