翼度科技»论坛 编程开发 python 查看内容

DrissionPage自动化框架学习

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
DrissionPage学习

官网:http://drissionpage.cn/features/intimate/
自动化测试框架:DrissionPage
1.DrissionPage事件

1.1元素定位查找
  1. # 根据属性查找,@ 后面可跟任意属性
  2. page.ele('@id:ele_id', timeout=2)  # 查找 id 为 ele_id 的元素,设置等待时间2秒  
  3. page.eles('@class')  # 查找所有拥有 class 属性的元素
  4. page.eles('@class:class_name')  # 查找所有 class 含有 ele_class 的元素
  5. page.eles('@class=class_name')  # 查找所有 class 等于 ele_class 的元素
  6. # 根据 class 或 id 查找
  7. page.ele('#ele_id')  # 等价于 page.ele('@id=ele_id')
  8. page.ele('#:ele_id')  # 等价于 page.ele('@id:ele_id')
  9. page.ele('.ele_class')  # 等价于 page.ele('@class=ele_class')
  10. page.ele('.:ele_class')  # 等价于 page.ele('@class:ele_class')
  11. # 根据 tag name 查找
  12. page.ele('tag:li')  # 查找第一个 li 元素  
  13. page.eles('tag:li')  # 查找所有 li 元素  
  14. # 根据 tag name 及属性查找
  15. page.ele('tag:div@class=div_class')  # 查找 class 为 div_class 的 div 元素
  16. page.ele('tag:div@class:ele_class') # 查找 class 含有 ele_class 的 div 元素
  17. page.ele('tag:div@class=ele_class') # 查找 class 等于 ele_class 的 div 元素
  18. page.ele('tag:div@text():search_text') # 查找文本含有 search_text 的 div 元素
  19. page.ele('tag:div@text()=search_text') # 查找文本等于 search_text 的 div 元素
  20. # 根据文本内容查找
  21. page.ele('search text')  # 查找包含传入文本的元素  
  22. page.eles('text:search text')  # 如文本以 @、tag:、css:、xpath:、text: 开头,则应在前加上 text: 避免冲突  
  23. page.eles('text=search text')  # 文本等于 search_text 的元素
  24. # 根据 xpath 或 css selector 查找
  25. page.eles('xpath://div[@]')  
  26. page.eles('css:div.ele_class')  
  27. # 根据 loc 查找
  28. loc1 = By.ID, 'ele_id'
  29. loc2 = By.XPATH, '//div[@]'
  30. page.ele(loc1)
  31. page.ele(loc2)
  32. # 查找下级元素
  33. element = page.ele('@id:ele_id')
  34. element.ele('@class:class_name')  # 在 element 下级查找第一个 class 为 ele_class 的元素
  35. element.eles('tag:li')  # 在 ele_id 下级查找所有li元素
  36. # 根据位置查找
  37. element.parent  # 父元素  
  38. element.next  # 下一个兄弟元素  
  39. element.prev  # 上一个兄弟元素  
  40. # 获取 shadow-root,把它作为元素对待。只支持 open 的 shadow-root
  41. ele1 = element.shadow_root.ele('tag:div')
  42. # 串连查找
  43. page.ele('@id:ele_id').ele('tag:div').next.ele('some text').eles('tag:a')
  44. # 简化写法
  45. eles = page('@id:ele_id')('tag:div').next('some text').eles('tag:a')
  46. ele2 = ele1('tag:li').next('some text')
复制代码
1.2元素操作
  1. element.click(by_js)  # 点击元素,可选择是否用 js 方式点击
  2. element.input(value)  # 输入文本
  3. element.run_script(js)  # 对元素运行 JavaScript 脚本
  4. element.submit()  # 提交
  5. element.clear()  # 清空元素
  6. element.screenshot(path, filename)  # 对元素截图
  7. element.select(text)  # 根据文本选择下拉列表
  8. element.set_attr(attr, value)  # 设置元素属性值
  9. element.remove_attr(attr)  # 删除属性
  10. element.drag(x, y, speed, shake)  # 拖动元素相对距离,可设置速度和是否随机抖动
  11. element.drag_to(ele_or_loc, speed, shake)  # 拖动元素到另一个元素或某个坐标,可设置速度和是否随机抖动
  12. element.hover()  # 在元素上悬停鼠标
复制代码
1.3获取元素属性
  1. element.html  # 返回元素 outerHTML
  2. element.inner_html  # 返回元素 innerHTML
  3. element.tag  # 返回元素 tag name
  4. element.text  # 返回元素 innerText 值
  5. element.comments  # 返回元素内注释列表
  6. element.link  # 返回元素 href 或 src 绝对 url
  7. element.texts()  # 返回元素内所有直接子节点的文本,包括元素和文本节点,可指定只返回文本节点
  8. element.attrs  # 返回元素所有属性的字典
  9. element.attr(attr)  # 返回元素指定属性的值
  10. element.css_path  # 返回元素绝对 css 路径
  11. element.xpath  # 返回元素绝对 xpath 路径
  12. element.parent  # 返回元素父元素
  13. element.next  # 返回元素后一个兄弟元素
  14. element.prev  # 返回元素前一个兄弟元素
  15. element.parents(num)  # 返回第 num 级父元素
  16. element.nexts(num, mode)  # 返回后面第几个元素或节点
  17. element.prevs(num, mode)  # 返回前面第几个元素或节点
  18. element.ele(loc_or_str, timeout)  # 返回当前元素下级第一个符合条件的子元素、属性或节点文本
  19. element.eles(loc_or_str, timeout)  # 返回当前元素下级所有符合条件的子元素、属性或节点文本
复制代码
2.DrissionPage基本使用

2.1控制浏览器,导入ChromiumPage:

from DrissionPage import ChromiumPage
2.1.1 示例代码1:
  1. from DrissionPage import ChromiumPage
  2. # 创建页面对象,并启动或接管浏览器
  3. page = ChromiumPage()
  4. # 跳转到登录页面
  5. page.get('https://gitee.com/login')    # get()方法用于访问参数中的网址。它会等待页面完全加载,再继续执行后面的代码。
  6. # 定位到账号文本框
  7. ele = page.ele('#user_login')    # ele()方法用于查找元素,'#user_login'是定位符文本,#意思是按id属性查找元素。ele()内置了等待,如果元素未加载,它会执行等待,直到元素出现或到达时限。默认超时时间 10 秒。
  8. # 输入对文本框输入账号
  9. ele.input('账号')
  10. # 定位到密码文本框并输入密码
  11. page.ele('#user_password').input('密码')
  12. # 点击登录按钮
  13. page.ele('@value=登 录').click()    # @表示按属性名查找
复制代码
2.1.2示例代码2(Recorder是追加写入):
  1. from DrissionPage import ChromiumPage
  2. from DataRecorder import Recorder  # 这个是追加写入
  3. from time import sleep
  4. # 创建页面对象
  5. page = ChromiumPage()
  6. # 创建记录器对象
  7. recorder = Recorder('data.csv')
  8. recorder.add_data(("标题", "导演", "上映时间", "评分"))
  9. # 访问网页
  10. page.get('https://www.maoyan.com/board/4')
  11. while True:
  12.     # 遍历页面上所有 dd 元素
  13.     for mov in page.eles('t:dd'):
  14.         # 获取须要的信息
  15.         score = mov('.score').text
  16.         title = mov('@data-act=boarditem-click').attr('title')
  17.         star = mov('.star').text
  18.         time = mov('.releasetime').text
  19.         # 写入到记录器
  20.         recorder.add_data((title, star, time, score))
  21.     sleep(1)
  22.     # 获取下一页按钮,有就点击
  23.     btn = page('下一页', timeout=2)
  24.     if btn:
  25.         btn.click()
  26.         page.wait.load_start()
  27.     # 没有则退出程序
  28.     else:
  29.         break
  30. recorder.record()
复制代码
2.1.3 示例代码3
  1. #抓取震坤行商品
  2. from DrissionPage import  ChromiumPage
  3. import  time
  4. page = ChromiumPage()
  5. # page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的
  6. # 跳转到震坤行页面
  7. page.get('https://www.zkh.com/?utm_source=baidu&utm_medium=CPT')
  8. time.sleep(1)
  9. page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/div[1]/input').input("口罩")
  10. time.sleep(1)
  11. page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/button').click()
  12. # page.to_tab(page.latest_tab)  goods-title
  13. while True:
  14.     page.wait.load_start()
  15.     page.scroll.to_location(0,10000) #滚动到指定位置
  16.     time.sleep(0.5)
  17.     page.scroll.to_location(0, 10000)
  18.     time.sleep(0.5)
  19.     page.scroll.to_location(0, 10000)
  20.     time.sleep(0.5)
  21.     divs=page.eles('xpath://div[@]')
  22.     for i in divs:
  23.         title = i.attr('title')
  24.         print(title)
复制代码
2.2收发数据包,导入SessionPage:

from DrissionPage import SessionPage
2.2.1示例代码:
  1. from DrissionPage import SessionPage
  2. # 创建页面对象
  3. page = SessionPage()
  4. # 爬取前5页
  5. for i in range(1, 6):
  6.     page.get(f'https://gitee.com/explore/all?page={i}')
  7.     # 获取所有开源库<a>元素列表
  8.     links = page.eles('.title project-namespace-path')    # 页面对象的eles()获取页面中所有class属性为'title project-namespace-path'的元素对象,eles()方法用于查找多个符合条件的元素,返回由它们组成的list
  9.     # 遍历所有<a>元素
  10.     for link in links:
  11.         # 打印链接信息
  12.         print(f"{link.text}:{link.link}")    # .text获取元素的文本,.link获取元素的href或src属性
复制代码
2.2.2下载网页
  1. from DrissionPage import SessionPage
  2. url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
  3. save_path = r'images'  # 保存的路径,当前的项目路径,如为空则保存在与py同目录
  4. page = SessionPage()
  5. page.download(url, save_path, 'img')  # 支持重命名,处理文件名冲突,img是图片名字
复制代码
3.获取新窗口句柄

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

使用过 selenium 的人都知道,selenium 同一时间只能操作一个标签页或元素,要操作其它标签页,或元素,需要用switch_to() 方法切换,操作后还要切换回来。如果是多级,还要逐级切入,相当麻烦。
DrissionPage 则无需这些麻烦的操作,它把每个标签页和都看作独立的对象,可以同时并发操作,而且可以直接跨多层获取里面的元素,然后直接处理,非常方便。
对比一下,获取 2 层内一个 id 为'div1'的元素:
  1. # 使用 selenium
  2. driver.switch_to.frame(0)
  3. driver.switch_to.frame(0)
  4. ele = driver.find_element(By.ID, 'div1')
  5. driver.switch_to.default_content()
  6. # 使用 DrissionPage
  7. ele = page('#div1')
复制代码
多标签页同时操作,selenium 无此功能:
  1. tab1 = page.get_tab(1)
  2. tab2 = page.get_tab(2)
  3. tab1.get('https://www.baidu.com')
  4. tab2.get('https://www.163.com')
复制代码
3.2 示例代码1
  1. #登录百度爬取
  2. from DrissionPage import  ChromiumPage
  3. import  time
  4. page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的
  5. # 跳转百度页面
  6. page.get('https://www.baidu.com')
  7. time.sleep(1)
  8. page.ele('xpath://*[@id="kw"]').input("宿舍")
  9. time.sleep(1)
  10. page.ele('xpath://*[@id="su"]').click()
  11. time.sleep(1)
  12. page.ele('xpath://*[@id="3"]/div/div[1]/h3/a').click()
  13. #切换到新页面
  14. ab=page.get_tab(page.latest_tab) #获取新窗口页面句柄
  15. # 等待页面跳转
  16. page.wait.load_start()
  17. # ab = page.geqwt_tab(0) #这样也可以获取新框框页面句柄
  18. print(ab.title) #获取页面标题
  19. # exit()
  20. #切换到新页面
  21. # ab=page.get_tab(1)
  22. # page.get_tab(page.latest_tab)
  23. # print(ab.title)
  24. # page.get_tab(page.latest_tab)
  25. # print(page.title)
  26. # exit()
  27. time.sleep(1)
  28. #通过用新窗口的句柄来进行操作
  29. ab.ele('xpath:/html/body/div[1]/div[3]/form/div/input[4]').input("家")
  30. ab.ele('xpath:/html/body/div[1]/div[3]/form/div/span').click()
  31. lis = ab.ele('xpath:/html/body/div[2]/div[1]/div/div[2]/ul')
  32. # lis = page.ele('xpath://ul[@6"]/div/div[1]/h3/a').click()
  33. time.sleep(2)
  34. page.quit() #退出浏览器
复制代码
4.与selenium对比

与selenium对比
4.1跳转到一个标签页
  1. # 使用 selenium:
  2. driver.switch_to.window(driver.window_handles[0])
  3. # 使用 DrissionPage:
  4. tab = page.get_tab(1)
复制代码
4.2按文本选择下拉列表
  1. # 使用 selenium:
  2. from selenium.webdriver.support.select import Select
  3. select_element = Select(element)
  4. select_element.select_by_visible_text('text')
  5. # 使用 DrissionPage:
  6. element.select('text')
复制代码
4.3拖拽一个元素
  1. # 使用 selenium:
  2. ActionChains(driver).drag_and_drop(ele1, ele2).perform()
  3. # 使用 DrissionPage:
  4. ele1.drag_to(ele2)
复制代码
4.4滚动窗口到底部(保持水平滚动条不变)
  1. # 使用 selenium:
  2. driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);")
  3. # 使用 DrissionPage:
  4. page.scroll.to_bottom()
复制代码
4.5设置 headless 模式
  1. # 使用 selenium:
  2. options = webdriver.ChromeOptions()
  3. options.add_argument("--headless")
  4. # 使用 DrissionPage:
  5. set_headless(True)
复制代码
4.6获取伪元素内容
  1. # 使用 selenium:
  2. text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");', element)
  3. # 使用 DrissionPage:
  4. text = element.pseudo.after
复制代码
4.7用 xpath 直接获取属性或文本节点(返回文本)
  1. # 使用 selenium:
  2. 相当复杂
  3. # 使用 DrissionPage:
  4. class_name = element('xpath://div[@id="div_id"]/@class')
  5. text = element('xpath://div[@id="div_id"]/text()[2]')
复制代码
5.模式切换

http://drissionpage.cn/features/features_demos/change_mode/
用浏览器登录网站,然后切换到 requests 读取网页。两者会共享登录信息。
  1. from DrissionPage import WebPage
  2. from time import sleep
  3. # 创建页面对象,默认 d 模式
  4. page = WebPage()  
  5. # 访问个人中心页面(未登录,重定向到登录页面)
  6. page.get('https://gitee.com/profile')  
  7. # 输入账号密码登录
  8. page.ele('@id:user_login').input('your_user_name')  
  9. page.ele('@id:user_password').input('your_password\n')
  10. page.wait.load_start()
  11. # 切换到 s 模式
  12. page.change_mode()  
  13. # 登录后 session 模式的输出
  14. print('登录后title:', page.title, '\n')  
  15. #输出:
  16. 登录后title: 个人资料 - 码云 Gitee.com
复制代码
获取登录后的元素
  1. # 接上段代码
  2. foot = page.ele('#footer-left')  # 用 id 查找元素
  3. first_col = foot.ele('css:>div')  # 使用 css selector 在元素的下级中查找元素(第一个)
  4. lnk = first_col.ele('text:命令学')  # 使用文本内容查找元素
  5. text = lnk.text  # 获取元素文本
  6. href = lnk.attr('href')  # 获取元素属性值
  7. print(text, href, '\n')
  8. # 简洁模式串联查找
  9. text = page('@id:footer-left')('css:>div')('text:命令学').text
  10. print(text)
  11. #输出
  12. Git 命令学习 https://oschina.gitee.io/learn-git-branching/
  13. Git 命令学习
复制代码
-->                        收藏                                    关注                                    评论
来源:https://www.cnblogs.com/yin-jihu/p/18181857
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具