51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 717|回复: 1
打印 上一主题 下一主题

[selenium] 超越 Selenium 的自动化精灵 ——DrissionPage:语法探秘与实战华章

[复制链接]
  • TA的每日心情

    前天 09:25
  • 签到天数: 76 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 6 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、DrissionPage 的崛起之路
    在当今互联网高速发展的时代,网页数据的获取和处理变得愈发重要。传统的自动化工具如 Selenium 在某些方面逐渐显露出一些局限性,而 DrissionPage 正是在这样的背景下崭露头角。
    DrissionPage 的发展历程充满了创新与突破。它最初的设计理念是将浏览器自动化和数据包操控相结合,以解决传统工具在面对复杂网页交互和反爬机制时的不足。从早期的版本开始,DrissionPage 就致力于为开发者提供一种更高效、更便捷的网页自动化解决方案。
    在发展过程中,DrissionPage 不断优化和改进自身的功能。它摆脱了对 Selenium 的依赖,从 3.0 版本开始,作者另起炉灶,用 chromium 协议自行实现了类似 Selenium 的全部功能,并且在此基础上增加了许多独特的特性。例如,无 webdriver 特征使得它更难被网站识别,减少了被阻止或限制访问的风险。
    同时,DrissionPage 还在易用性方面下足了功夫。与其他需要针对不同浏览器版本下载对应驱动的工具不同,它简化了配置过程,使得设置和使用变得更加简单快捷。官方文档详细介绍了安装、配置以及使用方法,为开发者提供了丰富的学习资源。
    随着技术的不断进步,DrissionPage 的功能也在不断拓展。它不仅可以用于自动化测试,还在爬虫开发等领域展现出强大的潜力。无论是处理复杂的表单交互,还是绕过前端的一些限制,DrissionPage 都能发挥出重要作用。
    总之,DrissionPage 以其独特的设计理念和不断创新的精神,在自动化爬虫领域逐渐崛起,为开发者带来了全新的体验和更多的可能性。


    二、DrissionPage 对比 Selenium 的优势
    (一)简单易用与语法设计
    DrissionPage 的语法简洁明了,代码量少,对新手极为友好。相比 Selenium 较为复杂的语法结构,DrissionPage 采用了更直观的方式进行元素定位和操作。例如,使用 “#” 符号可以快速定位 id 属性,“.” 符号用于匹配 class 属性,而 “tag” 可以匹配特定的标签。这种简洁的语法设计使得开发者能够更快速地编写代码,降低了学习成本。新手在使用 DrissionPage 时,能够更快地上手,无需花费大量时间去理解复杂的语法规则。
    (二)高效稳定
    DrissionPage 在运行速度方面表现出色,比 Selenium 更快。它可以跨 iframe 查找元素,无需频繁地切入切出,将 iframe 看作普通元素,获取后可直接在其中查找元素,逻辑更加清晰。此外,DrissionPage 内置了等待和自动重试功能。当网络不稳定时,这些功能使得程序更稳定,编写更省心。等待功能可以确保程序在特定条件满足后再继续执行,自动重试功能则在操作失败时自动尝试再次执行,提高了程序的可靠性。
    (三)多浏览器支持
    DrissionPage 支持多种浏览器,尤其是 Chromium 内核的浏览器如 Chrome 和 Edge 等。这使得开发者可以根据自己的需求选择合适的浏览器进行自动化测试和爬虫开发。无论在 Windows、Linux 还是 Mac 系统上,DrissionPage 都能良好地运行,为跨平台开发提供了便利。
    (四)元素定位与操作
    在元素定位和操作方面,DrissionPage 提供了丰富的方法。它不仅兼容 css selector、xpath、selenium 原生的 loc 元组,还提供了一套简洁易用的语法。例如,可以根据 DOM 结构相对定位,也可以根据页面布局位置相对定位。同时,支持链式查找,减少了代码的复杂性,使得开发者能够更高效地定位和操作元素。
    (五)并发与并行测试
    DrissionPage 在并发和并行测试方面也有一定的能力。它可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,也无需切换。这对于需要同时处理多个任务的场景非常有用,可以大大提高测试和数据抓取的效率。
    (六)无 WebDriver 特征
    DrissionPage 的无 webdriver 特征带来了诸多好处。不会被网站识别,无需为不同版本的浏览器下载不同的驱动,减少了被阻止或限制访问的风险。这使得开发者在进行自动化测试和爬虫开发时更加隐蔽,提高了成功率。
    (七)跨平台能力
    DrissionPage 具有强大的跨平台能力,可以在 Windows、Linux 和 Mac 等不同操作系统上运行。这为开发者提供了更大的灵活性,无论在哪个平台上,都能享受到 DrissionPage 带来的高效和便捷。无论是进行网页自动化测试还是爬虫开发,都能轻松应对不同平台的需求。


    三、DrissionPage 的安装与配置
    (一)安装步骤
    安装 DrissionPage 非常简单,只需使用 pip 命令即可。具体步骤如下:
    打开命令提示符或终端窗口。
    输入命令pip install drission-page并执行。这个过程可能需要一些时间,具体取决于网络速度和系统性能。
    安装完成后,可以通过导入 DrissionPage 库来验证是否安装成功。例如,在 Python 脚本中输入以下代码:
    1. <font face="微软雅黑" size="3">from drission import Drission
    2. print("DrissionPage 库安装成功!")</font>
    复制代码
    如果想要安装特定版本的 DrissionPage,可以使用以下命令:
    pip install DrissionPage==版本号,例如pip install DrissionPage==4.0.0b17。


    (二)基本配置
    安装完成后,你可以根据项目需求进行基本配置。DrissionPage 支持以下几种常见的配置方式:
    1. 浏览器模式配置:
    可以指定使用的浏览器驱动(如 ChromeDriver),以及其他 Selenium 配置项。例如,可以设置无头模式和禁用 GPU 加速,以提高性能。以下是配置的代码示例:
    1. <font face="微软雅黑" size="3">from drission import DrissionPage
    2. # 初始化 DrissionPage
    3. dp = DrissionPage()
    4. # 配置浏览器模式
    5. dp.browser.options.add_argument('--headless') # 无头模式
    6. dp.browser.options.add_argument('--disable-gpu') # 禁用 GPU 加速</font>
    复制代码
    2. 无浏览器模式配置:
    可以设置 requests 的请求头、超时、重试等选项。例如,可以设置自定义的请求头,以模拟不同的用户代理。以下是配置的代码示例:
    1. <font face="微软雅黑" size="3">from drission import DrissionPage
    2. dp = DrissionPage()
    3. # 配置无浏览器模式
    4. dp.requests.headers = {'User-Agent': 'Mozilla/5.0'}
    5. dp.requests.timeout = 10</font>
    复制代码
    通过这些配置,可以根据不同的项目需求,灵活地调整 DrissionPage 的行为,以满足各种网页抓取和自动化测试的需求。
    四、DrissionPage 的语法解析
    (一)页面访问与切换
    DrissionPage 提供了统一的接口用于页面访问,无论是在浏览器模式还是无浏览器模式下,使用方式都十分简洁。在无浏览器模式下,通过response = dp.get('https://example.com')可以快速访问页面并获取响应内容,然后使用print(response.text)输出文本内容。而切换到浏览器模式访问页面时,先使用dp.use_browser_mode(),再执行dp.get('https://example.com'),最后可以通过print(dp.page_source)打印页面源代码。这种简洁的方式使得开发者可以根据不同需求轻松切换页面访问模式。


    (二)元素定位与操作
    DrissionPage 继承了 Selenium 的所有功能,在元素定位与操作方面表现出色。一方面,可以使用标准的 Selenium 方法进行元素定位与操作。例如在浏览器模式下,先dp.use_browser_mode()和dp.get('https://example.com'),然后通过element = dp.ele('#element_id')定位元素,再使用element.click()点击元素。另一方面,DrissionPage 还提供了一些简化的 API,使得操作更加便捷。在无浏览器模式下抓取数据时,使用dp.use_requests_mode()后执行response = dp.get('https://example.com'),最后通过print(response.text)获取页面文本内容。


    (三)表单操作与文件上传
    在表单操作方面,DrissionPage 提供了便捷方法,让开发者可以轻松地模拟用户提交表单的过程。首先使用dp.use_browser_mode()进入浏览器模式,然后通过dp.get('https://example.com/login')访问登录页面。接着使用dp.ele('#username').input('your_username')输入表单数据,再用dp.ele('#password').input('your_password')输入密码。最后通过dp.ele('#login_button').click()提交表单。在文件上传方面,同样在浏览器模式下,先访问上传页面dp.get('https://example.com/upload'),然后使用dp.ele('#file_input').send_keys('/path/to/your/file')选择要上传的文件,最后通过dp.ele('#submit_button').click()点击提交按钮完成文件上传。


    (四)页面导航与跳转
    DrissionPage 提供了处理多窗口、多页面的 API,能够轻松实现页面导航与跳转。在自动化测试中,常常需要处理页面之间的跳转和导航。首先使用dp.use_browser_mode()进入浏览器模式并访问页面dp.get('https://example.com')。要打开新页面并切换到新页面,可以使用dp.run_script('window.open(\"https://example2.com\");')和dp.switch_to_window(1)。如果要关闭当前页面并返回原页面,可以使用dp.close()和dp.switch_to_window(0)进行切换。


    (五)JavaScript 执行
    对于某些复杂的网页操作,直接执行 JavaScript 代码可能更加有效。DrissionPage 支持通过 Selenium 直接执行 JavaScript。先使用dp.use_browser_mode()进入浏览器模式并访问页面dp.get('https://example.com'),然后通过dp.run_script('document.title = \"New Title\";')执行 JavaScript 代码,实现修改页面标题等复杂操作。




    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情

    前天 09:25
  • 签到天数: 76 天

    连续签到: 1 天

    [LV.6]测试旅长

    2#
     楼主| 发表于 6 天前 | 只看该作者
    五、DrissionPage 的应用实战

    (一)网页自动化测试
    DrissionPage 在网页自动化测试中表现出色。例如,可以模拟用户在网页上的各种操作,如点击按钮、填写表单、验证页面元素等。假设我们要测试一个电商网站的购物流程,可以使用 DrissionPage 来实现以下步骤:
    打开电商网站页面,使用page = ChromiumPage()创建页面对象,然后通过page.get('电商网站网址')访问页面。
    定位到商品搜索框,使用page.ele('#search_box').input('商品名称')输入要搜索的商品名称,接着点击搜索按钮page.ele('@value=搜索').click()。
    从搜索结果中定位到目标商品,如product = page.ele('.product_item'),然后点击商品链接进入商品详情页。
    在商品详情页,验证商品信息是否正确,如价格、描述等。可以使用page.ele('#price').text获取商品价格,page.ele('#description').text获取商品描述。
    点击加入购物车按钮,page.ele('@value=加入购物车').click(),然后验证购物车图标是否显示正确的商品数量。
    通过这样的自动化测试,可以快速、准确地验证网页的功能是否正常,提高测试效率和质量。


    (二)数据抓取
    DrissionPage 在数据抓取方面具有很大的优势。它可以无缝切换 Selenium 的浏览器驱动和 Requests 的会话,根据不同的需求选择最合适的方式进行数据抓取。例如,对于静态页面数据抓取,可以使用 Requests 的会话模式,速度快、效率高。而对于需要渲染 JavaScript 生成的动态内容的页面,可以使用 Selenium 的浏览器驱动模式,确保能够获取完整的页面数据。


    具体方法如下:

    1.对于静态页面数据抓取,可以使用以下代码:
    1. <font face="微软雅黑" size="3">   from DrissionPage import SessionPage
    2. page = SessionPage()
    3. page.get('静态页面网址')
    4. data = page.eles('.data_item')
    5. for item in data:
    6. print(item.text)</font>
    复制代码
    2.对于动态页面数据抓取,可以使用以下代码:
    1. <font face="微软雅黑" size="3">   from DrissionPage import WebPage
    2. page = WebPage()
    3. page.get('动态页面网址')
    4. page.wait_for_element('#data_container')
    5. data = page.ele('#data_container').text
    6. print(data)</font>
    复制代码
    (三)网页动态数据抓取
    处理动态网页数据抓取是 DrissionPage 的强项之一。动态网页通常需要通过 JavaScript 加载数据,使用 DrissionPage 的浏览器模式可以有效地解决这个问题。例如,在抓取一些新闻网站的实时新闻时,页面会不断更新新的新闻内容,这就需要使用 DrissionPage 的浏览器模式来等待页面加载完成并抓取数据。
    具体步骤如下:
    使用page = WebPage()创建页面对象,然后通过page.get('新闻网站网址')访问页面。
    使用page.wait_for_element('#news_container')等待新闻容器元素加载完成。
    使用news_items = page.eles('.news_item')获取所有新闻项元素。
    遍历新闻项元素,提取新闻标题、内容和发布时间等信息。例如:
    1. <font face="微软雅黑" size="3">   for item in news_items:

    2. title = item.ele('.title').text

    3. content = item.ele('.content').text

    4. time = item.ele('.time').text

    5. print(f'标题:{title},内容:{content},发布时间:{time}')</font>
    复制代码




    六、超越 Selenium 的其他神器
    除了 DrissionPage 之外,还有一些其他的自动化爬虫神器也在逐渐超越 Selenium,其中 Pyppeteer 就是一个非常出色的代表。
    Pyppeteer 是 Puppeteer 的 Python 版本,它操作的是一个类似 Chrome 的 Chromium 浏览器。Chromium 是相当于 Chrome 的开发版,包含很多新功能。当我们第一次运行 Pyppeteer 的时候,如果 Chromium 没有安装,程序会自动帮我们安装和配置,省去了环境配置这一步。
    安装 Pyppeteer 非常简单,使用pip install pyppeteer命令就能完成安装。由于 Pyppeteer 采用了 async 机制,所以必须使用 Python 3.5 及以上版本。
    在使用时,我们可以通过以下代码来抓取豆瓣电影排行榜的数据:
    1. <font face="微软雅黑" size="3">import asyncio

    2. from pyppeteer import launch

    3. from lxml import etree



    4. async def main():

    5. browser = await launch()

    6. page = await browser.newPage()

    7. await page.goto('https://movie.douban.com/chart')

    8. await page.waitForXPath('//table//a[@title]')

    9. doc = etree.HTML(await page.content())

    10. names = [element.attrib['title'] for element in doc.xpath('//table//a[@title]')]

    11. print('Names:', names)

    12. await browser.close()



    13. asyncio.get_event_loop().run_until_complete(main())</font>
    复制代码




    这段代码的大体意思是访问网站,然后等待特定节点加载出来,再通过 xpath 从网页源码中解析出电影名并输出,最后关闭 Pyppeteer。
    Pyppeteer 还有很多其他的优势。例如,它在执行效率方面得到了大幅提升,因为它是基于 asyncio 构建的,所有属性和方法几乎都是 coroutine 对象,在构建异步程序的时候非常方便,天生就支持异步运行。
    在进行基金爬取实战中,对比顺序执行和异步执行的效率,异步执行要快很多。例如,顺序执行获取 50 支基金近 20 个交易日的净值数据用时为 12.08 秒,而异步执行仅用时 2.18 秒,快了 6 倍。如果需要爬取的工作量比较大,异步执行的优势会更加明显。
    总之,Pyppeteer 作为超越 Selenium 的自动化爬虫神器之一,以其简洁的语法、自动的环境配置和高效的异步执行能力,为开发者提供了更多的选择。
    七、总结与展望
    (一)总结
    DrissionPage 作为一款超越 Selenium 的自动化爬虫神器,具有众多显著的特点和优势。
    在语法设计方面,简洁明了,对新手友好,大大降低了学习成本。其高效稳定的性能表现,如快速的运行速度、内置的等待和自动重试功能,使得程序在面对不稳定网络时更加稳定可靠。多浏览器支持以及强大的跨平台能力,为开发者提供了更多的选择和便利。在元素定位与操作、表单操作与文件上传、页面导航与跳转以及 JavaScript 执行等方面,DrissionPage 提供了丰富的方法和便捷的 API,使得开发者能够高效地完成各种网页自动化任务。
    在应用场景方面,无论是网页自动化测试、数据抓取还是网页动态数据抓取,DrissionPage 都能发挥出强大的作用。它能够模拟用户在网页上的各种操作,快速准确地验证网页功能;可以根据不同需求选择最合适的方式进行数据抓取,确保获取完整的页面数据;在处理动态网页数据抓取时,能够有效地等待页面加载完成并抓取数据。
    (二)展望
    随着互联网技术的不断发展,网页自动化和数据抓取的需求将持续增长。DrissionPage 在未来有着广阔的发展前景。
    一方面,DrissionPage 可以不断优化和扩展其功能。例如,进一步提高运行速度和稳定性,增强对更多复杂网页的兼容性,增加更多的元素定位和操作方法,以及提供更强大的表单操作和文件上传功能。同时,可以加强与其他工具和框架的集成,为开发者提供更加全面的解决方案。
    另一方面,DrissionPage 可以持续改进其用户体验。优化官方文档和学习资源,提供更多的实战案例和教程,帮助开发者更快地掌握和使用该工具。加强社区建设,鼓励开发者之间的交流和分享,共同推动 DrissionPage 的发展。
    总之,DrissionPage 以其独特的优势和不断创新的精神,将在网页自动化和数据抓取领域继续发挥重要作用,为开发者带来更多的惊喜和便利。


    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-20 10:49 , Processed in 0.080353 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表