自动化测试框架:DrissionPage

DrissionPage优点

1、既可以像selenium控制浏览器,也可以像requests进行数据包的发送和接收,将这两者结合在一起。这种综合性能使其非常灵活,可以适用于各种不同的自动化任务。

2、工具内置了许多人性化的设计和便捷功能,使其更容易使用。这对于新手来说非常友好,也有助于提高开发效率。

3、对于需要登录网站、分析数据包、处理JS源码、构造复杂请求以及应对验证码、JS混淆、签名参数等反爬手段的任务,DrissionPage提供了强大的支持。

DrissionPage官网

DrissionPage安装

使用pip进行安装

pip install DrissionPage

使用pip清华的镜像源进行安装

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

DrissionPage基本使用

控制浏览器,导入ChromiumPage

from DrissionPage import ChromiumPage

 示例代码1:

from DrissionPage import ChromiumPage
 
# 创建页面对象,并启动或接管浏览器
page = ChromiumPage()
# 跳转到登录页面
page.get('https://gitee.com/login')    # get()方法用于访问参数中的网址。它会等待页面完全加载,再继续执行后面的代码。
 
# 定位到账号文本框
ele = page.ele('#user_login')    # ele()方法用于查找元素,'#user_login'是定位符文本,#意思是按id属性查找元素。ele()内置了等待,如果元素未加载,它会执行等待,直到元素出现或到达时限。默认超时时间 10 秒。
 
# 输入对文本框输入账号
ele.input('账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('密码')
# 点击登录按钮
page.ele('@value=登 录').click()    # @表示按属性名查找

示例代码2(Recorder是追加写入):

from DrissionPage import ChromiumPage
from DataRecorder import Recorder  # 这个是追加写入
from time import sleep

# 创建页面对象

page = ChromiumPage()

# 创建记录器对象

recorder = Recorder('data.csv')
recorder.add_data(("标题", "导演", "上映时间", "评分"))

# 访问网页

page.get('https://www.maoyan.com/board/4')

while True:
    # 遍历页面上所有 dd 元素
    for mov in page.eles('t:dd'):
        # 获取须要的信息
        score = mov('.score').text
        title = mov('@data-act=boarditem-click').attr('title')
        star = mov('.star').text
        time = mov('.releasetime').text
        # 写入到记录器
        recorder.add_data((title, star, time, score))
    sleep(1)
    # 获取下一页按钮,有就点击
    btn = page('下一页', timeout=2)
    if btn:
        btn.click()
        page.wait.load_start()
    # 没有则退出程序
    else:
        break
recorder.record()

收发数据包,导入SessionPage

from DrissionPage import SessionPage

示例代码:

from DrissionPage import SessionPage
 
# 创建页面对象
page = SessionPage()
 
# 爬取前5页
for i in range(1, 6):
    page.get(f'https://gitee.com/explore/all?page={i}')
    # 获取所有开源库元素列表
    links = page.eles('.title project-namespace-path')    # 页面对象的eles()获取页面中所有class属性为'title project-namespace-path'的元素对象,eles()方法用于查找多个符合条件的元素,返回由它们组成的list
    # 遍历所有元素
    for link in links:
        # 打印链接信息
        print(f"{link.text}:{link.link}")    # .text获取元素的文本,.link获取元素的href或src属性

 下载网页

from DrissionPage import SessionPage

url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
save_path = r'images'  # 保存的路径,当前的项目路径,如为空则保存在与py同目录

page = SessionPage()
page.download(url, save_path, 'img')  # 支持重命名,处理文件名冲突,img是图片名字

DrissionPage事件

元素定位查找

# 根据属性查找,@ 后面可跟任意属性
page.ele('@id:ele_id', timeout=2)  # 查找 id 为 ele_id 的元素,设置等待时间2秒  
page.eles('@class')  # 查找所有拥有 class 属性的元素
page.eles('@class:class_name')  # 查找所有 class 含有 ele_class 的元素 
page.eles('@class=class_name')  # 查找所有 class 等于 ele_class 的元素 
 
# 根据 class 或 id 查找
page.ele('#ele_id')  # 等价于 page.ele('@id=ele_id')
page.ele('#:ele_id')  # 等价于 page.ele('@id:ele_id')
page.ele('.ele_class')  # 等价于 page.ele('@class=ele_class')
page.ele('.:ele_class')  # 等价于 page.ele('@class:ele_class')
 
# 根据 tag name 查找
page.ele('tag:li')  # 查找第一个 li 元素  
page.eles('tag:li')  # 查找所有 li 元素  
 
# 根据 tag name 及属性查找
page.ele('tag:div@class=div_class')  # 查找 class 为 div_class 的 div 元素
page.ele('tag:div@class:ele_class') # 查找 class 含有 ele_class 的 div 元素
page.ele('tag:div@class=ele_class') # 查找 class 等于 ele_class 的 div 元素
page.ele('tag:div@text():search_text') # 查找文本含有 search_text 的 div 元素
page.ele('tag:div@text()=search_text') # 查找文本等于 search_text 的 div 元素
 
# 根据文本内容查找
page.ele('search text')  # 查找包含传入文本的元素  
page.eles('text:search text')  # 如文本以 @、tag:、css:、xpath:、text: 开头,则应在前加上 text: 避免冲突  
page.eles('text=search text')  # 文本等于 search_text 的元素
 
# 根据 xpath 或 css selector 查找
page.eles('xpath://div[@class="ele_class"]')  
page.eles('css:div.ele_class')  
 
# 根据 loc 查找
loc1 = By.ID, 'ele_id'
loc2 = By.XPATH, '//div[@class="ele_class"]'
page.ele(loc1)
page.ele(loc2)
 
# 查找下级元素
element = page.ele('@id:ele_id')
element.ele('@class:class_name')  # 在 element 下级查找第一个 class 为 ele_class 的元素
element.eles('tag:li')  # 在 ele_id 下级查找所有li元素
 
# 根据位置查找
element.parent  # 父元素  
element.next  # 下一个兄弟元素  
element.prev  # 上一个兄弟元素  
 
# 获取 shadow-root,把它作为元素对待。只支持 open 的 shadow-root
ele1 = element.shadow_root.ele('tag:div')
 
# 串连查找
page.ele('@id:ele_id').ele('tag:div').next.ele('some text').eles('tag:a')
 
# 简化写法
eles = page('@id:ele_id')('tag:div').next('some text').eles('tag:a')
ele2 = ele1('tag:li').next('some text')

 元素操作

element.click(by_js)  # 点击元素,可选择是否用 js 方式点击
element.input(value)  # 输入文本
element.run_script(js)  # 对元素运行 JavaScript 脚本
element.submit()  # 提交
element.clear()  # 清空元素
element.screenshot(path, filename)  # 对元素截图
element.select(text)  # 根据文本选择下拉列表
element.set_attr(attr, value)  # 设置元素属性值
element.remove_attr(attr)  # 删除属性
element.drag(x, y, speed, shake)  # 拖动元素相对距离,可设置速度和是否随机抖动
element.drag_to(ele_or_loc, speed, shake)  # 拖动元素到另一个元素或某个坐标,可设置速度和是否随机抖动
element.hover()  # 在元素上悬停鼠标

获取元素属性 

element.html  # 返回元素 outerHTML
element.inner_html  # 返回元素 innerHTML
element.tag  # 返回元素 tag name
element.text  # 返回元素 innerText 值
element.comments  # 返回元素内注释列表
element.link  # 返回元素 href 或 src 绝对 url
element.texts()  # 返回元素内所有直接子节点的文本,包括元素和文本节点,可指定只返回文本节点
element.attrs  # 返回元素所有属性的字典
element.attr(attr)  # 返回元素指定属性的值
element.css_path  # 返回元素绝对 css 路径
element.xpath  # 返回元素绝对 xpath 路径
element.parent  # 返回元素父元素
element.next  # 返回元素后一个兄弟元素
element.prev  # 返回元素前一个兄弟元素
element.parents(num)  # 返回第 num 级父元素
element.nexts(num, mode)  # 返回后面第几个元素或节点
element.prevs(num, mode)  # 返回前面第几个元素或节点
element.ele(loc_or_str, timeout)  # 返回当前元素下级第一个符合条件的子元素、属性或节点文本
element.eles(loc_or_str, timeout)  # 返回当前元素下级所有符合条件的子元素、属性或节点文本

你可能感兴趣的:(python,开发语言,自动化)