+
86
-

回答

这是一个playwright自动打开一个新闻网站后台,输入内容的示例代码:

from playwright.sync_api import sync_playwright, expect
import time
import platform # 用于判断操作系统

def get_dom_and_paste(url: str, target_selector: str, text_to_paste: str):
    """
    打开网页,获取 DOM,并在指定元素中模拟粘贴操作。

    Args:
        url: 目标网页 URL。
        target_selector: 要粘贴内容的目标元素的 CSS 选择器。
        text_to_paste: 要模拟粘贴的文本。
    """
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        # 重要:授予浏览器访问剪贴板的权限
        context = browser.new_context(permissions=["clipboard-read", "clipboard-write"])
        page = context.new_page()

        try:
            print(f"正在导航到: {url}")
            page.goto(url, wait_until='domcontentloaded')
            print("页面加载完成。")

            # --- 1. 获取 DOM 树结构 ---
            print("\n--- 获取页面 DOM 结构 ---")
            dom_content = page.content()
            print("DOM 结构 (前 500 字符):")
            print(dom_content[:500] + "...")
            # 你可以将 dom_content 保存到文件或进行进一步分析
            # with open("page_dom.html", "w", encoding="utf-8") as f:
            #     f.write(dom_content)
            # print("完整的 DOM 结构已保存到 page_dom.html")

            # --- 2. 模拟粘贴操作 ---
            print(f"\n--- 在元素 '{target_selector}' 中模拟粘贴 ---")

            # 定位目标元素
            target_element = page.locator(target_selector)
            
            # 确保元素可见且可用
            print("等待目标元素可见...")
            target_element.wait_for(state="visible", timeout=10000)
            expect(target_element).to_be_editable() # 确保是可编辑元素
            print("目标元素已找到且可编辑。")

            # 聚焦到目标元素
            print("聚焦目标元素...")
            target_element.focus()
            time.sleep(0.5) # 短暂等待确保焦点生效

            # 将指定文本写入浏览器剪贴板
            print(f"将文本 '{text_to_paste}' 写入浏览器剪贴板...")
            # 使用 page.evaluate 在页面上下文中执行 JS
            page.evaluate(f"navigator.clipboard.writeText('{text_to_paste}')")
            print("文本已写入剪贴板。")
            time.sleep(0.5) # 等待剪贴板操作完成

            # 判断操作系统以使用正确的快捷键
            paste_key = "Control" if platform.system() != "Darwin" else "Meta"
            
            # 模拟粘贴快捷键
            print(f"模拟按下 {paste_key}+V ...")
            page.keyboard.press(f"{paste_key}+V")
            print("粘贴操作已模拟。")

            # 验证粘贴结果
            print("验证粘贴结果...")
            # 使用 expect 断言输入框的值是否符合预期
            expect(target_element).to_have_value(text_to_paste)
            print(f"验证成功:元素的值现在是 '{text_to_paste}'")

            time.sleep(3) # 暂停查看结果

        except Exception as e:
            print(f"在处理页面时发生错误: {e}")
            page.screenshot(path="paste_error.png")
            print("已保存错误截图到 paste_error.png")
            import traceback
            traceback.print_exc()

        finally:
            print("关闭浏览器...")
            context.close() # 关闭带有权限的上下文
            browser.close()

# --- 主程序 ---
if __name__ == "__main__":
    # --- 配置 ---
    # 替换为你要测试的网页 URL
    # 可以使用一个简单的在线文本编辑器或你自己的测试页面
    test_url = "https://www.rapidtables.com/tools/notepad.html" 
    # 替换为目标输入框的 CSS 选择器
    # 对于上面的 rapidtables 记事本,是 #area 文本域
    input_selector = "#area" 
    text = "这是通过 Playwright 粘贴的文本!"
    # --- 执行 ---
    get_dom_and_paste(test_url, input_selector, text)

网友回复

我知道答案,我要回答