文章目录
1. 前期准备
1. selenium包下载
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 驱动程序
安装驱动:https://registry.npmmirror.com/binary.html?path=chromedriver/
- 根据浏览器版本下载浏览器驱动
- 将驱动放到python的目录中python.exe同级目录下
2. selenium的功能
1. selenium打开浏览器
from selenium.webdriver import Chrome
web = Chrome()
#打开浏览器
web.get(url='https://www.baidu.com')
# 窗口最大化
web.maximize_window()
2. python定位界面元素
- id定位
- name定位
- class_name定位(使用元素的class属性)
- tag_name定位(标签名称<标签名…/>)
- link_text定位 (定位超链接 a标签):
- partial_link_text定位(定位超链接 a标签 模糊)
- XPath定位 (基于元素路径)
- css定位 (元素选择器)
css定位
#1. id选择器
driver.find_element(By.CSS_SELECTOR,value="#applyMail")#选择id属性值(格式#id)
#2. class选择器
driver.find_element(By.CSS_SELECTOR,value=".btn-primary")
#3. 元素选择器
driver.find_element(By.CSS_SELECTOR,value="div")#标签
driver.find_element(By.CSS_SELECTOR,value="百度一下")#界面元素
#4. 属性选择器
driver.find_element(By.CSS_SELECTOR,value="[id='applyMail']")
#5. 层级选择器
driver.find_elements(By.CSS_SELECTOR,value="div div ")[1].click()#定位div下div中的a
3. 输入框输入
# 内容输入 send_keys('输入内容')
web.find_element('xpath','//*[@id="kw"]').send_keys('python selenium自动化')
# 清除输入框的内容
web.find_element('xpath','//*[@id="kw"]').clear()
#强制等待1s
time.sleep(1)
# 鼠标点击.click()
web.find_element('xpath','//*[@id="su"]').click()
4. 执行JS脚本
execute_script(X)
# 由于在selenium执行自动化的时候,会存在一些界面始终显示在浏览器上无法去除,这时候可以使用JS脚本删除界面元素
web.execute_script("""
var a = document.getElementsByClassName("classname")[0];
a.parentNode.removeChild(a);
""")
# 执行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')")
5. selenium切换窗口
# current_window_handle获取当前窗口的句柄
page_context = web.current_window_handle
# window_handles获取所有打开页面的句柄,是一个列表
pages_context = web.window_handles
# switch_to.window(“XX”)切换到指定页面,XX代表页面句柄
web.switch_to.window(page_context)
#切换到第一个窗口
web.switch_to.windows(web.window_handles[0])
#关闭当前窗口
web.close()
6. 获取element中的元素
#获取页面的cookie
web.get_cookie()
#获取属性的值
input = web.find_element('xpath','')
input.get_property("src")
# 获取页面源码 element中的源码
pagesource = web.page_source
print(pagesource)
7. frame/iframe内元素操作
选取框架内元素,首先我们要定位到框架元素,然后切换到框架页面,才能对框架页面内元素进行操作。
- switch_to.frame(tag_iframe)切换到frame/iframe框架页面。
- switch_to.parent_frame()从内敛框架中切出。
# 定位到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("这是框架外面!)
8. 下拉列表操作
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
编程语言:<select>
<option>2000年</option>
<option>2001年</option>
<option value="Python">2002年</option>
<option>2003年</option>
<option>2004年</option>
</select>
</body>
</html>
#导包
from selenium.webdriver.common.by import By
# 导入Select类
from selenium.webdriver.support.select import Select
定位下拉列表标签,并创建下拉列表对象
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)
9. 无头浏览器
UI自动化时不展示浏览器界面
# 导包
from selenium.webdriver.chrome.options import Options
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")
web = Chrome(options=opt)
10. selenium等待
- sleep(n)强制等待,需要导入time包,n表示等待秒数;用于避免因元素未加载出来而定位失败的情况。
- implicitly_wait(n)隐式等待,如果超过n秒,抛出找不到元素的异常;隐式等待只需要声明一次,一般在打开浏览器后进行声明。隐式等待存在的问题是程序会一直等待整个页面加载完成才会执行下一步,有时候想要定位的元素早就加载好了,但是由于别的页面元素没加载好,仍会等到整个页面加载完成才能执行下一步。
- WebDriverWait(web,n,h):显式等待,web代表浏览器对象,n等待时长,h频率。相比于隐式等待,显式等待只针对指定的元素生效,不再是针对所有的页面元素。可以根据需要定位的元素来设置显式等待,无需等待页面完全加载,节省了大量因加载无关紧要的页面元素而浪费的时间。使用方法:WebDriverWait(browser,5,0.5).until(expected_conditions.presence_of_element_located((By.ID,‘kw’)))
from selenium.webdriver import Chrome
# 导包
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
web.get(url='https://www.baidu.com/')
# 窗口最大化
web.maximize_window()
tag = WebDriverWait(web, 5, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="su"]')))
tag.click()
web.quit()
11. 截图
get_screenshot_as_file(XX)浏览器窗口截屏,XX代表文件保存地址及文件名、格式。只写文件名保存至当前路径,若写路径,则路径必须存在。
from time import sleep
# 导入selenium包
from selenium import webdriver
# 启动并打开指定页面
web = webdriver.Firefox()
webr.get("https://www.baidu.com")
sleep(2)
# 浏览器窗口截屏
web.get_screenshot_as_file("csdn.png")
sleep(2)
browser.quit()
verify_div = web.find_element('xpath','')
#截图div区域并保存成b64格式
yanzhengma_img = verify_div.screenshot_as_base64
# 截图div区域,保存成图片
verify_div.screenshot("img")
3. 验证码
1. 图鉴
网址:http://www.ttshitu.com/
import base64
import json
import requests
# 一、图片文字类型(默认 3 数英混合):
# 1 : 纯数字
# 1001:纯数字2
# 2 : 纯英文
# 1002:纯英文2
# 3 : 数英混合
# 1003:数英混合2
# 4 : 闪动GIF
# 7 : 无感学习(独家)
# 11 : 计算题
# 1005: 快速计算题
# 16 : 汉字
# 32 : 通用文字识别(证件、单据)
# 66: 问答题
# 49 :recaptcha图片识别
# 二、图片旋转角度类型:
# 29 : 旋转类型
#
# 三、图片坐标点选类型:
# 19 : 1个坐标
# 20 : 3个坐标
# 21 : 3 ~ 5个坐标
# 22 : 5 ~ 8个坐标
# 27 : 1 ~ 4个坐标
# 48 : 轨迹类型
#
# 四、缺口识别
# 18 : 缺口识别(需要2张图 一张目标图一张缺口图)
# 33 : 单缺口识别(返回X轴坐标 只需要1张图)
# 五、拼图识别
# 53:拼图识别
def base64_api(uname, pwd, img, typeid):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
#!!!!!!!注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别
return result["message"]
return ""
if __name__ == "__main__":
img_path = "C:/Users/Administrator/Desktop/file.jpg"
result = base64_api(uname='你的账号', pwd='你的密码', img=img_path, typeid=3)
print(result)
2. 点选验证验证
#获取验证码图片的div
verify_div = web.find_element('xpath','')
#截图保存成b64的字符串
yanzhengma_img = verify_div.screenshot_as_base64
登记入口的,点选验证码
获取验证码,鼠标的点选位置
使用selenium的事件链,点击
- selenium+lxml组合获取页面数据
显示等待导包
- 12306登录
鼠标滑动验证
导包
解决滑动后报错
检测到selenium报错
88之前的版本使用此命令修改window.navigator.webdriver
88之后的版本