Selenium
Selenium IDE 安装
浏览器插件安装
selenium安装
poetry add selenium
WebDriver安装
浏览器的版本和驱动版本要一致
浏览器驱动下载好后需要添加Path环境便令中,或者直接放到Python安装目录,因为Python以添加到Path中
HelloWorld
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://kimi.moonshot.cn/')
time.sleep(10)
driver.quit()
连接已打开的浏览器
.\msedge.exe --remote-debugging-port=9222 --user-data-dir=“D:\工具\QtScrcpy-win-x64-v2.2.1\apptest\webauto”
import time
from selenium import webdriver
options = webdriver.EdgeOptions()
options.debugger_address = "127.0.0.1:9222"
driver = webdriver.Edge(options=options)
driver.get('https://kimi.moonshot.cn/')
time.sleep(10)
driver.quit()
WebDriver 元素定位
class By:
"""Set of supported locator strategies."""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
id
elements 即可定位一组元素
from selenium.webdriver.common.by import By
driver.find_element(By.ID, 'article-content')
class
elements 即可定位一组元素
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME, 'article-content')
xpath
elements 即可定位一组元素
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//*[@id="article-content"]/h1')
link_text find_element_by_link_text() 它专门用来定位超链接文本(<a>标签</a>)
partial_link_text find_element_by_partial_link_text() partial_link_text定位是对link_text定位的补充,partial_like_text为模糊匹配
元素操作方法
元素常用操作方法
1. clear() 清除文本
2. send_keys() 模拟输入
3. click() 单击元素
WebDriver操作浏览器常用方法
1. maximize_window() 最大化 --> 模拟浏览器最大化按钮
2. set_window_size(100,100) 浏览器大小 --> 设置浏览器宽、高(像素点)
3. set_window_position(300,200) 浏览器位置 --> 设置浏览器位置
4. back() 后退 --> 模拟浏览器后退按钮
5. forward() 前进 --> 模拟浏览器前进按钮
6. refresh() 刷新 --> 模拟浏览器F5刷新
7. close() 关闭 --> 模拟浏览器关闭按钮(关闭单个窗口)
8. quit() 关闭 --> 关闭所有WebDriver启动的窗口
WebDriver其他常用方法
1. size 返回元素大小
2. text 获取元素的文本
3. title 获取页面title
4. current_url 获取当前页面URL
5. get_attribute("xxx") 获取属性值;xxx:要获取的属性
6. is_display() 判断元素是否可见
7. is_enabled() 判断元素是否可用
WebDriver鼠标、键盘操作
鼠标事件
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.EdgeOptions()
options.debugger_address = "127.0.0.1:9222"
driver = webdriver.Edge(options=options)
driver.implicitly_wait(10)
driver.get("https://www.toutiao.com/")
e = driver.find_element(By.CLASS_NAME, "picture")
e1 = driver.find_element(By.CLASS_NAME, "security-banner-image")
btn = driver.find_element(By.CLASS_NAME, "pgc-img")
actions = ActionChains(driver)
# 点击
actions.click(e).perform()
# 双击
actions.double_click(btn).perform()
# 右击
actions.context_click(e).perform()
# 移动
actions.move_to_element(e).pause(1).perform()
# 拖拽
actions.drag_and_drop(e1, e).perform()
time.sleep(30)
driver.quit()
键盘操作
from selenium.webdriver.common.keys import Keys
1. send_keys(Keys.BACK_SPACE)删除键(BackSpace)
2. send_keys(Keys.SPACE)空格键(Space)
3. send_keys(Keys.TAB)制表键(Tab)
4. send_keys(Keys.ESCAPE)回退键(Esc)
5. send_keys(Keys.ENTER)回车键(Enter)
6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
7. send_keys(Keys.CONTROL,'c')复制(Ctrl+C)
设置元素等待
显示等待
一个超时时间范围内,每隔一段时间去搜索一次元素是否存在, 如果存在返回定位对象,如果不存在直到超时时间到达,报超时异元素信息操作元素事件操作
from selenium.webdriver.support.ui import WebDriverWait
try:
# 查找元素前时间
print(time.strftime("%H:%M:%S",time.localtime()))
# 显示等待
self.title = WebDriverWait(self.driver, 5).until(lambda x : x.find_element(By.XPATH, '//*[@class="article-content"]/h1')).text
except Exception as e:
# 查找元素后时间
print(time.strftime("%H:%M:%S",time.localtime()))
隐式等待
定位某一元素失败,那么就会触发隐式等待有效时长,在指定时长内加载完毕,则继续执行,否则抛出异常,如果元素在第一次就定位到则不会触发隐式等待时长
driver.implicitly_wait(10)
下拉选择框、警告框、滚动条操作
Select类
Select类是WebDriver为解决select标签定位诞生的
1. select_by_index() --> 根据option索引来定位,从0开始
2. select_by_value() --> 根据option属性 value值来定位
3. select_by_visible_text() --> 根据option显示文本来定位
#导包
from selenium.webdriver.support.select import Select
e = driver.find_element_by_id("selectA")
select=Select(e)
# 1. 根据索引实现
select.select_by_index(1)
select.select_by_index(3)
select.select_by_index(2)
# 2. 根据文本值实现
select.select_by_visible_text("上海")
select.select_by_visible_text("重庆")
select.select_by_visible_text("广州")
# 3. 根据value属性实现
select.select_by_value("sh")
select.select_by_value("cq")
select.select_by_value("gz")
警告框处理
HTML中常用的对话框有三种
1). alert
2). confirm
3). prompt
1. 获取警告框
alert=driver.switch_to.alert
2. 调用
alert.text --> 返回alert/confirm/prompt中的文字
alert.send_keys("12345") --> 写入prompt中的文字,也即返回值
信息
alert.accept() --> 接受对话框选项
alert.dismiss() --> 取消对话框选项
代码示例:
alert = driver.switch_to.alert
print(alert.text)
alert.send_keys("12345")
time.sleep(5)
alert.accept()
# alert.dismiss()
滚动条操作
通过JavaScript脚本来达到操作滚动条的目的
(0:左边距;1000:上边距;单位像素)
# 最底层
js1="window.scrollTo(0,1000)"
# 最顶层
js2="window.scrollTo(0,0)"
# 执行最底层
driver.execute_script(js1)
# 执行最顶层
driver.execute_script(js2)
frame表单切换、多窗口切换
iframe表单
切换。
1、可以直接使用id属性值切换进内层页面
driver.switch_to.frame(value)
2、定位到iframe元素,再切换进入
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)
1. 跳回最外层的页面
driver.switch_to.default_content() -- 切换到最外层
2. 跳回上层的页面
driver.switch_to.parent_frame() -- 进行向上的单层切换
代码示例:
# driver.switch_to.frame('ifr1')
# driver.switch_to.frame('ifr2')
ifr = driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to.frame(ifr)
ifr = driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to.frame(ifr)
p = driver.find_element(By.TAG_NAME, 'p')
print(p.get_attribute('innerHTML'))
driver.switch_to.parent_frame()
driver.switch_to.parent_frame()
# driver.switch_to.default_content()
p = driver.find_element(By.TAG_NAME, 'p')
print(p.get_attribute('innerHTML'))
多窗口
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
打开多二个窗口
first_window = self.driver.current_window_handle
self.driver.execute_script(f"window.open('');") self.driver.switch_to.window(self.driver.window_handles[1])
截图、验证码处理
窗口截图
driver.get_screenshot_as_file('test.png')
元素截图
p = driver.find_element(By.TAG_NAME, 'p')
p.screenshot('test.png')
验证码处理
1). 去掉验证码
(测试环境下-采用)
2). 设置万能验证码
(生产环境-采用)
3). 验证码识别技术
(通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie
(通过记录cookie进行登录-推荐)
ddddocr
ddddocr是一个 OCR 库
安装
poetry add ddddocr
import ddddocr
code = driver.find_element(By.CLASS_NAME, 'codeImg')
src = code.get_attribute('src')
download_image(src, 'code.png')
ocr = ddddocr.DdddOcr(old=True)
with open('code.png', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)
其他使用方法
Python通用验证码识别OCR库之ddddocr验证码识别python脚本之家 (jb51.net)
记录cookie保持登陆状态
driver.get("https://www.baidu.com")
cookies = {
'__bid_n':'191ed16704a0576219fdf7',
'BDUSS':'HhzQ0M5M0J-bndHY35-WWhadW1GeGlzZlNuQ0JEZ1BGa0t0cFpTeVpVeVJMZ3huRUFBQUFBJCQAAAAAAAAAAAEAAACUU8nnc2t5s8zQ8tSzMDA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGh5GaRoeRmd',
'BDUSS_BFESS':'HhzQ0M5M0J-bndHY35-WWhadW1GeGlzZlNuQ0JEZ1BGa0t0cFpTeVpVeVJMZ3huRUFBQUFBJCQAAAAAAAAAAAEAAACUU8nnc2t5s8zQ8tSzMDA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGh5GaRoeRmd',
'RT':"z:1&dm:baidu.com&si:021362a8-0713-4ae8-9316-78d95d8ce8b6&ss:m11i145e&sl:77&tt:8a06&bcn:https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld:3ubqj&ul:3ucyh&hd:3ucyo",
'BAIDUID_BFESS':'1FA3BDCAEE0AA1CB39D0780567CA22FF:FG:1',
'BIDUPSID':'1FA3BDCAEE0AA1CB39D0780567CA22FF',
'PSTM':'1726553380',
'H_PS_PSSID':'60726_60360_60749_60769',
'BD_UPN':'12314753',
'BA_HECTOR':'8g05ah24ak2l04a5akal858h27pdrs1jei7961u',
'ZFY':'gw5JRYDhUjuLnP3MZ7G1CoLtBbCUvjVasxVCSM8GxSM:C'
}
for key, value in cookies.items():
driver.add_cookie({'name':key,'value':value})
time.sleep(3)
driver.refresh()
time.sleep(3)