第八章 selenium的使用

本文详细介绍了Selenium库在Python中的应用,包括浏览器操作(如打开、最大化、定位元素、输入、JS执行、窗口切换、截图等),以及验证码识别和无头模式的使用,同时涵盖了等待策略和事件链操作技巧。
摘要由CSDN通过智能技术生成

1. 前期准备

1. selenium包下载

pip install selenium -i  https://pypi.tuna.tsinghua.edu.cn/simple

2. 驱动程序

安装驱动:https://registry.npmmirror.com/binary.html?path=chromedriver/

  1. 根据浏览器版本下载浏览器驱动
  2. 将驱动放到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定位界面元素

  1. id定位
  2. name定位
  3. class_name定位(使用元素的class属性)
  4. tag_name定位(标签名称<标签名…/>)
  5. link_text定位 (定位超链接 a标签):
  6. partial_link_text定位(定位超链接 a标签 模糊)
  7. XPath定位 (基于元素路径)
  8. 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之后的版本
请添加图片描述
请添加图片描述
请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值