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)

results matching ""

    No results matching ""