DrissionPage自动化框架学习

news/发布时间2024/5/20 11:46:10

DrissionPage学习

官网:http://drissionpage.cn/features/intimate/

自动化测试框架:DrissionPage

1.DrissionPage事件

1.1元素定位查找

# 根据属性查找,@ 后面可跟任意属性
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')

1.2元素操作

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()  # 在元素上悬停鼠标

1.3获取元素属性

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)  # 返回当前元素下级所有符合条件的子元素、属性或节点文本

2.DrissionPage基本使用

2.1控制浏览器,导入ChromiumPage

from DrissionPage import ChromiumPage

2.1.1 示例代码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.1.2示例代码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').texttitle = mov('@data-act=boarditem-click').attr('title')star = mov('.star').texttime = 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()

2.1.3 示例代码3

#抓取震坤行商品
from DrissionPage import  ChromiumPage
import  timepage = ChromiumPage()
# page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的# 跳转到震坤行页面
page.get('https://www.zkh.com/?utm_source=baidu&utm_medium=CPT')
time.sleep(1)
page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/div[1]/input').input("口罩")
time.sleep(1)
page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/button').click()
# page.to_tab(page.latest_tab)  goods-titlewhile True:page.wait.load_start()page.scroll.to_location(0,10000) #滚动到指定位置time.sleep(0.5)page.scroll.to_location(0, 10000)time.sleep(0.5)page.scroll.to_location(0, 10000)time.sleep(0.5)divs=page.eles('xpath://div[@class="goods-name clamp2"]')for i in divs:title = i.attr('title')print(title)

2.2收发数据包,导入SessionPage

from DrissionPage import SessionPage

2.2.1示例代码:

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

2.2.2下载网页

from DrissionPage import SessionPageurl = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
save_path = r'images'  # 保存的路径,当前的项目路径,如为空则保存在与py同目录page = SessionPage()
page.download(url, save_path, 'img')  # 支持重命名,处理文件名冲突,img是图片名字

3.获取新窗口句柄

3.1.无需切入切出,逻辑清晰

使用过 selenium 的人都知道,selenium 同一时间只能操作一个标签页或<iframe>元素,要操作其它标签页,或<iframe>元素,需要用switch_to() 方法切换,操作后还要切换回来。如果是多级<iframe>,还要逐级切入,相当麻烦。

DrissionPage 则无需这些麻烦的操作,它把每个标签页和<iframe>都看作独立的对象,可以同时并发操作,而且可以直接跨多层<iframe>获取里面的元素,然后直接处理,非常方便。

对比一下,获取 2 层<iframe>内一个 id 为'div1'的元素:

# 使用 selenium
driver.switch_to.frame(0)
driver.switch_to.frame(0)
ele = driver.find_element(By.ID, 'div1')
driver.switch_to.default_content()# 使用 DrissionPage
ele = page('#div1')

多标签页同时操作,selenium 无此功能:

tab1 = page.get_tab(1)
tab2 = page.get_tab(2)tab1.get('https://www.baidu.com')
tab2.get('https://www.163.com')

3.2 示例代码1

#登录百度爬取
from DrissionPage import  ChromiumPage
import  timepage = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的# 跳转百度页面
page.get('https://www.baidu.com')
time.sleep(1)page.ele('xpath://*[@id="kw"]').input("宿舍")
time.sleep(1)
page.ele('xpath://*[@id="su"]').click()
time.sleep(1)
page.ele('xpath://*[@id="3"]/div/div[1]/h3/a').click()#切换到新页面
ab=page.get_tab(page.latest_tab) #获取新窗口页面句柄
# 等待页面跳转
page.wait.load_start()
# ab = page.geqwt_tab(0) #这样也可以获取新框框页面句柄print(ab.title) #获取页面标题
# exit()#切换到新页面
# ab=page.get_tab(1)
# page.get_tab(page.latest_tab)
# print(ab.title)
# page.get_tab(page.latest_tab)
# print(page.title)
# exit()time.sleep(1)
#通过用新窗口的句柄来进行操作
ab.ele('xpath:/html/body/div[1]/div[3]/form/div/input[4]').input("家")
ab.ele('xpath:/html/body/div[1]/div[3]/form/div/span').click()lis = ab.ele('xpath:/html/body/div[2]/div[1]/div/div[2]/ul')
# lis = page.ele('xpath://ul[@class="w4]')
# print(lis)
lis1 = lis.eles('tag:li')
for i in lis1:lis2 = i.eles('tag:a')for j in lis2:href=j.attr('href') #获取href属性值# title=i.text title=j.attr('title') #获取title属性值print(href,title)
time.sleep(4)
# ab.close()  #关闭当前页面 (这样也可以)
page.close_tabs(ab) #关闭当前页面# ac=page.get_tab(-1)
ac=page.get_tab(page.latest_tab) #将句柄调回原来的页面中
print(ac.title)
time.sleep(1)ac.ele('xpath://*[@id="6"]/div/div[1]/h3/a').click()time.sleep(2)
page.quit() #退出浏览器

4.与selenium对比

与selenium对比

4.1跳转到一个标签页

# 使用 selenium:
driver.switch_to.window(driver.window_handles[0])# 使用 DrissionPage:
tab = page.get_tab(1)

4.2按文本选择下拉列表

# 使用 selenium:
from selenium.webdriver.support.select import Select
select_element = Select(element)
select_element.select_by_visible_text('text')# 使用 DrissionPage:
element.select('text')

4.3拖拽一个元素

# 使用 selenium:
ActionChains(driver).drag_and_drop(ele1, ele2).perform()# 使用 DrissionPage:
ele1.drag_to(ele2)

4.4滚动窗口到底部(保持水平滚动条不变)

# 使用 selenium:
driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);")# 使用 DrissionPage:
page.scroll.to_bottom()

4.5设置 headless 模式

# 使用 selenium:
options = webdriver.ChromeOptions()
options.add_argument("--headless")# 使用 DrissionPage:
set_headless(True)

4.6获取伪元素内容

# 使用 selenium:
text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");', element)# 使用 DrissionPage:
text = element.pseudo.after

4.7用 xpath 直接获取属性或文本节点(返回文本)

# 使用 selenium:
相当复杂# 使用 DrissionPage:
class_name = element('xpath://div[@id="div_id"]/@class')
text = element('xpath://div[@id="div_id"]/text()[2]')

5.模式切换

http://drissionpage.cn/features/features_demos/change_mode/

用浏览器登录网站,然后切换到 requests 读取网页。两者会共享登录信息。

from DrissionPage import WebPage
from time import sleep# 创建页面对象,默认 d 模式
page = WebPage()  
# 访问个人中心页面(未登录,重定向到登录页面)
page.get('https://gitee.com/profile')  # 输入账号密码登录
page.ele('@id:user_login').input('your_user_name')  
page.ele('@id:user_password').input('your_password\n')
page.wait.load_start()# 切换到 s 模式
page.change_mode()  
# 登录后 session 模式的输出
print('登录后title:', page.title, '\n')  #输出:
登录后title: 个人资料 - 码云 Gitee.com

获取登录后的元素

# 接上段代码
foot = page.ele('#footer-left')  # 用 id 查找元素
first_col = foot.ele('css:>div')  # 使用 css selector 在元素的下级中查找元素(第一个)
lnk = first_col.ele('text:命令学')  # 使用文本内容查找元素
text = lnk.text  # 获取元素文本
href = lnk.attr('href')  # 获取元素属性值print(text, href, '\n')# 简洁模式串联查找
text = page('@id:footer-left')('css:>div')('text:命令学').text
print(text)#输出
Git 命令学习 https://oschina.gitee.io/learn-git-branching/Git 命令学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/61573107.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Nginx负载均衡、动静分离Tomcat案例实战

一、前言 1)Tomcat是一款开源的、免费的WEB软件服务器,是隶属于Apache基金会旗下的,主要是用于去发布网站代码、提供网页信息服务的。用户通过浏览器可以实现网站页面的访问。 2)Tomcat WEB软件默认可以处理静态网页(Apache、Nginx),同时也可以处理动态网页,主要是处理…

dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签

本文记录 WPF 在 dotnet 9 的一项 XAML 编写语法改进点,此改进点用于解决编写 Style 的 Setter 进行给 Value 赋值时,不能将 Value 当成默认内容,需要多写 Value 标签的问题。通过此改进点可减少两行 XAML 代码在原先的 WPF 版本里面,对 Style 的 Setter 填充复杂的对象内容…

WDS+MDT网络启动自动部署windows(十七)MDT中文变量,描述,组织单位OU

简介 这简直就是歧视,在MDT使用变量时,数据库设置时,居然不能用中文。 计算机描述,我将在数据库中设置为使用人,主要是其他地方也不方便看。 描述是存在注册表中的,未来自动化也将会使用使用人这个字段,用来注册OCS这样,有标签,使用人字段的软件。 方向 解决MDT/BDD无…

WDS+MDT网络启动自动部署windows(十六)计算机自动进入指定OU

简介 新装计算机总是在默认电脑,不方便配置终端计算机策略权限。 要想办法让MDT装好的计算机,自动进入指定组织单位OU。 dsquery 大概意思是 domain server query ,就是域服务器搜索的意思。 在域控执行 dsquery ou 先看看OU是怎么用LDAP表示的。 从左到右,OU,逐级的组…

OpenVX技术图例(二)

OpenVX技术图例(二) 参考文献链接 https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/index.html人工智能芯片与自动驾驶

Linux Shell 脚本专题

本文介绍了Linux Shell环境变量和脚本使用的常用知识点。V1.0 2024年5月8日 发布于博客园目录常用环境变量一、环境变量的概念1、环境变量的含义2、环境变量的分类3、Linux环境变量二、常用的环境变量1、查看环境变量2、常用的环境变量三、设置环境量1、系统环境变量2、用户环境…