DrissionPage教程
DrissionPage教程
- 官网示例(示例有坑,需要修改一下)
# 导入
from DrissionPage import Chromium
# 连接浏览器
browser = Chromium()
# 获取标签页对象
tab = browser.latest_tab
# 访问网页
tab.get('https://www.baidu.com')
# 获取文本框元素对象
ele = tab.ele('#kw')
# 向文本框元素对象输入文本
ele.input('DrissionPage')
# 百度更新了网页元素,所以这里会报错
# tab('#su').click() 
# 智能等待
# search_btn = tab.wait.ele_displayed('#chat-submit-button', timeout=5)
# search_btn.click()
# 点击按钮开始搜索
tab('#chat-submit-button').click()
# 获取所有<h3>元素
links = tab.eles('tag:h3')
# 遍历并打印结果
for link in links:
    print(link.text)
- 智能等待版
# # 导入
# from DrissionPage import Chromium
#
# # 连接浏览器
# browser = Chromium()
# # 获取标签页对象
# tab = browser.latest_tab
# # 访问网页
# tab.get('https://www.baidu.com')
# # 获取文本框元素对象
# ele = tab.ele('#kw')
# # 向文本框元素对象输入文本
# ele.input('DrissionPage')
# tab('#chat-submit-button').click()
# # 获取所有<h3>元素
# links = tab.eles('tag:h3')
# # 遍历并打印结果
# for link in links:
#     print(link.text)
from DrissionPage import Chromium
# 连接浏览器
browser = Chromium()
try:
    # 获取标签页对象
    tab = browser.latest_tab
    # 访问百度首页
    tab.get('https://www.baidu.com')
    # 等待搜索框加载完成
    search_box = tab.wait.ele_displayed('#kw', timeout=10)
    search_box.input('DrissionPage')
    # 点击搜索按钮
    search_btn = tab.wait.ele_displayed('#chat-submit-button', timeout=5)
    search_btn.click()
    # 等待搜索结果加载完成 - 使用智能等待
    # 方法1: 等待特定元素出现
    tab.wait.ele_displayed('#content_left', timeout=10)
    # 获取搜索结果标题
    results = tab.eles('tag:h3')
    print("搜索结果:")
    print("-" * 40)
    # 遍历并打印结果
    for i, result in enumerate(results, 1):
        print(f"{i}. {result.text}")
finally:
    # 关闭浏览器
    browser.quit()
操作浏览器的基本逻辑如下:
- 创建浏览器对象,用于启动或接管浏览器
- 获取一个 Tab 对象
- 使用 Tab 对象访问网址
- 使用 Tab 对象获取标签页内需要的元素对象
- 使用元素对象进行交互
- 其他操作: 如执行 js 代码、监听网络数据、下载文件等等
- 全局配置
# 置了浏览器的重试次数为 5 次,当浏览器操作(如元素查找、点击等)失败时,会自动重试
browser.set.retry_times(5)
- 标签页对象:默认情况下,每个标签页只有一个 Tab 对象,关闭单例模式后可用多个 Tab 对象同时控制一个标签页
from DrissionPage import Chromium
browser = Chromium()
tab1 = browser.latest_tab  # 获取最后激活的标签页对象
tab1.get('http://DrissionPage.cn')  # 标签页访问一个网址
tab2 = browser.new_tab('https://www.baidu.com')  # 新建一个标签页并访问网址
tab3 = browser.get_tab(title='DrissionPage')  # 按条件获取标签页对象
- 元素对象:可从- Tab 对象获取,也可从另一个元素对象通过- 内部查找或- 相对定位的方式获取
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('http://DrissionPage.cn')
# ele()方法,用于在其内部查找指定元素
ele1 = tab.ele('text=文档')
ele2 = ele1.next()  # 获取ele1的后一个元素
ele1.click()  # 点击该元素
ele2.click()  # 点击该元素
浏览器对象Chromium
- 它可以接管已打开的浏览器,也可以启动新的浏览器
- 注意事项: 每个浏览器只能有一个Chromium对象(同一进程中)。对同一个浏览器重复使用Chromium()获取的都是同一个对象
- 实例演示
from DrissionPage import Chromium
browser = Chromium()
from DrissionPage import Chromium
browser = Chromium(9333)  # 接管9333端口的浏览器,如该端口空闲,启动一个浏览器
browser = Chromium('127.0.0.1:9333')  # 与上一行一样
browser = Chromium('ws://127.0.0.1:8987/devtools/browser/3e590fc5-4587-47e1-8756-cf6784f2fef3')  # 指定ws连接
- 如果需要手动打开浏览器再接管,可以这样做:
- 右键点击浏览器图标,选择属性
- 在“目标”路径后面加上--remote-debugging-port=端口号(注意最前面有个空格)
- 点击确定
- 在程序中的浏览器配置中指定接管该端口浏览器
文件快捷方式的目标路径设置:
"D:\chrome.exe" --remote-debugging-port=9333
程序代码:
from DrissionPage import Chromium
browser = Chromium(9333)
使用多例
默认情况下,Tab 对象是单例的,即一个标签页只有一个对象,即使重复使用get_tab(),获取的都是同一个对象。
这主要是防止新手不理解机制,反复创建多个连接导致资源耗费。
实际上允许多个 Tab 对象同时操作一个标签页,每个负责不同的工作。比如一个执行主逻辑流程,另外的监视页面,处理各种弹窗。
要允许多例,可用Settings设置:
from DrissionPage.common import Settings
Settings.set_singleton_tab_obj(False)
示例
from DrissionPage import Chromium
from DrissionPage.common import Settings
browser = Chromium()
browser.new_tab()
browser.new_tab()
# 未启用多例:
tab1 = browser.get_tab(1)
tab2 = browser.get_tab(1)
print(id(tab1), id(tab2))
# 启用多例:
Settings.set_singleton_tab_obj(False)
tab1 = browser.get_tab(1)
tab2 = browser.get_tab(1)
print(id(tab1), id(tab2))
输出:
2347582903056 2347582903056
2347588741840 2347588877712
可见第一次输出两个 Tab 对象是同一个,第二次输出是独立的。
常见的浏览器配置项
from DrissionPage import Chromium,ChromiumOptions
co = ChromiumOptions()
co = co.set_browser_path(r'C:\Users\wcw.ACLAS\AppData\Local\Google\Chrome\Application\chrome.exe')
# co.headless()
# co.set_argument('--window-size=1920,1080')
co.set_argument('--start-maximized')
# 不加载图片
# co.no_imgs(True).mute(True)
# 无痕模式
# co.incognito()
# 设置端口,可以启动多个浏览器
# co.set_local_port(9666)
co.set_local_port(9667)
browser = Chromium(addr_or_opts=co)
tab = browser.latest_tab
tab.get('https://www.baidu.com')
print(tab.html)
# browser.quit()
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号