在Python的网络自动化测试领域,Selenium曾是当之无愧的明星工具,以模拟浏览器操作闻名,广泛应用于UI自动化测试场景。它通过驱动浏览器模拟真实用户操作,能精准测试网页功能的交互逻辑,在验证网页元素可见性、点击事件响应等方面表现出色。但随着技术演进,面对大规模自动化测试任务时,Selenium启动浏览器带来的资源消耗和执行效率问题逐渐凸显。
此时,nodriver工具包凭借独特优势崭露头角。这款无需浏览器驱动即可实现高效网络交互的工具包,为自动化测试带来了全新思路。nodriver无需加载整个浏览器环境,以轻量、快速的特性,能够直接模拟HTTP/HTTPS请求,极大提升测试效率,减少资源占用,提供了更灵活、高效的自动化测试解决方案。
nodriver通过相对简洁的界面,提供了更高级别的网页抓取和浏览器自动化功能。它是Python包Undetected-Chromedriver的官方继任者。无需再使用webdriver,也无需再使用selenium。
直接通信能更好地抵御Web应用防火墙(WAF),同时性能也能得到极大提升。与undetected-chromedriver不同,该模块是完全异步的。
nodriver与其他知名包的不同之处在于,它经过优化,能够避开大多数反机器人解决方案的检测。
另一个重点是易用性和快速原型开发,因此很多功能都能“即开即用”,大多数方法参数都设有最佳实践默认值。只需1到2行代码,就能启动运行,并默认提供最佳实践配置。它会在之后清理创建的文件(配置文件)。
已知可兼容以下浏览器:Chromium、Chrome、Edge、Brave
功能特性:
无需chromedriver二进制文件或Selenium依赖。
一行代码即可启动运行。
每次运行使用全新配置文件,退出时自动清理。
将Cookie保存到文件并加载,避免重复繁琐的登录步骤。
智能高效的元素查找功能,支持通过选择器或文本查找,包括iframe内容。这也可用作元素出现的等待条件,因为它会在超时前持续重试查找。因此,await tab.select('body')可作为页面是否加载完成的判断依据。find方法通过文本查找,但不会简单返回第一个匹配元素,而是根据文本长度最接近的候选元素进行匹配(最短的优先),这使得像tab.find('accept all')这样的查找能返回实际的Cookie按钮,而非页眉中的脚本。
可连接到正在运行的Chrome调试会话。
元素的描述性__repr__,以HTML形式呈现元素。
实用函数,可将运行中的undetected_chromedriver.Chrome实例转换为nodriver.Browser实例并继续操作。
内置大量辅助工具和实用方法,适用于大多数常用及重要操作。
安装:
由于它是undetected-chromedriver的一部分,安装方式为:
pip install undetected-chromedriver
或者通过以下方式作为一个单独的包:
pip install nodriver
Github地址:
https://github.com/UltrafunkAmsterdam/nodriver
1、简单示例:
import nodriver as uc
async def main():
browser = await uc.start()
page = await browser.get('https://www.nowsecure.nl')
# ... 更多代码 ...
if __name__ == '__main__':
uc.loop().run_until_complete(main())
2、完整示例:
import nodriver
asyncdef main():
browser = await nodriver.start()
page = await browser.get('https://www.nowsecure.nl')
await page.save_screenshot()
await page.get_content()
await page.scroll_down(150)
elems = await page.select_all('*[src]')
for elem in elems:
await elem.flash()
page2 = await browser.get('https://baidu.com', new_tab=True)
page3 = await browser.get('https://ultrafunkamsterdam.github.io/nodriver/index', new_window=True)
for p in (page, page2, page3):
await p.bring_to_front()
await p.scroll_down(200)
await p
await p.reload()
if p != page3:
await p.close()
if __name__ == '__main__':
nodriver.loop().run_until_complete(main())
扫码关注
获取更多精彩
alltests

