命令窗口输入以下命令
#查看已安装的Python包(可跳过)
pip list
#安装selenium 4.3.0
pip install selenium==4.3.0
新建一个Python文件,自行命名,输入以下代码
import time
# 导入selenium包
from selenium import webdriver
# 打开Chome浏览器
browser = webdriver.Chrome()
# 停留三秒
time.sleep(3)
# 关闭浏览器
browser.quit()
import time
# 导入selenium包
from selenium import webdriver
# 打开指定(Chrome)浏览器
browser = webdriver.Chrome()
# 指定加载页面
browser.get("http://www.csdn.net/")
# 设置五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()
元素定位方法包含了2个系列:
find_element()
系列:用于定位单个的页面元素。find_elements()
系列:用于定位一组页面元素,获取到的是一组列表。id
属性定位find_element(By.ID,'XX')
id定位,根据元素的id属性值定位,最为方便且唯一,但有可能不存在,也可能动态生成。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开指定(Chrome)浏览器
browser = webdriver.Chrome()
# 指定加载页面
browser.get("http://www.csdn.net")
# 通过id属性获取搜索输入框
input_text = browser.find_element(By.ID, "toolbar-search-input")
# 向搜索输入框内输入selenium
input_text.send_keys("selenium")
# 设置停留五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()
name
属性定位find_element(By.NAME,'xx')
name定位,根据元素的name属性值定位,定位到的标签不一定是唯一的import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.baidu.com/")
# 通过name属性选择文本框元素,并设置内容
browser.find_element(By.NAME,'wd').send_keys("selenium")
# 通过通过ID属性获取“百度一下”按钮,并执行点击操作
browser.find_element(By.ID,"su").click()
# 停留五秒后关闭浏览器
time.sleep(5)
browser.quit()
class
属性定位find_element_by(By.CLASS_NAME,'xx')
class定位,根据元素的class属性值定位,但可能受JS影响动态变化。定位到的标签不一定是唯一的。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.baidu.com/")
time.sleep(2)
# 通过class属性选择元素
browser.find_element(By.CLASS_NAME,'s_ipt').send_keys("CSDN")
time.sleep(2)
browser.find_element(By.ID,"su").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
tag
定位find_element(By.TAG_NAME,'xx')
tag name定位,根据元素的标签名定位,定位到的标签不一定是唯一的。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
time.sleep(2)
# 选择<button></button>标签(搜索按钮),执行点击操作
browser.find_element(By.TAG_NAME, "button").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
link
定位import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 选择<a href="https://blog.csdn.net/nav/back-end">Python</a>标签,执行点击操作
browser.find_element(By.LINK_TEXT, "Python").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
(2)By.PARTIAL_LINK_TEXT
模糊定位
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 选择<a href="href="https://blog.csdn.net/nav/ai">人工智能</a>标签,执行点击操作
browser.find_element(By.PARTIAL_LINK_TEXT, "人工").click()
# 停留3秒后关闭浏览器
time.sleep(3)
browser.quit()
xpath
定位xpath
是一种在XML文档中定位元素的语言
使用绝对路径定位:指的是从网页的HTML代码结构的最外层一层层的写到需要被定位的页面元素为止。绝对路径起始于/,每一层都被/所分割。demo:/html/body/div[2]/form/input[3] 注解:
使用相对路径定位:不是从根目录写起,而是从网页文本的任意目录开始写。相对路径起始于//,//所表示的含义是“任意标签下”。demo://input[@id='kw'] 注解:
find_element(By.XPATH,'XX')根据元素的xpath表达式来完成定位,可以准确定位任何元素
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 选取属性 |
打开CSDN首页,按F12进入开发者模式,我们可以按照下图所示获取元素的xpath路径,我这里定位的是搜索框的xpath。
在这里插入图片描述
点击后会存在与剪切板中,Ctrl+v
粘贴到代码中即可使用,这里获取到的是相对路径。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 通过xpath定位输入框,输入内容selenium
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium')
# 停留五秒后关闭浏览器
time.sleep(5)
browser.quit()
css
选择器定位注意:对于
css
的属性值来说,可以加引号也可以不加,注意属性的引号和整个CSS表达式的引号要进行区分。对于xpath的属性值来讲,需要加上引号,否则报错。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 通过css选择器定位输入框,输入内容selenium
browser.find_element(By.CSS_SELECTOR, '#toolbar-search-input').send_keys('selenium')
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
定位方式 | 定位是否唯一 | 返回值类型 | 备注 |
---|---|---|---|
id属性定位 | 唯一 | element | 只有当标签有id属性时才能使用 |
name属性定位 | 可能不唯一 | element或elements列表 | 只有当标签有name属性时才能使用 |
class属性定位 | 可能不唯一 | element或elements列表 | 只有当标签有class属性时才能使用 |
tag定位 | 可能不唯一 | element或elements列表 | 通常得到的都是一组列表 |
link_text精确定位 | 可能不唯一 | element或elements列表 | 一般情况定位是唯一的,只有存在link_text相同时,才得到列表 |
link_text模糊定位 | 可能不唯一 | element或elements列表 | 一般用于定位<a></a>标签 |
xpath定位 | 可能不唯一 | element或elements列表 | 一般用来做精确定位,用/表示元素层级关系,xpath属性定位值必须加引号 |
css选择器定位 | 可能不唯一 | element或elements列表 | 一般用作精确定位,用>或空格表示元素层级关系,属性值可以不加引号 |
send_keys('XXX')
文本输入。clear()
文本清空。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 通过css选择器定位输入框
input_text = browser.find_element(By.CSS_SELECTOR,'#toolbar-search-input')
# 输入文本
input_text.send_keys("selenium")
# 停留2秒
time.sleep(2)
# 清空文本
input_text.clear()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
submit()
提交submit()
只能用于包含属性type='submit'
的标签,并且嵌套在form
表单中。click()
代替submit()
使用。submit()
和click()
是有很大区别的,这里不再做具体说明。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
# 通过xpath选择器定位输入框,并输入CSDN
input_text = browser.find_element(By.XPATH,'//*[@id="kw"]').send_keys("CSDN")
time.sleep(2)
# 定位提交按钮后提交
browser.find_element(By.XPATH,'//*[@id="su"]').submit()
# 停留3秒后关闭
time.sleep(3)
browser.quit()
title
页面标题page_source
页面源码current_url
页面连接text
标签内文本import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 获取标题
title = browser.title
# 输出
print(title)
# 获取源代码
source_code = browser.page_source
#输出源代码
print(source_code)
# 获取页面链接
url = browser.current_url
#输出页面链接
print(url)
# 获取标签内文本
text = browser.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/div/button/span').text
print(text)
# 关闭页面
time.sleep(3)
browser.quit()
implicitly_wait(N)
通过一定时长等待页面元素加载,最大等待时长N
秒,如果中间某个时刻元素加载好了,就会结束等待,执行下一步操作;如果超出设置时间元素没加载出来,抛出没有这样的元素异常。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 隐式等待
browser.implicitly_wait(5)
# 关闭页面
browser.quit()
time.sleep(3)
maximize_window()
窗口最大化。minimize_window()
窗口最小化。set_window_size(width,height)
调整窗口到指定尺寸。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
# 窗口最大化
browser.maximize_window()
#停留2秒
time.sleep(2)
#窗口最小化
browser.minimize_window()
# 指定窗口尺寸
browser.set_window_size(300, 500)
# 关闭页面
time.sleep(3)
browser.quit()
forward()
前进一页。back()
后退一页。import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
browser.find_element(By.LINK_TEXT, 'Python').click()
#停留2秒
time.sleep(2)
# 页面后退一页
browser.back()
# 停留2秒
time.sleep(2)
# 前进一页
browser.forward()
# 关闭页面
time.sleep(3)
browser.quit()
refresh()
页面刷新import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
browser.find_element(By.LINK_TEXT, 'Python').click()
#停留2秒
time.sleep(2)
# 页面刷新
browser.refresh()
# 关闭页面
time.sleep(3)
browser.quit()
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.csdn.net")
sleep(2)
# 获取当前窗口句柄
page_context = browser.current_window_handle
# 打开其它页面
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium')
browser.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/div/button/span').click()
sleep(2)
# 切换到刚开始打开页面
browser.switch_to.window(page_context)
# 获取当前打开所有页面的句柄
pages_context = browser.window_handles
# 输出当前打开页面个数
print(len(pages_context)) # 结果:2
# 关闭
sleep(3)
browser.quit()
选取框架内元素,首先我们要定位到框架元素,然后切换到框架页面,才能对框架页面内元素进行操作。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>frame内敛框架页面</title>
</head>
<body>
这是框架frame外:<input type="text" >
<iframe id='frame' src="http://www.csdn.net" width=1000px height=500px></iframe>
</body>
</html>
switch_to.frame(tag_iframe)
切换到frame/iframe
框架页面。switch_to.parent_frame()
从内敛框架中切出。from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("file:///D:/frame.html")
sleep(2)
# 定位到iframe标签
tag_iframe = browser.find_element(By.TAG_NAME, 'iframe')
# 切换到iframe框架页面内
browser.switch_to.frame(tag_iframe)
# 定位到框架内搜索框并输入内容
browser.find_element(By.LINK_TEXT, 'Python').click()
sleep(2)
# 从内敛框架页面切出
browser.switch_to.parent_frame()
browser.find_element(By.XPATH, "//input").send_keys("这是框架外面!")
# 关闭浏览器
sleep(3)
browser.quit()
get_attribute("XX")
获取标签属性值,XX
为标签属性名。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
用户名:<input type="text" name="user_name">
密码:<input type="password" name="pwd">
<input type="checkbox" name="Java">Java
<input type="checkbox" name="Python">Python
<input type="checkbox" name="C++">C++
<input type="checkbox" name="JavaScript">JavaScript
<input type="checkbox" name="HTML">HTML
</body>
</html>
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("file:///C:/Users/admin/Desktop/checkbox.html")
# 定位input标签
tag_input = browser.find_elements(By.TAG_NAME, 'input')
# 通过type属性的值来定位元素,并进行选取
for type_value in tag_input:
# 输出input标签的name属性的值:
print(type_value.get_attribute("name"))
# 对复选框进行选取操作
if type_value.get_attribute("type") == "checkbox":
type_value.click()
time.sleep(2)
# 关闭浏览器
time.sleep(3)
browser.quit()
user_name
pwd
Java
Python
C++
JavaScript
HTML
页面HTML源码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
编程语言:<select>
<option>Java</option>
<option>C++</option>
<option value="Python">Python</option>
<option>HTML</option>
<option>JavaScript</option>
</select>
</body>
</html>
Python 源码
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入Select类
from selenium.webdriver.support.select import Select
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("file:///C:/Users/admin/Desktop/select.html")
# 定位下拉列表标签,并创建下拉列表对象
select = Select(browser.find_element(By.TAG_NAME, "select"))
# 通过value属性选择选项
select.select_by_value("Python")
sleep(2)
# 通过文本内容选择选项
select.select_by_visible_text("C++")
sleep(2)
# 通过选项索引号选择选项
select.select_by_index(0) # 等同于 select.options[0].click()
sleep(2)
# 通过options属性循环选取
for i in select.options:
i.click()
sleep(2)
# 关闭浏览器
sleep(3)
browser.quit()
switch_to.alert
获取弹窗对象。text
弹窗内容accept()
接受弹窗dismiss()
取消弹窗页面HTML源码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
<input type="button" id="alert" value="alert弹窗" onclick="alert('这是alert()弹窗!')">
<input type="button" id="confirm"value="confirm弹窗" onclick="confirm('这是confirm()弹窗!')" >
<input type="button" id="prompt" value="prompt弹窗" onclick="prompt('这是prompt()弹窗!','这是prompt()弹窗的默认值!')">
</body>
</html>
Python源码
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("file:///C:/Users/admin/Desktop/alert.html")
# alert()弹窗处理
browser.find_element(By.ID, "alert").click()
sleep(2)
# 获取弹窗对象
alert = browser.switch_to.alert
# 输出弹窗内容
print(alert.text) # 结果:这是alert()弹窗!
# 确认弹窗
alert.accept()
sleep(2)
# confirm()弹窗
browser.find_element(By.ID, "confirm").click()
sleep(2)
# 获取弹窗对象
confirm = browser.switch_to.alert
# 输出弹窗内容
print(confirm.text) # 这是confirm()弹窗!
# 执行性弹窗的取消按钮
confirm.dismiss() # confirm.accept() # 执行弹窗确认按钮
sleep(2)
# prompt()弹窗
browser.find_element(By.ID, "prompt").click()
sleep(2)
# 获取弹窗对象
prompt = browser.switch_to.alert
# 输出弹窗内容
print(prompt.text) # 这是prompt()弹窗!
# 向弹窗的输入框内输入内容
prompt.send_keys("这是弹窗prompt()")
sleep(2)
# 执行性弹窗的确认按钮
prompt.accept()
# 关闭浏览器
sleep(3)
browser.quit()
不管执行哪个方法,最后都要调用
perform()
方法,将操作呈现出来。
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("https://www.csdn.net")
sleep(2)
# 创建ActionChains对象
action = ActionChains(browser)
# 定位标签并将鼠标移入,并呈现移入结果
tag = browser.find_element(By.XPATH, '//div/a[@class="btn-write-new"]')
action.move_to_element(tag).perform()
sleep(3)
tag = browser.find_element(By.CSS_SELECTOR, '.blog-nav-box')
action.move_to_element(tag).perform()
sleep(2)
browser.find_element(By.LINK_TEXT, "数学").click()
# 关闭浏览器
sleep(2)
browser.quit()
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("https://www.csdn.net")
sleep(2)
input_text = browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]')
input_text.send_keys("selenium")
sleep(2)
input_text.send_keys(Keys.CONTROL, "a") # 全选
sleep(2)
input_text.send_keys(Keys.CONTROL, 'x') # 剪切
sleep(2)
input_text.send_keys(Keys.CONTROL, 'v') # 粘贴
sleep(2)
input_text.send_keys(Keys.BACK_SPACE) # 回退一格
# 关闭浏览器
sleep(2)
browser.quit()
execute_script(X)
执行JS代码,X代表要执行的JS代码from time import sleep
# 导入selenium包
from selenium import webdriver
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("https://www.csdn.net")
sleep(2)
# 执行js弹窗代码
browser.execute_script("alert('这是js弹窗代码')")
sleep(2)
browser.switch_to.alert.accept()
sleep(2)
# 执行js窗口滚动条代码
browser.execute_script("window.scrollTo(20,1000)")
sleep(2)
# 打开多个窗口
browser.execute_script("window.open('https://www.baidu.com')")
browser.execute_script("window.open('https://www.bing.com')")
sleep(2)
browser.quit()
get_screenshot_as_file(XX)
浏览器窗口截屏,XX
代表文件保存地址及文件名、格式。只写文件名保存至当前路径,若写路径,则路径必须存在。from time import sleep
# 导入selenium包
from selenium import webdriver
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("https://www.csdn.net")
sleep(2)
# 浏览器窗口截屏
browser.get_screenshot_as_file("csdn.png")
sleep(2)
browser.quit()
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
sleep(2)
# 打开csdn首页
browser.get("https://www.csdn.net")
tag = WebDriverWait(browser, 5, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="toolbar-search-input"]')))
tag.send_keys("selenium")
#关闭
sleep(2)
browser.quit()
参考 官方文档:https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/ https://blog.csdn.net/qq_43125235/article/detai